a.可靠地实现tcp全双工连接的终止,在进行关闭连接四次挥手协议时,末了的ack是由主动关闭端发出的,如果这个终极的ack丢失做事器将重发终极的fin,因此客户端必须掩护状态信息许可它重发终极的ack,如果不坚持这个状态信息,那么客户端将相应rst分节,做事器将此分节阐明成一个缺点,因而要实现tcp全双工连接的正常终止,必须处理终止序列四个分节中任何一个分节丢失的情形,主动关闭的客户端必须坚持状态信息进入time_wait状态。
b.许可老的重复分节在网络中消逝,tcp分节可能由于路由器非常而迷途,在迷途期间,tcp发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到终极的目的地,这个原来迷途的分节就称为lost duplicate。在关闭一个tcp连接后,立时又重新建立起一个相同的ip地址和端口之间的tcp连接,后一个连接被称为前一个连接的化身,那么有可能涌现这种情形,前一个连接的迷途重复分组在前一个连接终止后涌现,从而被误解成从属于新的化身。为了避免这个情形,tcp不许可处于time_wait状态的连接启动一个新的化身,因此time_wait状态坚持连续2MSL,就可以担保当建立一个tcp连接的时候,来自连接先前化身的重复分组已经在网络中消逝。
2.大量time_wait造成的影响

在高并发短连接的tcp做事器上,当做事器处理完要求后急速主动正常关闭连接,这个场景下会涌现大量socket处于time_wait状态,如果客户真个并发量持续很高,此时部分客户端就会显示连接不上。主动正常关闭tcp连接,都会涌现time_wait。
为什么我们要关注这个高并发短连接呢,有两个方面须要把稳。
1.高并发可以让做事器在短韶光范围内同时占用大量端口,而端口有个0~35535的范围,并不是很多。
2.在这个场景下,短连接表示 业务处理+传输数据的韶光 远远小于time_wait超时的韶光
总结:长连接不须要考虑time_wait状态,持续的到达一定量的高并发短连接,会使做事器因端口资源不敷而谢绝为一部分客户做事,同时这些端口都是做事器临时分配的,无法用so_reuseaddr选项办理这个问题。
关于time_wait的反思:
存在即合理,既然tcp协议能盛行四十多年就证明它的设计合理性,以是我们尽可能的利用其原来功能依赖time_wait状态来担保我的做事器程序健壮,做事功能正常。可以采取负载均衡来反抗高并发的短要求。
如何只管即便处理time_wait过多?大略来说便是打开系统的time_wait重用和快速回收
编辑内核文件 /etc/sysctl.conf加入以下内容net.ipv4.tcp_syncookies = 1 //表示开启syn cookies 当涌现syn等待对列溢出时,启用cookies来处理net.ipv4.tcp_tw_reuse = 1//表示开启重用 许可time_wait sockets重新用于新的tcp连接net.ipv4.tcp_tw_recycle=1//表示开启tcp连接中time_wait socket的快速回收net.ipv4.tcp_fin_timeout=1 //修正系统默认的timeout韶光