TCP端口号重用,TCP重传

面对由于HTTP通信的TCP端口重用和重传导致的问题。

我的部署如下:

在这里输入图像说明

我有一个鱿鱼代理安装在一个unix机器发送处理http请求来自信任的来源。 然后,Squid转发到一个URLfilter,其中有一个白名单和黑名单列表。 这个URL过滤引擎将根据规则允许/阻止URL。

从客户端我已经运行一个脚本,不断循环到www.naukri.com 500 wget。 这个URL在URL过滤引擎上被封锁了。

在一些请求〜120 wget之间挂了正确的1分钟之间。 在这个挂起状态期间,我在服务器上使用了tcpdump,发现它显示“TCP端口号重用”,并开始发送同一个端口的同步数据包,这个数据包与之前使用的端口相同,并显示“TCP Retransmisson”。 也收到FIN,ACK和RST为先前的请求。

附上tcp dump截图供参考:

在这里输入图像说明

您能否让我知道为什么它使用相同的端口来处理新请求并重新传输数据包? 有没有办法避免端口重用?

为什么它为新的请求使用相同的端口并重新发送数据包?

它重用相同的端口,因为这样做效率更高。

这里有一个很好的exaplanation: https ://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-meant

重新发送? 什么重新传送? 可能有分组重传,但是这些应该完全与端口重用问题分离。

我刚刚遇到类似的问题。 (与lockd不是httpd)。

这里的问题是你的远程服务器是closures连接的一个FIN包。

当它这样做时,它将连接置于TIME_WAIT状态 – 特别是应该忽略任何额外的数据包,以防有额外的碎片仍然在飞行/走不同的networking路线。

所以它将忽略应用程序发送的附加数据包,直到服务器上的TIME_WAIT到期为止。

您的客户端没有得到这些数据包的ACK ,所以它重新传输。 (这也被忽略,直到TIME_WAIT过期。

至于为什么发送一个FIN数据包? 很难说。 这是服务器。 但是,如果你看起来像拒绝服务攻击,这可能是为什么。

但是,你应该真的把CLOSE_WAIT状态陷入你的客户端,如果发生这种情况, 不要重用你的套接字。

重用TCP端口本身并不是一件坏事。 正如symcbean所指出的那样,它更有效率,可能在您的示例中显而易见,因为您很快就会打开大量新的套接字。 我在截图的截图中看到,自启动该过程以来,已经有2秒钟的时间,并且提到在120个连接之后卡住了,这是2秒内的很多新连接。

您所看到的重传可能是由于networking中的其他人丢弃了您的任何其他SYN数据包。 来自同一台主机的每秒60个新连接被几乎每个networking和安全pipe理员认为是有害的,防火墙甚至代理上的任何默认设置都将悄悄地开始丢弃您的stream量。

如果你想模拟用户负载,恐怕你做的不对。 来自几个不同的主机的每秒60个新的连接是好的,但是如果它们来自单个主机则是不现实的。 实际上,用户的浏览器会将连接到单个主机的连接数限制在6到12之间(取决于浏览器和版本)。 一些浏览器认为代理是单个主机,但其他浏览器对代理也有不同的限制(最多15个并发)。

你可以通过调整configuration来绕过Squid的限制,但这又是一个不切实际的testing。