TCP大量TIME_WAIT理解

TCP三次握手连接和TCP四次挥手及大量TIME_WAIT解决方法:

20160120103737468

1.TCP建立连接,三次握手

建立的TCP连接可靠的连接,必须经过三次握手建立连接才能正式通信彼此传输数数据。

客户端请求服务端建立连接

第一次握手:客户给服务发送一个请求报文SYN, 客户端的状态置SYN_SENT状态

第二次握手:服务端在收到客户端发过来的SYN请求报文后,开始给客户端发送ACK报文和SYN报文,状态置为SYN_RECE

第三次握手:客户端口收到服务端口过来的SYN报文和ACK报文后,状态由原来的SYN_SENT状态变为ESTABLISHED;并且给服务发送一个ACK报文告知对方已经送到服务端发送的SYN报文,服务端收到报文后,由原来的SYN_RECE变为ESTABLISHED

至此客户到服务端,服务端到客户端的双向连接建立好了并且处理ESTABLISHED。双方可以进行数据交换了。

 

2.TCP断开连接,四次挥手。

当客户端把所有数据传送完毕的时候,给服务端口送一个FIN报文,告知服务端:我这边没有数据可传,希望关闭客户端到服务端方向的连接。之后其状态由原来的

ESTABLISHED 变为FIN_WAIT_1,;

服务端收到客户的FIN报文后,送一个ACK报文给客户端,告知“我服务端知道你客户端口已经没有数据可传,但是我这边什么关闭连接,还需要等我的数据传完;如果我这里数据也传送完了,我也会给发送一个FIN报文。”。此时服务端发送ACK报文后,状态由之前的ESTABLISHED 变为CLOSE_WAIT

客户端端收到服务的ACK报文,将FIN_WAIT_1置FIN_WAIT_2,同时,继续等来的服务发送FIN报文。

当服务端数据传送也完毕的后,开始给客户端发送FIN包,发送FIN包后,其状态CLOSE_WAIT置为LAST_ACK

客户端口收到了服务的发过来的FIN包后,又给服务端发送ACK。发送ACK后,状态由原来的FIN_WAIT_2置为TIME_WAIT,客户在经过2MSL 时间进入CLOSE状态

服务端口收到客户端发送的ACK后,由LAST_ACK也进入CLOSE

 

3.TCP迁移状态:

LISTEN:服务端已经启动一个socket,其状态处于监听状态,等待客户发起请求连接。

ESTABLISHED:客户端和服务端经过三次握手建立,两个方向上连接状态都建立,状态置为ESTABLISHED

客户端状态变迁:(主动端)

FIN_WAIT_1: 发送FIN给服务端口。

FIN_WAIT_2:收到服务端的ACK报文

TIME_WAIT :收到服务端发过来的FIN报文,发送ACK报文给服务端口。主动关闭连接端,接收到服务(TIME_WAIT是主动端关闭)之后进入2MSL时间的等待

CLOSE:2MSl过后,关闭进入初始化状态。

 

服务端状态变迁:(服务端)

CLOSE_WAIT:收到客户端FIN报文,给客户端发送ACK状态后,表示知道客户端要关闭连接请求,服务端可能数据还没有传送完,所以处于等

                         等待关闭状态。(CLOSE_WAIT是被动端关闭)

LAST_ACK:服务端数据传输完毕,发送FIN报文给客户端,同时等待客户端发ACK报文状态

CLOSE:收到客户端ACK报文后,进入初始化状态

 

连接是双方建立的。发送数据的端客户也转变为接受数据的服务端口,服务端和客户角色是相互转换的

4.MSL时间:

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

TIME_WAIT状态维持时间

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

5.用于统计当前各种状态的连接的数量的命令

#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

返回结果如下:

LAST_ACK 14

SYN_RECV 348

ESTABLISHED 70

FIN_WAIT1 229

FIN_WAIT2 30

CLOSING 33

TIME_WAIT 18122

服务器出现大量time_wait是指在TCP连接断开后,服务器端口仍处于等待状态的情况。这可能会导致服务器资源的浪费,影响服务器的性能和可用性。以下是理解并解决这个问题的步骤: 首先,需要理解time_wait的原因:TCP连接的断开是一个多步骤的过程,在最后一个ACK报文发送后,服务器端口会进入time_wait状态一段时间,以确保在这段时间内没有延迟的报文重新出现。这是网络协议设计的一部分,用于确保数据传输的可靠性。 为了解决服务器出现大量time_wait的问题,可以采取以下措施: 1. 调整服务器参数:可以通过修改服务器操作系统的参数来调整time_wait状态的时间。例如,可以减少time_wait状态的持续时间,以释放服务器资源。具体的操作方法可以参考操作系统的文档或相关文档。 2. 加大服务器资源:如果服务器出现大量time_wait的问题,可能是服务器的资源(例如端口号)不足造成的。此时,可以考虑增加服务器的资源,例如扩大服务器的端口范围等。 3. 优化应用程序代码:服务器出现大量time_wait可能是应用程序代码设计不佳造成的。在应用程序中,可以优化代码,以减少TCP连接的数量和时间。例如,可以使用连接池来重用连接,或者调整连接关闭的时机。 4. 负载均衡和故障转移:如果服务器经常出现大量time_wait,可能是由于服务器负载过高或单点故障引起的。此时,可以考虑使用负载均衡和故障转移技术来分散流量和提高服务器的可用性,从而减少time_wait的数量。 总之,彻底理解并解决服务器出现大量time_wait的问题需要对网络协议、服务器参数和应用程序代码等方面有一定的了解。通过调整参数、加大服务器资源、优化代码以及使用负载均衡和故障转移等技术,可以有效地减少time_wait的数量,提高服务器的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值