博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP四次挥手的秘密
阅读量:6636 次
发布时间:2019-06-25

本文共 802 字,大约阅读时间需要 2 分钟。

先上一张经典图:

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

《》

请保持高冷,别点赞。

转载地址:http://kxsvo.baihongyu.com/

你可能感兴趣的文章
R语言使用马尔可夫链Markov Chain, MC来模拟抵押违约
查看>>
时间戳
查看>>
和为S的连续正数序列
查看>>
javascript 事件的两种绑定方法
查看>>
Git 代码撤销、回滚到任意版本(当误提代码到本地或master分支时)
查看>>
sort
查看>>
应用HTMLTestRunner整合测试报告
查看>>
WebApi 文件上传
查看>>
C++—模板(1)模板与函数模板
查看>>
OAuth2.0认证介绍
查看>>
unity3d与web网页通信
查看>>
【转载】Secure WCF RESTful service using OAUTH
查看>>
jquery插件的写法
查看>>
Tomcat--startup.bat文件
查看>>
day45-python实例练习
查看>>
三、Redis操作
查看>>
解决jenkins下使用HTML Publisher插件后查看html报告显示不正常
查看>>
使用mvc3实现ajax跨域
查看>>
CentOS安装配置Samba
查看>>
ISCSI测试
查看>>