好一个Time_Wait状态(TCP/IP)
首先简单介绍一下Time_Wait是个什么鬼:
在TCP/IP协议中,我们都知道有三次握手四次挥手的过程,先来一个简单的图:

各个状态和基本的过程想必了解过TCP/IP协议的人都清楚,本次介绍的主题只有Time_Wait状态。(Ps:本文统一将主动断开连接方称A,被动断开连接方称B)
1,Time_Wait状态是什么结点产生的?
在A发送Fin被B接收到,B会发送ACK紧接着发送Fin以后,A接收到另一方发过来的Fin信号,就会将自身的状态设置为Time_Wait状态,并返回一个ACK。
2,为什么需要有一个Time_Wait状态?
主要有两个原因:⑴ 可靠地实现TCL全双工连接的终止;⑵允许老的重复分节在网络中消逝。
3,分别解释一下上述两种具体的实现过程?
⑴ A发送最后一次ACK后,会处于Time_Wait状态下,此时并没有断开连接,若最后一次ACK没有正常发送给B,则B检测超时后会再次发送确认的Fin,此时A处于Time_Wait状态就能正常接收并再次发送确认ACK,以确保服务器能正常断开连接。Time_Wait(2MSL)时间超时后,A端就会自动关闭端口。
⑵ 假设已经有A与B建立了链接,此时A主动断开连接后,这时候发出的一个ACK,如果没有Time_Wait(2MSL)时间,直接断开连接后立即启用一个新的网络连接,如果有一个来自上个连接的数据包,会直接对当前连接连接造成影响,所以必须进行一个2MSL的等待时间。
4,为什么是2MSL时间:
MSL时间是一个数据包在网络中最大的存活时间。如果超过这个时间,就会在网络传输中消失。一般这个时间在Window环境下就是2分钟,所以2MSL就是4分钟,这个具体的时间根据环境不同有所减少。而之所以是2MSL,主要原因在两个端口之间进行传输,从传输到B端口再从B端口传回来,至少需要2个包,所以规定的时间为2MSL。
5,若是在Time_Wait时间内,还是由于一些原因(路由异常,数据处理延迟,等待超时),造成最后一个ACK没能正常到达,服务器会怎么样?
首先,若服务器多次发Fin得不到回应,根据项目不同,必然是有响应的超时异常处理,但一般情况下不会很少出现这种极端情况,所以哪怕在A端已经关闭,B端发送一个Fin之后,A端也会反馈一个RST分节,这个数据包会在B端被识别成异常错误。
6,如果在Time_Wait状态ACK数据丢失,那A与B如果再次进行数据确认?
TCP协议提供一种超时重传机制,主要根据TCP提供的定时器进行控制,而这种情况下的重传,时间为RRT(数据往返时间),由于路由器和网络流量均会变化,所以RRT时间也是经常变动的。这个时间长短的变动同样是TCP进行监控修改的。具体算法请参考TCP/IP详解:卷一。
7,Time_Wait状态必须等待2MSL时间吗?
当然不是,某些特殊情况A端需要进行大量并且快速的建立连接-断开连接的操作,所以我们有时候不能接受2-4分钟左右的重新等待时间,这时候可以通过设置TCP的配置文件 /etc/sysctl.conf 来改变Time_Wait状态的时间,具体修改内容如下:
编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行/sbin/sysctl -p让参数生效。
net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout修改系統默认的TIMEOUT时间
修改之后,再用命令查看TIME_WAIT连接数netstat -ant |grep “TIME_WAIT” |wc –l
在没有nat情况下还需要设置net.ipv4.tcp_timestamps = 1才能生效。
8,若设置了上述时间,我们如何确保Time_Wait的两个作用?
若要设置快速重用的属性,前提也必须设置net.ipv4.tcp_timestamps = 1,TCP就会为数据包添加两个”字节时间字段”,第一个4字节记录发送该数据包的时间,第二个4字节字段用来保存最近一次接受对方发送到数据的时间。有了时间段,我们就可以通过计算时间,来防止延迟的数据到达。但确保双关性可能会出现问题,但就算A段快速关闭,数据丢失下B段重发Fin,会回复一个RST包,表达是异常。
上述大部分都是通过TCP/IP协议与博客了解,部分是通过与朋友讨论总结,若出现错误,请大神们指点
好一个Time_Wait状态(TCP/IP)的更多相关文章
- close_wait状态和time_wait状态(TCP连接)
1.CLOSE_WAIT的简单解决方案 不久前,我的Socket Client程序遇到了一个非常尴尬的错误.它本来应该在一个socket长连接上持续不断地向服务器发送数据,如果socket连接断开,那 ...
- TCP/IP TIME_WAIT状态原理
原文转载:http://elf8848.iteye.com/blog/1739571 IME_WAIT状态原理 ---------------------------- 通信双方建立TCP连接后,主动 ...
- Linux-TCP/IP TIME_WAIT状态原理
TIME_WAIT状态原理---------------------------- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态. 客户端主动关闭连接时,会发送最后一个a ...
- TCP协议(二)——TIME_WAIT状态
当TCP主动关闭套接字时,采用四步握手机制来彻底关闭连接.如图: 客户端主动关闭连接,发送FIN段到服务端.TCP状态由ESTABLISHED(连接状态)转为FIN_WAIT1(表示,发送的FIN需要 ...
- 001_TCP/IP TIME_WAIT状态原理及监控实战
一.原理 <1>TIME_WAIT状态原理---------------------------- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态. 客户端主动 ...
- 在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP
如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...
- 【网络编程】time_wait状态产生的原因,危害,如何避免
转自:https://blog.csdn.net/u013616945/article/details/77510925 做略微修改 仅供个人学习 1. time_wait状态如何产生? 在tcp ...
- 《TCP/IP详解》
TCP/IP概述 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本 ...
- 网络--TIME_WAIT状态
MSL时间 MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 .MSL在RFC 1122 ...
随机推荐
- 【转载】分布式之redis复习精讲
注: 本篇文章转自:分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一 ...
- linux python 图形编程 qt开发环境搭建
我的系统是 ubuntu14.04 我们使用的是python2.7,建议安装qt4+pyqt4+eric4 eric是pyqt的界面设计器的代码生成软件. 1.安装sip 这个是python和qt之间 ...
- 2018HN省队集训
HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...
- ES6中let和const详解
let和var一样也是用来定义变量,不同之处在于let是块级作用域,只在所定义的块级作用域中生效,一个花括号便是一个块级作用域 {var a="我是var定义的";let b=&q ...
- 日志框架--(二)JDK Logging
前言 从jdk1.4起,JDK开始自带一套日志系统.JDK Logger最大的优点就是不需要任何类库的支持,只要有Java的运行环境就可以使用.相对于其他的日志框架,JDK自带的日志可谓是鸡肋,无论易 ...
- WPF 竖排文字(转)
---恢复内容开始--- 想做一个WPF 文字竖排 类似上图.用在TabItem的header上面. <TextBlock FontSize="30" Text=" ...
- chrome扩展程序开发之在目标页面执行自己的JS
大家都知道JS是执行在client的.所以,假设我们自己写一个浏览器的话.是一定能够往下载下来的网页源码中加入js的.可惜我们没有这个能力.只是幸运的是,chrome的扩展程序能够帮我们做到这件事. ...
- C#类、方法的访问修饰符
这篇文章主要介绍了C#类的访问修饰符用法,较为详细的分析了C#类的访问修饰符概念与用法,具有一定的参考借鉴价值,需要的朋友可以参考下 本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考.具体用 ...
- shell监控网卡状态,故障时自动重启网卡
今天朋友找我写个监控网卡状态的脚本,要求在系统网卡挂了可以自己启动起来,这个要求是不是很bt,我考虑了半天,简单的写了个shell脚本来监控,实现原理是使用ping来测试网络连通性,如果不通就重启 ...
- 聊聊Oracle 11g的Snapshot Standby Database(下)
3.Snapshot Standby行为研究 下面我们分析一下Snapshot Standby的工作性质和行为性质.我们在主库方向研究当前状态. --主库日志情况 SQL> select gro ...