Linux
儘管使用了不同的目標埠,但客戶端埠耗盡
在閱讀埠耗盡時,我經常看到它考慮了 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 轉儲:
bind(1490, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("172.24.131.110")}, 16) = 0 getsockname(1490, {sa_family=AF_INET, sin_port=htons(50929), sin_addr=inet_addr("172.24.131.110")}, [16]) = 0 connect(1490, {sa_family=AF_INET, sin_port=htons(9088), sin_addr=inet_addr("172.24.131.97")}, 16) = -1 EINPROGRESS (Operation now in progress)
根據我的理解,在這種情況下,您確實回到了不同客戶端的唯一池,因為在綁定時您在遠端端沒有任何資訊。
關於這個主題的有用連結:https ://idea.popcount.org/2014-04-03-bind-before-connect/