KonishiLee's Blog

TCP 握手验证

第一次

客户端发送一个 TCP,标志位为 SYN,序号为 0,表示客户端请求建立链接。

第二次

服务端发送确认包,标志位为 SYN,ACK。将确认序号(Acknowledgement Number)设置为 0 + 1 = 1。

第三次

客户端再次发送确认包(ACK),SYN 标志位为 0,ACK 标志位为 1,并把服务端发来的 ACK 序号字段 + 1,放在确定字号中发送给对方。

问题

1.为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN + ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉 Client 端,”你发的 FIN 报文我收到了”。只有等到我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四步握手。

2.为什么 TIME_WAIT 状态需要经过 2MSL (最大报文段生存时间) 才能返回到 CLOSE 状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入 CLOSE 状态了,但是我们必须假象网络是不可靠的,有可以最后一个 ACK 丢失。所以 TIME_WAIT 状态就是用来重发可能丢失的 ACK 报文。

如果喜欢这个分享,就帮忙买杯咖啡吧