在阅读端口耗尽时,我经常看到它考虑了 tcp 连接的四组(src ip、src 端口、dst ip、dst 端口)。因此,如果端口范围为 20000(40000 到 60000),目标端口为 8088 和 8087,并且在同一台机器上有两个客户端,使用相同的 src 地址和 dst 地址,我应该能够打开 40000 个连接。然而,在我的测试中,情况并非如此。即使在这种配置中,我也只能打开 20000 个连接。我已经转储了 ss -s 的输出并按源端口对其进行排序。这是一个摘录:
CLOSE-WAIT 26378 0 172.24.131.110 40001 172.24.131.97 9088
CLOSE-WAIT 25029 0 172.24.131.110 40002 172.24.131.97 9087
CLOSE-WAIT 23840 0 172.24.131.110 40003 172.24.131.97 9087
CLOSE-WAIT 25207 0 172.24.131.110 40004 172.24.131.97 9087
CLOSE-WAIT 25572 0 172.24.131.110 40005 172.24.131.97 9088
CLOSE-WAIT 26334 0 172.24.131.110 40006 172.24.131.97 9087
CLOSE-WAIT 27089 0 172.24.131.110 40007 172.24.131.97 9087
CLOSE-WAIT 23860 0 172.24.131.110 40008 172.24.131.97 9088
CLOSE-WAIT 25463 0 172.24.131.110 40009 172.24.131.97 9087
CLOSE-WAIT 26603 0 172.24.131.110 40010 172.24.131.97 9088
CLOSE-WAIT 25436 0 172.24.131.110 40011 172.24.131.97 9087
ESTAB 0 0 172.24.131.110 40012 172.24.131.97 9087
CLOSE-WAIT 25042 0 172.24.131.110 40013 172.24.131.97 9087
CLOSE-WAIT 25738 0 172.24.131.110 40014 172.24.131.97 9087
CLOSE-WAIT 27363 0 172.24.131.110 40015 172.24.131.97 9088
CLOSE-WAIT 25860 0 172.24.131.110 40016 172.24.131.97 9088
它一直持续到达到值 60000。从来没有一个源端口被使用过两次,就好像值池实际上是通用的一样。是这种情况还是我在某处缺少配置标志?
内核版本是 4.15.0-144-generic。端口范围在这里真正受到控制:如果我将端口范围更改为 40000-50000,我只有 10000 个可能的连接。测试的客户端和服务器是网络测谎工具。
好的,事实上我想我有答案,我正在使用的客户端使用 bind + connect 创建它的连接,而不仅仅是连接。这是一个 strace 转储:
根据我的理解,在这种情况下,您确实回到了不同客户端的唯一池,因为在绑定时您在远程端没有任何信息。
关于这个主题的有用链接:https ://idea.popcount.org/2014-04-03-bind-before-connect/