先上一张经典图:
连接时将ACK和SYN同时发送,断开时先发送ACK再发送FIN。这就是为什么常说连接时3次,断开时4次。
那么就有个问题,为什么断开时要将ACK和FIN分发?而不是一起发?难道是命运的安排?
《TCP/IP详解卷一:协议》中给出的解释是:
“这由T C P的半关闭(half-close)造成的。”
那么半关闭是什么意思:
“TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。这就是所谓的半关闭。”
半关闭的例子:
客户端发送FIN后,表示他结束了数据的发送(这里的数据指复杂数据,标志位、信号位比如图中data的ACK等可以发送),但不代表不能接受数据。
所以客户端依旧能接收服务端发来的data并且返回一个标志位ACK,告诉服务端我已经接受到你的数据。
在这之后,服务端想要结束连接,于是他发送了FIN。
之所以FIN延迟发送,是因为服务端还有数据没有处理完,当服务端处理完数据后他再关闭。
就比如一通电话:
1、(你没话说了)“我要挂了”
2、(对方意犹未尽)“那微信聊”
3、(你一脸高冷)“行”
4、(对方小开心)“好的,微信见,挂啦。”
继续回到我们的问题,TCP的断开不能是3次吗?
任何程序的设计,只有更好的方案,没有绝对的方案。
对于大部分的场景,4次握手断开连接是友好的方案。但你真的想3次断开,也是可以的。
模拟4次挥手:
四个红框表示断开连接的四次挥手:
1、 client发送FIN
2、 server回复ACK
3、 server发送FIN
4、 client回复ACK
模拟3次挥手:
1、 client发送FIN
2、 server回复ACK+FIN
3、 client回复ACK
总结:四次挥手很有必要,保证了通讯的可靠,数据的完整性。可以三次挥手,但是没必要。
参考资料:
《TCP/IP详解卷一:协议》
《》
请保持高冷,别点赞。