博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么TCP协议终止链接要四次?
阅读量:5167 次
发布时间:2019-06-13

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

为什么TCP协议终止链接要四次?

1、当主机A确认发送完数据且知道B已经接受完了,想要关闭发送数据口(当然确认信号还是可以发),就会发FIN给主机B。

2、主机B收到A发送的FIN,表示收到了,就会发送ACK回复。

3、但这是B可能还在发送数据,没有想要关闭数据口的意思,所以FIN与ACK不是同时发送的,而是等到B数据发送完了,才会发送FIN给主机A。

4、A收到B发来的FIN,知道B的数据也发送完了,回复ACK, A等待2MSL以后,没有收到B传来的任何消息,知道B已经收到自己的ACK了,A就关闭链接,B也关闭链接了。

733708-20180316094325693-344489308.png

A为什么等待2MSL,从TIME_WAIT到CLOSE?

在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

三次握手,四次挥手的形象解释:

三次握手:

A:“喂,你听得到吗?”A->SYN_SEND

B:“我听得到呀,你听得到我吗?”应答与请求同时发出 B->SYN_RCVD | A->ESTABLISHED

A:“我能听到你,今天balabala……”B->ESTABLISHED

四次挥手:

A:“喂,我不说了。”A->FIN_WAIT1

B:“我知道了。等下,上一句还没说完。Balabala…..”B->CLOSE_WAIT | A->FIN_WAIT2

B:”好了,说完了,我也不说了。”B->LAST_ACK

A:”我知道了。”A->TIME_WAIT | B->CLOSED

A等待2MSL,保证B收到了消息,否则重说一次”我知道了”,A->CLOSED

转载于:https://www.cnblogs.com/Corphish/p/8578576.html

你可能感兴趣的文章
Oracle插入日期格式出现 ORA-01843: not a valid month的解决办法
查看>>
HashSet的实现原理
查看>>
Java HashMap 分析之四:查找和内存使用
查看>>
《与熊共舞》——软件项目风险管理
查看>>
Linux system函数详解
查看>>
spring-boot启动信息中non-fatal error
查看>>
ubuntu14.04 Hadoop单机开发环境搭建MapReduce项目
查看>>
论文笔记:Deformable ConvNets v2: More Deformable, Better Results
查看>>
开通博客
查看>>
day03_04 文件后缀及系统环境变量
查看>>
JAVASCRIPT和JSP计算闰年
查看>>
OracleDBConsole启动不了
查看>>
PhoneGap工具Cloud9 IDE介绍以及使用方法
查看>>
HTML5 File 对象
查看>>
顺序表和链式表总结
查看>>
vc6.0中的dsp,dsw,ncb,opt,clw,plg,aps等文件的简单说明
查看>>
深入浅出SharePoint2013——安装SharePoint2013
查看>>
回校前的流水账
查看>>
python2与python3的区别
查看>>
getJSON
查看>>