今天登录服务器查看某个端口的占用情况。我很惊讶地发现很多TIME_WAIT。time_wait12345678910作用的原因TIME_WAIT状态存在的原因:1)可靠地实现TCP全双工连接的终止。在执行关闭连接的四向挥手协议时,最后一个ACK由主动关闭端发送。如果最后的ACK丢失,服务器会重新发送最后的FIN,所以客户端必须维护状态信息,允许它重新发送最后的ACK。如果不维护此状态信息,则客户端将响应RST部分,服务器会将此部分解释为错误(java中将抛出连接重置的SocketException)。因此,要实现TCP全双工连接的正常终止,需要处理终止序列四段中任意一段的丢失,主动关闭的客户端必须维护状态信息并进入TIME_WAIT状态。2)允许旧的重复段在网络中消失。由于路由器异常,TCP段可能会“丢失”。在丢失期间,TCP发送方可能会由于确认超时而重发该报文段。丢失的段经过路由器修复后也会被发送到最终目的地,这个原来丢失的段称为lostduplicate。关闭TCP连接后,立即重新建立同一IP地址和端口之间的TCP连接。后一个连接称为前一个连接的化身。链接的杂散重复组在前一个链接终止后出现,因此被误解为属于新的化身。为了避免这种情况,TCP不允许处于TIME_WAIT状态的连接开始新的化身,因为TIME_WAIT状态持续2MSL,可以保证当一个TCP连接成功建立时,从前一个重复的数据包连接的化身已经消失在网络中。大量TIME_WAIT的影响是在高并发短连接的TCP服务器上。服务器处理完请求后,会正常主动关闭连接。在这种场景下,大量的套接字会处于TIME_WAIT状态。如果客户端的并发量持续偏高,此时会出现部分客户端连接不上的情况。让我解释一下场景。正常主动关闭TCP连接,会出现TIMEWAIT。为什么要关注这个高并发的短连接呢?有两个方面要注意:1、高并发可以让服务器在短时间内同时占用大量的端口,端口范围是0~65535,不多,除了对于系统等服务,剩下的就更少了。2、在本场景中,短连接是指“业务处理+数据传输时间远小于TIMEWAIT超时时间”的连接。这里是一个比较长短的概念,比如拿一个网页,一个1秒的短http连接来处理业务,关闭连接后,业务使用的端口会停留几分钟TIMEWAIT状态,而这几分钟,其他的HTTP请求来了,是不可能占用这个端口的(占坑不拉)。如果单独用这个业务来计算服务器利用率,你会发现服务器做正经业务的时间和端口(资源)挂掉不能用的时间之比是1:百,也就是严重浪费服务器资源。(说句题外话,如果从这个意义上考虑服务器性能调优,长连接业务的服务是不需要考虑TIMEWAIT状态的。同时,如果你对服务器业务场景非常熟悉的话,你会发现,在实际业务场景中,一般长连接对应的业务并发不是很高,结合这两个方面,一定数量的高并发短连接的持续到来,会导致服务端拒绝为部分客户提供服务端口资源不足,同时这些端口是服务器临时分配的,无法通过SO_REUSEADDR选项解决这个问题。四十年,证明了它的设计是合理的。所以我们尽量使用它原来的功能。依靠TIME_WAIT状态来保证我的服务器程序是健壮的,服务功能是正常的。这是否意味着不需要性能?不行,如果服务器上运行的短连接流量到了,我真的要处理这个TIMEWAIT状态问题太多的时候,我的原则是尽量处理,而不是去处理TIMEWAIT。我必须先消灭它们,然后再迅速消灭它们。如果我尽力解决了问题,仍然拒绝为某些请求服务,那么我将通过负载均衡来抵抗这些高并发的短请求。连续10万并发短连接请求,两台机器,每台5万,应该够用了。一般的业务量和国内大部分网站不需要关注这个问题总之就是访问量达不到的时候需要关注这个问题。小知识点TCP协议发表:1974年12月,Kahn和Cerf对TCP协议的第一份详细描述正式发表。当时,美国国防部和三批科学家签署了完成TCP`/IP的协议。于是,以瑟夫为首的小组一马当先,率先制定了详细定义的TCP/IP协议标准。当时做了一个实验,信息包通过点对点的卫星网络,然后是地面电缆,然后是卫星网络,然后是地面传输,经过欧洲和美国的各种计算机系统94,000公里期间没有数据丢失。远距离的可靠数据传输证明了TCP`/IP`协议的成功。解决方案使用命令:`netstat-an|`awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'查看连接状态统计使用命令:vim`/etc/sysctl`.confedit文件,添加以下内容:net.ipv4.tcp_syncookies=1(该参数在某些情况下启用)net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_tw_recycle=1net.ipv4.tcp_fin_timeout=30然后执行`/sbin/sysctl-p使参数生效。`net.ipv4.tcp_syncookies=1表示启用SYNCookies。当SYN等待队列溢出时,启用cookies进行处理,可以防止少量的SYN攻击。默认为0,表示关闭;net.ipv4.tcp_tw_reuse=1表示启用重用。允许TIME-WAIT套接字被重新用于新的TCP连接,默认为0,表示关闭;net.ipv4.tcp_tw_recycle=1表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭。net.ipv4.tcp_fin_timeout修改系统默认的TIMEOUT时间。你应该在很短的时间内多次执行这个命令,你会看到TIME_WAIT的数量在减少
