TCP的三次握手与四次挥手

TCP的三次握手与四次挥手

TCP(Transmission Control Protocol)是面向连接的协议,数据传输前需要建立连接(三次握手),数据传输完成后需要断开连接(四次挥手)。这两个过程的主要目的是确保数据可靠传输。


1. TCP三次握手(Three-Way Handshake)

作用:建立可靠的TCP连接,确保通信双方都具备发送和接收数据的能力,并同步初始序列号(ISN, Initial Sequence Number)。

三次握手过程

假设客户端(Client)与服务器(Server)通信:

  1. 第一次握手(Client → Server)

    • 客户端向服务器发送SYN(同步)报文,表示请求建立连接,并携带一个初始序列号 ISN(c)
    • 报文格式
      SYN=1, Seq=X(X为ISN(c))
      
    • 发送后,客户端进入 SYN_SENT 状态。
  2. 第二次握手(Server → Client)

    • 服务器收到 SYN 请求后,返回一个 SYN-ACK(SYN + ACK)报文:
      • SYN=1,表示同意建立连接。
      • ACK=1,表示确认收到客户端的 SYN。
      • Seq=Y(服务器的初始序列号 ISN(s))
      • Ack=X+1,确认收到客户端的 ISN。
    • 报文格式
      SYN=1, ACK=1, Seq=Y, Ack=X+1
      
    • 服务器进入 SYN_RECEIVED 状态。
  3. 第三次握手(Client → Server)

    • 客户端收到服务器的 SYN-ACK 后,发送 ACK 报文,表示连接建立完成:
      • ACK=1,确认服务器的 SYN。
      • Seq=X+1(顺延)。
      • Ack=Y+1(确认收到服务器的 ISN)。
    • 报文格式
      ACK=1, Seq=X+1, Ack=Y+1
      
    • 发送后,客户端进入 ESTABLISHED(已建立) 状态,服务器收到此ACK后,也进入 ESTABLISHED 状态,通信正式开始。

三次握手示意图

Client                          Server
   | SYN=X -------------------->  |
   |                             |
   | <-------------------- SYN=Y, ACK=X+1 |
   |                             |
   | ACK=Y+1 ------------------>  |
   |                             |
[连接建立]

2. 为什么需要三次握手?

  • 防止已失效的连接请求重新被服务器接受
    如果使用 两次握手,可能会出现旧的连接请求被服务器误接收,导致错误的数据传输。

例如:

  1. 客户端发送 SYN 请求,但由于网络延迟,该请求未及时到达服务器。
  2. 客户端以为服务器未响应,便重新发起连接请求并成功建立连接。
  3. 旧的 SYN 报文迟迟到达服务器,若服务器直接回应 ACK,则可能导致服务器建立错误的连接。

三次握手的第三步 确保了客户端确认连接的有效性,防止了这种情况。


3. TCP四次挥手(Four-Way Handshake)

作用:确保双方数据传输完成后,安全释放连接,避免出现数据丢失

四次挥手过程

假设客户端(Client)要关闭连接:

  1. 第一次挥手(Client → Server)

    • 客户端向服务器发送 FIN(Finish) 报文,表示数据发送完毕,希望关闭连接。
    • 报文格式
      FIN=1, Seq=U
      
    • 发送后,客户端进入 FIN_WAIT_1 状态。
  2. 第二次挥手(Server → Client)

    • 服务器收到 FIN 后,返回 ACK 报文:
      • ACK=1,确认收到客户端的 FIN。
      • Ack=U+1
    • 报文格式
      ACK=1, Seq=V, Ack=U+1
      
    • 服务器进入 CLOSE_WAIT 状态,等待处理剩余业务,客户端进入 FIN_WAIT_2 状态。
  3. 第三次挥手(Server → Client)

    • 服务器处理完所有任务后,发送 FIN 报文,通知客户端可以关闭连接:
      • FIN=1,表示服务器不再发送数据。
      • Seq=V
    • 报文格式
      FIN=1, Seq=V
      
    • 服务器进入 LAST_ACK 状态。
  4. 第四次挥手(Client → Server)

    • 客户端收到 FIN 后,返回 ACK 报文,表示确认:
      • ACK=1,确认收到服务器的 FIN。
      • Ack=V+1
    • 报文格式
      ACK=1, Seq=U+1, Ack=V+1
      
    • 客户端进入 TIME_WAIT 状态,等待一段时间(通常是2MSL,最大报文存活时间),确保服务器收到了 ACK,随后进入 CLOSED 状态。
    • 服务器收到 ACK 后,直接进入 CLOSED 状态,连接完全关闭。

四次挥手示意图

Client                          Server
   | FIN=U -------------------->  |
   |                             |
   | <-------------------- ACK=U+1 |
   |                             |
   | (服务器等待处理完剩余数据)    |
   | FIN=V -------------------->  |
   |                             |
   | <-------------------- ACK=V+1 |
   |                             |
[连接关闭]

4. 为什么挥手需要四次?

  1. TCP是全双工通信,必须双方都同意关闭

    • 三次握手时,双方都发送了 SYN,表示都愿意通信,可以合并ACK和SYN一起发送。
    • 四次挥手时,服务器收到 FIN 后,可能还有未发送完的数据,因此需要先发送 ACK 确认,然后再发送 FIN 关闭连接,因而需要额外的一次挥手
  2. TIME_WAIT 状态的必要性

    • TIME_WAIT 主要是为了防止旧数据包的影响,确保服务器正确关闭连接。如果直接关闭,可能会导致服务器错误地接受过期数据。

5. 总结

过程三次握手四次挥手
目的建立连接断开连接
报文数3 个4 个
状态SYN_SENT、SYN_RECEIVED、ESTABLISHEDFIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、LAST_ACK、TIME_WAIT
特殊状态-TIME_WAIT(确保旧数据不会干扰新连接)
原因防止旧 SYN 报文造成误连接服务器可能还有未处理的数据,需分两步释放

总结一句话:

  • 三次握手 保证可靠连接建立,防止旧连接误触发;
  • 四次挥手 确保数据完整发送,保证双方安全关闭连接。

这些机制确保了TCP的可靠性,使其适用于要求高稳定性的网络通信场景,如HTTP、FTP、SSH等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值