TCP四次挥手的秘密

先上一张经典图:

连接时将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详解卷一:协议》

就是要你懂 TCP

请保持高冷,别点赞。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值