Linux

儘管使用了不同的目標埠,但客戶端埠耗盡

  • July 15, 2021

在閱讀埠耗盡時,我經常看到它考慮了 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/

引用自:https://serverfault.com/questions/1069715