Skip to main content

为什么TCP协议是三次握手和四次挥手呢?

TCP协议建立连接(三次握手)断开连接(四次挥手)

首先了解这几个术语:

  • SYN 代表同步位 SYN=1表示进行一个连接请求
  • ACK 代表确认位 ACK=1表示确认有效 ACK=0表示确认无效
  • ack 代表确认号 对方发送序号加1
  • seq 代表序号

建立连接(3次)

  • 客户端A服务端B发起一个请求可记为SYN=1seq=x,其中x序号是客户端随机生成的。
  • 服务端B 收到请求后需要向 客户端A 发起一个响应可记为SYN=1ACK=1ack=x+1seq=y,其中y序号是服务端随机生成的。
  • 客户端A 收到响应后,需要再给 服务端B 发起一个响应可记为ACK=1ack=y+1seq=x+1

完成以上三次握手,双方即可进行数据传送。

断开连接(4次)

  • 客户端A服务端B发起一个请求可记为FIN=1seq=u,其中u序号是客户端随机生成的。
  • 服务端B 收到请求后需要向 客户端A 发起一个响应可记为ACK=1ack=u+1seq=v,其中v序号是服务端随机生成的。(此时服务端处于半关闭状态,还可以继续向客户端发送数据)
  • (当服务端B向客户端A发送数据完毕之后)服务端B 会继续向 客户端A 发起一个响应可记为FIN=1ACK=1ack=u+1seq=w
  • 客户端A 收到响应后,需要再给 服务端B 发起一个响应可记为ACK=1ack=w+1seq=v+1

客户端要保证第四个数据包能被服务器收到,怎么保证呢?就是通过等待 2MSL(MSL表示一个报文的最大生存时间) ,第四个包传递到服务器需要 1 MSL,如果中间丢失了,服务器就会再发送第五个数据包去让客户端重新发第四个包,这第五个包传递到客户端又需要 1MSL 时间。所以客户端为了确保第四个数据包能被服务器收到,就要等待 2MSL 时间。