TCP的三次握手和四次挥手

TCP的三次握手和四次挥手
最新回答
苦笑

2026-01-21 17:31:34

TCP的三次握手用于建立稳定的连接通道,四次挥手用于安全断开连接。以下是具体分析:

TCP的三次握手

目的:建立稳定的传输通道,确保客户端和服务端都能正常收发数据。

步骤:

  • 第一次握手:客户端发送SYN=1和seq序号给服务端,状态变为SYN-SEND。

  • 第二次握手:服务端返回ACK=1(确认序号x+1)、自身seq序号y和SYN=1,状态变为SYN-REVD。
  • 第三次握手:客户端发送ACK=1(确认序号y+1)和新的seq序号x+1,状态变为ESTABLISHED;服务端收到后状态也变为ESTABLISHED,连接建立。

简要流程:

  1. 客户端 → SYN → 服务端
  2. 客户端 ← SYN+ACK ← 服务端
  3. 客户端 → ACK → 服务端

为什么不是两次或四次:

  • 两次握手:服务端无法确认客户端是否收到ACK,可能导致数据传输不稳定。
  • 四次握手:服务端根据客户端的ACK再回复一次ACK无实际意义,浪费资源。三次握手既能保证可靠性,又能提高效率。
TCP的四次挥手

目的:安全断开连接,确保双方数据传输完成。

步骤:

  • 第一次挥手:客户端发送FIN=1和seq序号u,状态变为FIN-WAIT1。

  • 第二次挥手:服务端返回ACK=1(确认序号u+1)和新的seq序号v,状态变为CLOSE-WAIT;客户端收到后状态变为FIN-WAIT2。
  • 第三次挥手:服务端处理完剩余数据后,发送FIN=1、ACK=1(确认序号u+1)和新的seq序号w,状态变为LAST-ACK。
  • 第四次挥手:客户端返回ACK=1(确认序号w+1)和新的seq序号u+1,状态变为TIME-WAIT,持续2MSL后变为CLOSED;服务端收到后状态也变为CLOSED。

简要流程:

  1. 客户端 → FIN → 服务端
  2. 客户端 ← ACK ← 服务端
  3. 客户端 ← FIN ← 服务端
  4. 客户端 → ACK → 服务端

为什么需要多一步(步骤2):服务端收到FIN时,可能还有未处理完的数据或资源需要释放,不能直接关闭连接。此时先回复ACK告知客户端“已收到断开请求,请稍候”,待处理完所有事务后再发送FIN确认断开。

为什么客户端最后要等待2MSL:

  • 确保ACK到达服务端:若客户端的最后一个ACK丢失,服务端会重传FIN,客户端在2MSL内收到重传报文后会重新响应并重启计时器。
  • 清除旧连接报文:2MSL时间内,本连接的所有报文段会从网络中消失,避免新连接受到旧连接失效报文的干扰。
面试题总结:TCP为什么是3次握手,4次挥手?
  • 三次握手:

    客户端发送SYN请求建立连接。

    服务端回复SYN+ACK确认建立连接。

    客户端发送ACK确认连接建立。原因:两次无法保证服务端确认客户端接收能力,四次则浪费资源。三次握手既能验证双方收发能力,又能提高效率。

  • 四次挥手:

    客户端发送FIN请求断开连接。

    服务端回复ACK确认收到断开请求。

    服务端处理完事务后发送FIN确认断开。

    客户端回复ACK确认断开。原因:服务端收到FIN时可能还有未完成的操作,需先回复ACK避免客户端长时间等待,待处理完后再发送FIN确认断开。四次挥手确保双方数据传输完成,连接安全关闭。