Administrator
Published on 2025-03-12 / 79 Visits
14
0

TCP 三次握手详解

图标
文章摘要
LIK.CC-GPT

客户端首先发送一个SYN(同步序列编号)消息给服务器,服务器收到后回复一个SYN-ACK(同步序列编号-确认)消息,最后客户端再发送一个ACK(确认)消息确认服务器已经收到SYN-ACK消息,从而完成三次握手,建立起一个可靠的TCP连接。 客户端(Client)


客户端首先发送一个SYN(同步序列编号)消息给服务器,服务器收到后回复一个SYN-ACK(同步序列编号-确认)消息,最后客户端再发送一个ACK(确认)消息确认服务器已经收到SYN-ACK消息,从而完成三次握手,建立起一个可靠的TCP连接。

客户端(Client)                            服务器(Server)
    |                                         |
    |  (1) SYN(seq=x)                        |
    | --------------------------------------> |
    |                                         |
    |  (2) SYN-ACK(seq=y, ack=x+1)           |
    | <-------------------------------------- |
    |                                         |
    |  (3) ACK(ack=y+1)                      |
    | --------------------------------------> |
    |                                         |
    |            连接建立完成!                  |
    | (ESTABLISHED)                      (ESTABLISHED)

TCP的三次握手是建立可靠网络连接的关键过程,确保通信双方具备数据收发能力并同步初始序列号。以下是详细分步说明:

三次握手流程

  1. 第一次握手(SYN)

    • 动作:客户端发送SYN报文(SYN=1,seq=x),进入SYN_SENT状态。
    • 目的:向服务器发起连接请求,并告知初始序列号x
  2. 第二次握手(SYN-ACK)

    • 动作:服务器收到SYN后,回复SYN-ACK报文(SYN=1,ACK=1,seq=y,ack=x+1),进入SYN_RCVD状态。
    • 目的
      • 确认客户端的SYN(通过ack=x+1);
      • 告知自身初始序列号y
  3. 第三次握手(ACK)

    • 动作:客户端发送ACK报文(ACK=1,seq=x+1,ack=y+1),进入ESTABLISHED状态;服务器收到后也进入ESTABLISHED状态。
    • 目的:确认服务器的SYN-ACK,完成双向连接建立。

为什么需要三次握手?

  1. 防止历史连接干扰

    • 若客户端因网络延迟重发了SYN,旧的SYN可能稍后到达服务器。三次握手机制允许客户端通过第三次ACK判断是否接受旧连接,避免资源浪费。
  2. 同步双方序列号

    • 双方通过三次交互确认彼此的初始序列号(xy),为后续可靠传输奠定基础。
  3. 避免资源浪费

    • 两次握手可能导致服务器在未确认客户端状态时提前分配资源,引发“半开连接”问题。

常见问题

  • 如果第三次ACK丢失怎么办?
    服务器会重传SYN-ACK,直到超时关闭连接。若客户端随后发送数据,服务器会通过数据包中的ACK字段确认连接有效。

  • SYN洪泛攻击
    攻击者伪造大量SYN但不回复ACK,耗尽服务器资源。防御手段包括SYN Cookies(延迟资源分配直至第三次握手完成)。


总结

三次握手通过两次序列号确认双向能力验证,确保了TCP连接的可靠性与一致性。这一机制是TCP“面向连接”特性的核心基础,解决了网络延迟、丢包和重复报文等潜在问题。


Comment