原文连接:
http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
以下为对原文的阅读笔记
说明:
主动关闭的一方称为local end,被动关闭的一方称为remote end
本地IP、本地端口、远端IP、远端端口这一“四元组”称为quadruplet,也称为socket
1、TIME_WAIT主要是为了解决两个问题:
a.delayed packet:新连接能够丢弃旧连接的延时到达的数据包
b.LAST ACK:确保remote end,在local end发送的ack丢失的情况下,仍能完成关闭,而不是永远处于LAST ACK状态:
如果remote end永远处于LAST ACK,则对于local end新的握手请求,会返回RST;这样,双方就再也建立不起连接了
2、TIME-WAIT带来的问题主要是端口不够用,TIME-WAIT连接占用的内存和CPU其实并不多。如果local end和remote end都可以增加端口、增加IP,那最好不过了
3、如果确实需要“对付”TIME-WAIT,有几种方法:
a.disable socket lingering
原理就是在close时不是走正常的关闭流程,而是直接RST,这样就不会进入TIME-WAIT
但对于non-blocking的进程来说,也有可能进入TIME-WAIT:如果close后剩余数据在超时前能成功发送
b.net.ipv4.tcp_tw_reuse
只对outgoing connection有效
主要原理就是利用TCP的时间戳选项。如果新报文的时间戳比旧报文的大,则重用旧的quadruplet
delayed packet:丢弃过时的报文
LAST ACK:处于LAST ACK状态的remote end,在local end再次发起握手时,重传FIN,然后local end发送RST关闭旧连接,然后再建立新连接。因此,新连接的建立可能会有轻微的延时
c.net.ipv4.tcp_tw_recycle
对incoming and outgoing connections都有效
利用RTT减少处于TIME-WAIT状态的连接的存活时间,也就是,更快的回收quadruplet
delayed packet:同样是丢弃过时的报文。如果TIME-WAIT状态结束了,则表示是新连接了,不丢弃
LAST ACK:处理同net.ipv4.tcp_tw_reuse
这个方法带来的问题就是,NAT可能有多个内网机器,这些机器之间不共享时间戳,因此会导致那些时间戳小的机器无法连接
(不是很理解的是,tcp_tw_reuse和tcp_tw_recycle都是基于时间戳,为什么tcp_tw_recycle会有NAT的问题,而tcp_tw_reuse没有呢)
后面两种方法都需要tcp_timestamps
4、很多时候TIME-WAIT并不是一个问题,而是一个“需要我们深入理解”的朋友
分享到:
相关推荐
如果大量的 Time_wait ...使用 TCP Keepalive:TCP Keepalive 可以在服务器端和客户端之间建立持久连接,避免连接断开后导致的 TIME_WAIT 状态。 使用传输层网关:传输层网关可以代替服务器端和客户端之间的直接连接,
修改注册表中的tcpip的TIMEWAIT回收时间属性值,需要重启后生效 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的DWORD键,设置为十进制0,以缩短TIME_WAIT...
当我们看到netstat输出中存在大量的TCP连接处于TIME_WAIT状态时,这通常意味着系统可能存在一些性能问题或者配置上的挑战。本篇文章将深入探讨TIME_WAIT状态的原因以及如何解决。 TCP(传输控制协议)是一种面向...
8. `net.ipv4.tcp_fin_timeout`:减少FIN-WAIT-2状态的持续时间,更快释放资源。 9. `net.ipv4.tcp_keepalive_probes`:减少超时前的探测次数,以减少无效连接的保持时间。 10. `net.core.netdev_max_backlog`:优化...
TCP协议设计中引入`TIME_WAIT`状态的主要目的是为了保证数据传输的可靠性。具体来说: 1. **确保被动关闭方接收到最终的ACK确认**:当被动关闭方发送FIN分组时,它期待接收到对方的ACK确认。如果主动关闭方不进入`...
在TCP协议中,TIME_WAIT状态是TCP连接关闭过程中的一个阶段,主要目的是确保数据已经被对方完全接收,并且防止旧的数据在网络中重新出现,干扰新的连接。在这个状态下,TCP连接并没有立即关闭,而是等待一段时间...
tcp几种状态和time_wait过高处理
该模块允许丢弃TCP连接,可用于终止TIME-WAIT套接字。 用法 首先编译并加载模块: $ make $ sudo insmod drop-tcp-sock.ko 单插座杀死: # netstat -n -t | grep WAIT tcp 0 0 127.0.0.1:50866 127.0.0.1:22 ...
【TCP TIME_WAIT常见解决方法】 TCP TIME_WAIT状态是TCP连接生命周期中的一个重要阶段,它发生在主动关闭连接的一方(通常称为客户端)在连接关闭后等待一段时间,以确保所有在网络中可能残留的数据片段都被接收并...
【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法,这是一个关于网络编程和Linux系统配置的问题。在TCP/IP通信中,TIME_WAIT状态是TCP连接生命周期的一部分,用于确保...
Linux内核协议栈中的TCP协议在处理连接关闭时,会进入一个特定的状态叫做time_wait。这个状态对于确保TCP连接的可靠性和避免旧连接与新连接混淆至关重要。在time_wait状态下,连接不会立即关闭,而是等待一段时间,...
当一个 TCP 连接关闭时,服务器端会在 TIME_WAIT 状态下等待一段时间,以确保所有的数据包都已经被客户端收到。在这个状态下,服务器端会等待两个最大段生命周期(Maximum Segment Lifetime,MSL)的时间,以确保...
TIME_WAIT是TCP协议中的一个状态,当一个TCP连接正常关闭后,会进入TIME_WAIT状态,等待一段时间(通常是2MSL,即最大段生命周期的两倍)来确保网络中没有残留的数据包。在这个状态下,端口被占用,不能立即复用,这...
TIME_WAIT是TCP连接的一个正常终止状态,但若数量过多则可能会影响到服务器性能。本文将详细介绍如何在Linux系统中优化TIME_WAIT状态的连接,并提供具体的配置示例。 #### TCP TIME_WAIT状态简介 TCP协议在连接...
本文讨论了在线上环境中,服务端长连接和客户端短连接配置不当导致Nginx服务器产生大量“TIME_WAIT”状态线程的问题,同时提供了问题的分析和解决方法。本文主要涉及的网络编程知识点包括长连接与短连接的定义和区别...
标题 "tomcat-timewait-closewait.zip" 暗示了这个压缩包可能包含与Tomcat服务器在处理TCP连接时遇到的“Time_wait”和“Close_wait”状态相关的问题和解决方案。这两个术语是TCP/IP协议栈中的关键概念,尤其在高...
在 TCP 连接中,客户端和服务器端都可以处于不同的状态,例如 ESTABLISHED、CLOSE_WAIT、FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT 等 trạng thái。 CLOSE_WAIT 状态是 TCP 连接中的一种状态,它表示服务器端已经收到了...
TIME_WAIT状态是TCP连接的四次挥手关闭协议中的一个重要状态,它存在的理由是为了确保TCP全双工连接的正常终止和避免老的重复分节在网络中消逝。 在TIME_WAIT状态中,客户端必须维持状态信息,以便在最后的ACK丢失...