tcp知识整理

三次握手过程

  • 第一次握手 客户端发送建立链接请求报文SYN携带(SYN = 1,seq = x)后,进入SYN_SENT状态。
  • 第二次握手 服务端接收到SYN报文后回复SYN+ACK报文携带(ACK=x+1,SYN=1,seq=y),进入SYN_RECV状态。
  • 第三次握手 客户端收到SYN+ACK报文后回复ACK报文携带(ACK=y+1,SYN=1)。

为什么需要三次握手

  1. 确保双方读写都正常
    第一次确定客户端发送正常,第二次确定服务端发送和接送正常,第三次确定客户端接收正常。

  2. 同步双方初始序列号
    序列号可以保证消息的发送是有序的。

四次挥手过程

  • 第一次挥手 主动断开方发送FIN报文,进入FIN_WAIT_1状态。
  • 第二次挥手 被动断开方接收FIN报文后,回复ACK报文,进入CLOSE_WAIT状态。主动断开方接送ACK报文后进入FIN_WAIT_2状态。
  • 第三次挥手 被动断开方发送FIN报文后,进入LASTACK状态。
  • 第四次挥手 主动断开方发送ACK报文后进入TIME_WAIT状态,等待2MLS后进入closed阶段,被动端口方接收后进入closed阶段。

MLS表示报文在网络中最大存活时间,1MLS等于2分钟

为什么需要四次挥手

因为tcp是全双工的,双方能同时发送,接收消息。
所以客户端第一次挥手发送FIN只能确定客户端没有数据发送了,服务端可能还有数据发送给客户端。所以需要服务器接收到FIN之后回复ACK,等服务端没有数据要发送时,再发送FIN给客户端来表示可以关闭。

为什么要进入time_wait状态

为了响应服务端重发FIN报文,回复的ACK报文可能丢失,避免服务端重发FIN报文影响新连接。


tcp知识整理
https://huahua132.github.io/2023/05/14/socket/tcp/
作者
huahua132
发布于
2023年5月14日
许可协议