原文连接:
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...
在TIME-WAIT状态下的TCP连接 收到SYN后会发生什么557-569
近期服务器出现大量time_wait的TCP连接造成服务器连接数过多而最终导致tomcat假死状态。连接服务器查看连接数的时候提示如下。 [root@test apache-tomcat-7.0.53]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a...
netstat显示 TIME_WAIT 的原因及解决办法 netstat显示TCP连接进入TIME_WAIT状态的原因及解决办法
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 ...
NULL 博文链接:https://bert82503.iteye.com/blog/2147899
tcp连接是网络编程中最基础的概念,基于不同的使用场景,我们一般区分为“长连接”和“短...长短连接的优点和缺点这里就不详细展开了,有心的同学直接去google查询,本文主要关注如何解决tcp短连接的TIME_WAIT问题。
通过修改注册表,直接修改tcp的连接时间,避免超多的timewait
3.3 timestack数据包-Wireshark3.4 内核协议栈相关主要源码Time_wait状态生成及快速回收相关代码:开启timestamps引起的丢
详细描述TCP的各个状态,初学者可以快速理解掌握tcp状态图
减少Linux服务器过多的TIME_WAIT TIME_WAIT状态的意义: 客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口 状态为TIME_WAIT 是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢? 有...
个人简介文章分类全部博文(229)进程间通信(4)版本控制(9)个人计划(2)进程调度(0)文件系统/存储(3)内存管理(12)系统/脚本(3)编程相关(8)攻
LINUX 大量TIME_WAIT状态的连接解决方法
4.2 客户的端口号和TIME_WAIT状态 43 4.3 设置TIME_WAIT状态的目的 45 4.4 TIME_WAIT状态的截断 48 4.5 利用TAO跳过三次握手 51 4.6 小结 55 第5章 T/TCP协议的实现:插口层 56 5.1 概述 56 5.2 常量 56 5.3 sosend...
--timeout XX Timeout in milliseconds to wait for each reply. Default is 2000 ms (2 seconds). --wait XX How long to wait in milliseconds between sending packets. Default is 1000 ms (1 second). ...
摘要视图订阅01.02.03.04.05.06.162149次第9644名99篇1篇0篇30条【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导
linux c 网络编程 测试tcp连接的TIME_WAIT状态 非常适合于初学者
用法wait-for-it.sh host:port [-s] [-t timeout] [-- command args]-h HOST | --host=HOST Host or IP under test-p PORT | --port=PORT TCP port under test Alternatively, you specify the host and port as ...