TCP之TIME_WAIT状态原理

原创 2015年07月10日 13:54:51
IME_WAIT状态原理

----------------------------

通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。

客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。

下图是以客户端主动关闭连接为例,说明这一过程的。


TIME_WAIT状态存在的理由

----------------------------

TCP/IP协议就是这样设计的,是不可避免的。主要有两个原因:

1)可靠地实现TCP全双工连接的终止

TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。

因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。

 

2)允许老的重复分节在网络中消逝 

TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

MSL时间

----------------------------

MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。

 

TIME_WAIT状态维持时间

----------------------------

TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟。Windows操作系统就是4分钟。

 

Q: 编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思? 

 

A: 这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用 

端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息, 

指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧 

使用同一端口,此时 SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期 

望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不 

可能。 

 

一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端 

口。SO_REUSEADDR 仅仅表示可以重用本地本地地址、本地端口,整个相关五元组 

还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。必须慎重使 

用 SO_REUSEADDR 选项。


版权声明:本文为博主原创文章,未经博主允许不得转载。

TCP/IP详解--TIME_WAIT状态存在的原因

1. 实际问题         初步查看发现,无法对外新建TCP连接时,线上服务器存在大量处于TIME_WAIT状态的TCP连接(最多的一次为单机10w+,其中引起报警的那个模块产生的TIME_WAI...
  • yusiguyuan
  • yusiguyuan
  • 2014年09月01日 20:15
  • 3326

TCP/IP详解--TIME_WAIT状态详解

Socket中的TIME_WAIT状态 在高并发短连接的server端,当server处理完client的请求后立刻closesocket此时会出现time_wait状态然后如果client再并发...
  • yusiguyuan
  • yusiguyuan
  • 2014年03月18日 10:29
  • 5641

一个解除TCP连接的TIME_WAIT状态限制的简便方法

/************************************ *              版权声明 *   本文为本人原创,本人拥有此文的版权。鉴于本人持续受益于开源软件社区, ...
  • wyhang0
  • wyhang0
  • 2014年10月26日 22:36
  • 1629

TCP/IP TIME_WAIT状态原理和服务端过多原因分析

TCP/IP TIME_WAIT状态原理 (原文地址 http://elf8848.iteye.com/blog/1739571) 博客分类:  网络协议-TCP/HTTP   TIME_...
  • fei33423
  • fei33423
  • 2015年11月07日 16:21
  • 1988

为什么TCP的TIME_WAIT状态要保持2MSL?

TIMEWAIT状态也称为2MSL等待状态。 每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime)。 它是任何报文段被丢弃前在网络内的最长时间。 ...
  • unix21
  • unix21
  • 2013年11月24日 13:14
  • 3978

TCP/IP TIME_WAIT状态原理(四次握手关闭连接原理)

TIME_WAIT状态原理 ---------------------------- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。 客户端主动关闭连接时,会发送最...
  • huangjin0507
  • huangjin0507
  • 2016年08月24日 10:48
  • 1512

TCP/IP详解--TCP连接中TIME_WAIT状态过多

TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的。仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这个TIMEWAIT。服务器在处理客户端请...
  • yusiguyuan
  • yusiguyuan
  • 2014年03月18日 10:30
  • 48834

TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用

三次握手第一次握手:主机A发送位码为syn=1,随机产生seq number=10001的数据包到服务器,主机B由SYN=1知道,A要求建立联机,此时状态为SYN_SENT; 第二次握手:主机B收...
  • sinat_32487221
  • sinat_32487221
  • 2017年02月16日 21:31
  • 1748

谈谈TCP中的TIME_WAIT

在服务端可能会经常遇到有很多处于TIMEWAIT状态的TCP连接。如果上网一搜索,可以找到有很多关于处理TIMEWAIT不正确的博文(包括本文),很多文章就放了几个调整参数。至于这些参数有什么用,为什...
  • jewes
  • jewes
  • 2016年09月24日 23:48
  • 1618

Time-wait状态(2MSL)一些理解

1. 编写TCP/SOCK 服务时,SO_REUSEADDR到底是什么意思? 这个套接字选项通知内核,如果端口忙,但TCP状态处于TIME_WAIT,可以重用端口。如果端口忙,TCP状态处于其他状态...
  • overstack
  • overstack
  • 2013年04月22日 14:12
  • 5942
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TCP之TIME_WAIT状态原理
举报原因:
原因补充:

(最多只允许输入30个字)