淘宝客如何做免费的网站,wordpress改变登录地址,常州网上房地产官网,外链linkTCP断开过程:
TIME_WAIT的作用:
TIME_WAIT状态存在的理由#xff1a;
1#xff09;可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时#xff0c;最后的ACK是由主动关闭端发出的#xff0c;如果这个最终的ACK丢失#xff0c;服务器将重发最终的FIN#xf…TCP断开过程:
TIME_WAIT的作用:
TIME_WAIT状态存在的理由
1可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时最后的ACK是由主动关闭端发出的如果这个最终的ACK丢失服务器将重发最终的FIN 因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息那么客户端将响应RST分节服务器将此分节解释成一个错误在java中会抛出connection reset的SocketException)。 因而要实现TCP全双工连接的正常终止必须处理终止序列四个分节中任何一个分节的丢失情况主动关闭的客户端必须维持状态信息进入TIME_WAIT状态。 2允许老的重复分节在网络中消逝 TCP分节可能由于路由器异常而“迷途”在迷途期间TCP发送端可能因确认超时而重发这个分节迷途的分节在路由器修复后也会被送到最终目的地这个原来的迷途分节就称为lost duplicate。 在关闭一个TCP连接后马上又重新建立起一个相同的IP地址和端口之间的TCP连接后一个连接被称为前一个连接的化身incarnation)那么有可能出现这种情况前一个连接的迷途重复分组在前一个连接终止后出现从而被误解成从属于新的化身。 为了避免这个情况TCP不允许处于TIME_WAIT状态的连接启动一个新的化身因为TIME_WAIT状态持续2MSL就可以保证当成功建立一个TCP连接的时候来自连接先前化身的重复分组已经在网络中消逝。
大量TIME_WAIT造成的影响 在高并发短连接的TCP服务器上当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高此时部分客户端就会显示连接不上。 我来解释下这个场景。主动正常关闭TCP连接都会出现TIMEWAIT。 为什么我们要关注这个高并发短连接呢有两个方面需要注意 高并发可以让服务器在短时间范围内同时占用大量端口而端口有个0~65535的范围并不是很多刨除系统和其他服务要用的剩下的就更少了。
在这个场景中短连接表示“业务处理传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。
这里有个相对长短的概念比如取一个web页面1秒钟的http短连接处理完业务在关闭连接之后这个业务用过的端口会停留在TIMEWAIT状态几分钟而这几分钟其他HTTP请求来临的时候是无法占用此端口的(占着茅坑不拉翔)。 单用这个业务计算服务器的利用率会发现服务器干正经事的时间和端口资源被挂着无法被使用的时间的比例是 1几百服务器资源严重浪费。说个题外话从这个意义出发来考虑服务器性能调优的话长连接业务的服务就不需要考虑TIMEWAIT状态。同时假如你对服务器业务场景非常熟悉你会发现在实际业务场景中一般长连接对应的业务的并发量并不会很高。 综合这两个方面持续的到达一定量的高并发短连接会使服务器因端口资源不足而拒绝为一部分客户服务。同时这些端口都是服务器临时分配无法用SO_REUSEADDR选项解决这个问题。
查询tcp连接数
netstat -ant|awk /^tcp/ {S[$NF]} END {for(a in S) print (a,S[a])}命令解析:
netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.48.2:55618 162.14.221.120:63723 ESTABLISHED
tcp 0 0 127.0.0.1:49812 127.0.0.1:30001 ESTABLISHED
tcp 0 0 192.168.48.2:443 223.104.68.23:64059 ESTABLISHEDawk /^tcp/
滤出tcp开头的记录屏蔽udp, socket等无关记录NF
表示输出的列的总数(比如:
netstat -ant|awk /^tcp/ {print NF }
6)$NF
表示最后一个列(也可以定义想要的列比如$1就是上述输出的tcp列)即输出最后一个列的内容(就是上述State列的所有内容)S
S[]相当于定义了一个名叫S的数组S[$NF]
相当于把最后一列相同的计数加1统计每个状态的数量END
表示在最后阶段要执行的命令{for(a in S) print (a,S[a])}
遍历这个S数组 并打印数组的key和value(即不同状态和对应的数量)查询结果:
LISTEN 8
CLOSE_WAIT 1
ESTABLISHED 88
FIN_WAIT2 1
TIME_WAIT 115状态描述:
CLOSED无连接是活动的或正在进行
LISTEN服务器在等待进入呼叫
SYN_RECV一个连接请求已经到达等待确认
SYN_SENT应用已经开始打开一个连接
ESTABLISHED正常数据传输状态
FIN_WAIT1应用说它已经完成
FIN_WAIT2另一边已同意释放
ITMED_WAIT等待所有分组死掉
CLOSING两边同时尝试关闭
TIME_WAIT另一边已初始化一个释放
LAST_ACK等待所有分组死掉如何尽量处理TIMEWAIT过多:
1.打开系统的TIMEWAIT重用和快速回收
1.1编辑内核文件/etc/sysctl.conf加入以下内容
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 时间然后执行 /sbin/sysctl -p 让参数生效.
/etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口它包含一些TCP/IP堆栈和虚拟内存系统的高级选项修改内核参数永久生效。
1.2.
vi /etc/sysctl.conf
net.ipv4.tcp_keepalive_time 1200
#表示当keepalive起用的时候TCP发送keepalive消息的频度。缺省是2小时改为20分钟。
net.ipv4.ip_local_port_range 1024 65000
#表示用于向外连接的端口范围。缺省情况下很小32768到61000改为1024到65000。
net.ipv4.tcp_max_syn_backlog 8192
#表示SYN队列的长度默认为1024加大队列长度为8192可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets 5000
#表示系统同时保持TIME_WAIT套接字的最大数量如果超过这个数字TIME_WAIT套接字将立刻被清除并打印警告信息。
默认为180000改为5000。对于Apache、Nginx等服务器上几行的参数可以很好地减少TIME_WAIT套接字数量但是对于 Squid效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量避免Squid服务器被大量的TIME_WAIT套接字拖死。2.负载均衡来抗这些高并发的短请求
参考来源