服務器最多建立65536個tcp連接嗎?

字號+ 編輯: 种花家 修訂: 种花家 來源: 热门技术 2023-10-19 我要說兩句(0)

“因為TCP端口號是16位無符號整數, 最大65535, 所以一台服務器最多支持65536個TCP socket連接.” – 一個非常經典的誤解! 即使是有多年網路編程經驗的人, 也會持有這個錯誤結論。

要戳破這個錯誤結論, 可以從理論和實踐兩方面來.

理論

TCP連接使用一個四元組來唯一標識,這個四元組包括本地IP地址、本地端口、遠程IP地址和遠程端口。對於IPv4來說,系統理論上最多可以管理2^(32+16+32+16),即2的96次方個連接。

然而,由於同一台服務器通常只有一個本地IP地址,因此該服務器最多可以管理2^(16+32+16)個連接。而一個服務(例如Nginx進程)通常只監聽一個本地端口,因此同一台服務器最多可以管理2^(32+16)個連接。當從一台遠程機器(即客戶端)連接到該服務器上的一個服務時,本地IP地址、本地端口和遠程IP地址這三個變量是固定的,因此最多只能建立2^16=65536個連接。這是一個常見的誤解!

如果考慮的不僅是TCP,而是一個五元組,則還需要加上協議號(TCP、UDP或其他)。

實踐

服務器綁定一個ip:port, 然後accept連接, 所有accept的連接使用的本地地址也是同樣的ip:port.

擴展內容

如果某個客戶端向同一個TCP端點(ip:port)發起主動連接, 那麼每一條連接都必須使用不同的本地TCP端點, 如果客戶端只有一個IP則是使用不同的本地端口, 該端口的範圍在*nix系統上的一個例子是32768到61000, 可以通過如下命令查看:

[root@~]# cat /proc/sys/net/ipv4/ip_local_port_range 
32768   61000

換句話說,當一個客戶端與同一台服務器的相同IP和端口(例如進行壓力測試)建立連接時,最多可以發起大約30000個連接。

TCP客戶端(即主動發起連接的一方)可以在同一個IP和端口上主動連接到不同的服務器,只需在綁定(bind)之前設置socket的SO_REUSEADDR選項。

系統支持的最大打開文档描述符數(包括socket連接):

[root@~]# cat /proc/sys/fs/file-max
580382

單個進程所能打開的最大文档描述符數:

[root@~]# ulimit -n
1024

結論

無論是針對服務器還是客戶端,所謂"一台機器最多建立65536個TCP連接"的說法毫無根據,從理論上來說,這個限制可以遠遠超過的。此外,對於客戶端而言,操作系統會根據不同的遠程IP和端口自動決定是否重用本地端口。

閲完此文,您的感想如何?
  • 有用

    4418

  • 沒用

    260

  • 開心

    310

  • 憤怒

    19

  • 可憐

    18

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • 防止退出linux終端退出之後導致的nohup進程強制退出

  • Linux系統下word文档轉成pdf的辦法

  • ubuntu和debian安裝nginx或者tengine報錯, 找不到pcre依賴庫的解決辦法

  • linux終端下借助awk命令查詢篩出網站access.log日志裡的統計信息

我要說說
網上賓友點評