计算机网络之TCP中TIME_WAIT状态意义详解
文章目录
- 为什么需要TIME_WAIT
- 一、何为TIME_WAIT?
- 二、为什么需要TIME_WAIT
- 原因一:防止被动关闭方的延迟数据被人窃取
- 原因二:防止被动关闭方没有收到最后的ACK
为什么需要TIME_WAIT
一、何为TIME_WAIT?
我们在日常做服务器的研发中、或者面试网络部分知识的时候,会经常问到TIME_WAIT这个词,这个词作为服务端的开发者尤为重要。TIME_WAIT是TCP协议中断开连接所经历的一种状态。
上图是TCP连接的状态转换,包括了一些触发条件,如果不是很直观,可以对比看下面的简图。
这里面作为主动关闭的一方(Client)出现了
TIME_WAIT
状态,目的是告诉Server端,自己没有需要发送的数据,但是它仍然保持了接收对方数据的能力,一个常见的关闭连接过程如下:1、当客户端没有待发送的数据时,它会向服务端发送
FIN
消息,发送消息后会进入FIN_WAIT_1
状态;2、服务端接收到客户端的
FIN
消息后,会进入CLOSE_WAIT
状态并向客户端发送ACK
消息,客户端接收到ACK
消息时会进入FIN_WAIT_2
状态;3、当服务端没有待发送的数据时,服务端会向客户端发送
FIN
消息;4、客户端接收到
FIN
消息后,会进入TIME_WAIT
状态并向服务端发送ACK
消息,服务端收到后会进入CLOSED
状态;5、客户端等待两个最大数据段生命周期(Maximum segment lifetime,MSL)的时间后也会进入
CLOSED
状态;
二、为什么需要TIME_WAIT
TIME_WAIT一定是发生在主动关闭一方
被动关闭一方,会直接进入
CLOSED
状态,而主动关闭一方需要等待2*MSL时间才会最终关闭。原因:
1、防止被动关闭方的延迟数据被人窃取
2、防止被动关闭方没有收到最后的ACK
原因一:防止被动关闭方的延迟数据被人窃取
如下图所示,
1、在①中,服务端发送
seq=1001
的消息,由于网络延迟或其他原因,没有及时到达Client1
客户端,导致整个包一直存留在网络环境的传输过程中。2、在②中,
Client1
收到server的FIN
包之后,变成了TIME_WAIT
状态,这里假设TIME_WAIT
等待的时间很短暂,那么,还没等之前的那个延迟包seq=1001
到来,就回复给了Server
最后一个ACK
包。那么Server
就会变成CLOSED
状态。3、在③中,相同的端口号的
Client2
的TCP链接被重用后4、在④中,
seq=1001
的延迟包消息才发送给客户端,而这个延迟的消息却被Client2
正常接收,主要就会给Client2带来严重的问题。所以TIME_WAIT
不要轻易的调整,或者缩小时间,可能就会出现这种问题。
原因二:防止被动关闭方没有收到最后的ACK
该作用就是等待足够长的时间以确定远程的TCP链接收到了其发出的终止链接消息
FIN
包的回执消息ACK
包。
如下图所示:
1、在①中,
CLient1
端主动发起关闭链接,Server
针对Client1
的FIN
回执了ACK
包,然后接着发送了自己的FIN
包,等待Client1
回执最终的ACK
包。2、在②中,这里假设
TIME_WAIT
的时间不足够充分,当Server
还没有收到ACK
消息时,Client1
就主动变成CLOSED
状态。3、在③中,由于
Server
一直没有等到自己FIN
包的ACK
应答包,导致一直处于LAST_ACK
状态。4、在④中,因为 服务端因为没有收到
ACK
消息,当Client2
重新与Server
建立TCP链接,认为当前连接是合法的,CLient2
重新发送SYN
消息请求握手时会收到Server
的RST
消息,连接建立的过程就会被终止。
所以,我们在默认情况下,如果客户端等待足够长的时间就会遇到以下两种情况:
1.服务端正常收到了
ACK
消息并关闭当前 TCP 连接;2.服务端没有收到
ACK
消息,重新发送FIN
关闭连接并等待新的ACK
消息;
只要客户端等待 2 MSL 的时间,客户端和服务端之间的连接就会正常关闭,新创建的 TCP 连接收到影响的概率也微乎其微,保证了数据传输的可靠性。
计算机网络之TCP中TIME_WAIT状态意义详解相关推荐
- 数控编程:CNC数控编程加工中功能字意义详解
序段由次序号字.准备功用字.尺度字.进给功用字.主轴功用字.刀具功用字.辅佐功用字和程序结束符组成.此有插补参数字等.每个字都由字母开头,称为"地址". 各个功用字的含义如下: ( ...
- TCP端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手,滑动窗口
参考文章:端口状态 LISTENING.ESTABLISHED.TIME_WAIT及CLOSE_WAIT详解,以及三次握手,滑动窗口
- 为什么TCP的TIME_WAIT状态要保持2MSL?
TIMEWAIT状态也称为 2MSL等待状态. 每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime). 它是任何报文段被丢弃前在网络内的最长时间. ...
- TCP的TIME_WAIT状态为什么要等待2MSL的时长
TCP四次挥手的第四次挥手后为什么要经过TIME_WAIT状态? TIME_WAIT状态为什么是2MSL的时长?为什么不是等待其他时长? TCP第四次挥手后为什么要经过TIME_WAIT状态? 第四次 ...
- 计算机网络之TCP中6种标识位
文章目录 计算机网络之TCP中6种标识位 1.TCP中6种标识位 2.SYN 3.ACK 4.FIN 计算机网络之TCP中6种标识位 1.TCP中6种标识位 标志位也叫位码.也叫控制位 SYN (sy ...
- TCP丢包检测技术详解
TCP丢包检测技术详解 http://www.cctime.com/html/2007-12-6/20071261023151210.htm 2007年12月6日 10:23 中 ...
- python爬虫常见报错_Python爬虫常见HTTP响应状态码详解
在使用Python进行网页数据抓取时,经常会遇到无数据返还或错误等异常,这个时候可以通过status_code命令来查看获得http请求返回的状态码,以便查找原因并制定相应的解决方案.import r ...
- mysql in从数据库取数_MySQL数据库中 where in 用法详解
本文主要向大家介绍了MySQL数据库中 where in 用法详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 这里分两种情况来介绍 WHERE column IN (valu ...
- [转]HTTP协议之状态码详解
HTTP协议之状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果是做AJ ...
最新文章
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
- c语言e怎么表示_C语言程序设计(山东联盟)
- Spring MVC集成slf4j-logback - 我想跟代码谈谈 - 博客频道 - CSDN.NET
- linux 和windows 下golang安装
- 尼康d850相机参数测试软件,尼康 D850最全参数信息曝光 快来围观
- 《Oracle Database 12c DBA指南》第二章 - 安装Oracle和创建数据库(2.2 安装数据库软件)...
- latex 幻灯片演示模板
- python安装虚拟环境出现错误_virtualenv 安装虚拟环境问题 请大神指点一二
- C/C++ OpenCV均值滤波
- http://blog.seirsoft.com
- 视频编解码(十七):视频流错误检查步骤-进程查看内存方法
- ip设计包括什么_一天卖200多万个潮玩,泡泡玛特如何打造超级IP?
- Mastik:微体系结构侧信道攻击工具包
- debian linux ntfs,让Debian支持ntfs文件系统读写
- CentOS7内存清理脚本
- 单片机设计智能浇水系统
- 手把手教你在Imtoken上收录你的合约
- 计算机软考科目中,该怎么选择考试科目?
- swt包下载,swt包引入(一个简单的SWT程序实例及详解)
- 30岁开始学编程,学什么语言比较好?