相比大家都有一些感触,当服务器出现大量tcp连接,尤其出现大量TIME_WAIT连接的时候,客户端会感觉服务器响应速度变慢。那是为什么?

       首先我们先谈谈tcp,如何区分一个TCP和其他TCP的区别是由以下4个值来区分:

source ip  source port   destination ip  destination port

只有当其中至少有一个值不一样,才是不通的tcp连接。

       当某个TCP端点关闭TCP连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的IP和端口号。这类信息只会维持一小段时间,通常是所估计的最大分段使用期的两倍(称为2MSL通常为2分钟)左右,以确保在这段时间内不会创建具有相同的地址和端口号的新连接(source ip source port) 实际上,这个算法可以防止在两分钟内创建,关闭并重新创建两个具有相同的IP地址和端口号的连接。其中这个维持时间不能大于2分钟。为什么呢?因为如果这个值设置太长,有可能导致分组被复制的情况,如果来自之前连接复制分组插入相同连接值的新TCP流,会破坏tcp数据流。

       那这个2MSL的维持时间会跟TIME-WAIT连接有什么问题?

我们举个例子:假设在cs架构中,客户端和服务器进行连接的时候,不同的连接,如下4个值:source ip  

source port  destination ip destination port 中 只有source port这个值进行变化,假设现在设置维持时间为:2分钟  而服务器端口一个有60000个,那么每秒钟最多的不同的连接为:60000/120=500个连接,这个时间client 端的端口会出现耗尽的情况,就出现文章开始说的为什么连接多了,服务器响应慢的问题。

       这个问题其实服务器瓶颈问题,那怎么处理这个问题呢?

1:加多台server 做负载均衡,其实也是变向的增加client端可用的同连接数。

2:确保客户端和服务器在循环使用几个虚拟IP地址,来增加更多的不同连接组合。

即使没有出现遇到端口耗尽的问题,也要注意有大量的连接处于打开状态的情况,或处于等待状态的连接分配了大量控制块情况下。也会导致有些系统速度严重减缓。