TCP连接的TIME-WAIT状态
2015-07-20 13:27
567 查看
TIME-WAIT状态是TCP的11个状态其中之一,是发生在正常关闭TCP连接的时候发生的。如下图所示:
![](http://img.blog.csdn.net/20150720132950463?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在这幅图中我们可以明显看出,流程是这样的,显示主动发送一个FIN报文,然后接收到一个ACK报文,这样这一方的连接已经关闭,也就是不能再发送数据了,进入FIN_WAIT2状态,这个状态就是为了等待,被动关闭连接的一方,发送fin报文,在这期间可以接收来自对方的数据,等到被动关闭这一端,发送完毕后,就会发出一个FIN报文,那么在接收到FIN报文后,进入TIME_WAIT状态,首先向被动连接那一方,发送一个ACK,然后进入等待状态,等待时长为2MSL(MSL为一个TCP报文在网络中能够存活的最大时长),很多人问,为什么会进入一个等待,状态呢。因为如上图所示,被动关闭连接的哪一方,在发送出FIN报文后,要确定主动方,接收到它发送的FIN报文,怎么知道是否接收到呢,那么就是对方返回一个ACK报文。设想如果主动方发送的最后一个报文不能到达被动关闭连接方呢?这时候如果主动方不等待,直接选择关闭连接,然后被动方又不知道,超时会重传FIN报文,但是主动方已经关闭了,所以不会反回任何应答,这样就会让被动方关闭连接上出问题,所以得等待一段时间,看被动方是否接收到了最后一个ACK,如果没接收到的话,FIN报文会超时重传,那么在等待阶段接收到FIN报文后,可以重发,最后一个ACK。这样在关闭连接上就没有什么问题了。另外其实,如果不等待一段时间还会发生另外一个问题,设想在TCP交互过程中,一个报文因为各种原因,没有到达目的地,如果不等待一段时间,那么意味着在关闭连接后立刻在这个端口上就可以建立新的连接,那么在新连接交互的过程中,如果上一个连接的那个没有到达的报文,现在到达了,那么是不是就会出现新的问题,所以说要等待2MSL时间,可以让老的报文彻底消失,才能开始一个新的连接。
经过以上的讨论其实要在TIME_WAIT阶段等待一段时间的主要原因有两个:
1.能够确保被动关闭连接方能够,接收到最后一个ACK,也就是能够确定,主动方已经接收到被动方的FIN报文。
2.能够确保本次连接的所有未到达的报文段,能够彻底在网络中消失,不会影响下一次在相同端口上建立的新连接。
所以一般在某一个端口上关闭TCP连接后不能立即启用本端口建立新的连接,因为在TIME_WAIT阶段是不允许建立新的连接的。
在这幅图中我们可以明显看出,流程是这样的,显示主动发送一个FIN报文,然后接收到一个ACK报文,这样这一方的连接已经关闭,也就是不能再发送数据了,进入FIN_WAIT2状态,这个状态就是为了等待,被动关闭连接的一方,发送fin报文,在这期间可以接收来自对方的数据,等到被动关闭这一端,发送完毕后,就会发出一个FIN报文,那么在接收到FIN报文后,进入TIME_WAIT状态,首先向被动连接那一方,发送一个ACK,然后进入等待状态,等待时长为2MSL(MSL为一个TCP报文在网络中能够存活的最大时长),很多人问,为什么会进入一个等待,状态呢。因为如上图所示,被动关闭连接的哪一方,在发送出FIN报文后,要确定主动方,接收到它发送的FIN报文,怎么知道是否接收到呢,那么就是对方返回一个ACK报文。设想如果主动方发送的最后一个报文不能到达被动关闭连接方呢?这时候如果主动方不等待,直接选择关闭连接,然后被动方又不知道,超时会重传FIN报文,但是主动方已经关闭了,所以不会反回任何应答,这样就会让被动方关闭连接上出问题,所以得等待一段时间,看被动方是否接收到了最后一个ACK,如果没接收到的话,FIN报文会超时重传,那么在等待阶段接收到FIN报文后,可以重发,最后一个ACK。这样在关闭连接上就没有什么问题了。另外其实,如果不等待一段时间还会发生另外一个问题,设想在TCP交互过程中,一个报文因为各种原因,没有到达目的地,如果不等待一段时间,那么意味着在关闭连接后立刻在这个端口上就可以建立新的连接,那么在新连接交互的过程中,如果上一个连接的那个没有到达的报文,现在到达了,那么是不是就会出现新的问题,所以说要等待2MSL时间,可以让老的报文彻底消失,才能开始一个新的连接。
经过以上的讨论其实要在TIME_WAIT阶段等待一段时间的主要原因有两个:
1.能够确保被动关闭连接方能够,接收到最后一个ACK,也就是能够确定,主动方已经接收到被动方的FIN报文。
2.能够确保本次连接的所有未到达的报文段,能够彻底在网络中消失,不会影响下一次在相同端口上建立的新连接。
所以一般在某一个端口上关闭TCP连接后不能立即启用本端口建立新的连接,因为在TIME_WAIT阶段是不允许建立新的连接的。
相关文章推荐
- HTTP状态码大全
- 黑马程序员---------Java网络编程
- python调用tcpdump抓包过滤
- 计算机网络读书笔记-----数据链路层
- linux 网络编程-基础篇
- Nginx源代码分析之网络超时管理(九)
- cocos2dx 获取网络图片
- TCP/IP详解学习笔记(2)--IP协议
- 计算机网络
- nginx使用ssl模块配置HTTPS支持
- iOS 网络编程 NSURLSessionDataTask 添加cookie
- HTTP协议详解
- 专业工具,网络随行
- 失控阅读笔记自然之流变
- 基于Google Volley的Android Http连接库
- 实例讲解httpd虚拟主机的配置以及https的配置
- Android http请求代码
- [机器迁移]如何通过网络快速传输海量(小)文件
- Android 开源框架Universal-Image-Loader加载https图片
- 《ASP.NET 本质论》HttpApplication的处理管道 ,HttpMoudle,HttpHandler