65535與TCP連線數的關係測試結論
阿新 • • 發佈:2020-04-21
首先說結論:
-
一臺主機上只能保持最多65535個TCP連線是嗎?
- 客戶端是這樣的,服務端不是
-
是否有關係
- .有關係
-
對於客戶端
- 對於客戶端來說,只有65535,因為根據TCP四元組的sport來說,sport只有16位,所以(2^16)-1是65535。也就是最多有65535個可用埠,這裡只說長連結,不包括SOCK_REUSEOPT
- 但是,並不能說,一個客戶端可以保持到同一個伺服器65535個連線,因為
- 1024以下,由系統佔用
- local_port_range引數控制了可用埠範圍
sctl -a |grep port_rangenet.ipv4.ip_local_port_range = 50000 65000 -----意味著50000~65000埠可用
可以通過修改ip_local_port_range來擴大範圍,但是也只能到65535
-
.對於服務端來說
- 65535的限制,是針對單個客戶端IP的連結的
- 調整MAX OPEN FILE即可保持更多連線
- 調整 ip_local_port_range 支援更大的埠範圍(不過應該沒有什麼客戶端需要建立這麼多的埠吧?)
-
- .有關係
遇到的錯誤碼:
- Cannot assign requested address.
- 其實就是埠範圍不足
- too many open files(開啟的檔案過多)
- 修改最大開啟數就行
測試環境:
- 5臺ubuntu 2G 2U,其中一臺作為SERVER
測試結果:
- 因為我當時設定的MAX OPEN FILE是102400, 最大測試到102100左右的長連結(ESTABLISHED狀態),並沒有全等於102400個,因該有一些被系統佔用了
測試程式碼
下邊是測試程式碼地址,修改上邊兩個引數,使用兩臺機器測試一下
https://gist.github.com/lisqorz/165204c1703b3cad325231ecbade3876
擴充套件閱讀
有興趣瞭解四元組的可以下邊的文章
https://www.cnblogs.com/ouzi/archive/2012/10/29/2745430.html
有興趣看描述符的操作的,可以看這個
https://blog.csdn.net/u011436427/article/details/103215