2017-06-17 57 views
3

我已經被甲骨文閱讀this socket tutorial和偶然發現了以下文字:在tcp連接中,服務器如何可能在一瞬間處理超過65535個客戶端?

如果一切順利的話,服務器接受連接。一旦接受,服務器將獲得綁定到同一本地端口的新套接字,並且其遠程端點將設置爲客戶端的地址和端口。它需要一個新的套接字,以便它可以繼續監聽原始套接字的連接請求,同時適應所連接的客戶端的需要。

現在,如果我沒有錯,那麼端口大小是16位,這限制了65K左右端口的最大數量。這意味着,如果服務器的所有端口都綁定到某個客戶端本地端口,則無法在任何時候處理超過65535個連接。雖然在stackoverflow上的一些答案如this表明對活動連接沒有限制。什麼是對的,什麼是錯的?

編輯1:如果確實是一個服務器不能處理超過2^16-1的連接,那麼如何像Google網站處理這一限制?

回答

3

唯一的TCP連接是由客戶端IP,客戶端端口,服務器的IP和服務器端口的唯一組合來定義。對於特定的服務服務器,IP和端口是恆定的(即端口80用於HTTP),但客戶端IP和端口可能會有所不同。由於端口範圍僅僅是1..65535這意味着服務器只能處理從在同一時間同一客戶端IP地址最多65535不同的連接,因爲這些是連接元組的時候只有所有可能的唯一組合端口可以​​改變。但是,如果有多個IP地址不同的客戶端,則這些限制分別適用於這些客戶端。然後,如果您查看不同IP地址(IPv4和IPv6)的數量,您會發現服務器理論上可以處理的連接數量基本上沒有實際限制。

在實踐中每一個TCP連接在服務器需要存儲器,因爲當前狀態必須保持。需要在內核及應用描述符文件和應用協議狀態等附加的存儲器這意味着,有基於這可能是小於64K而且方式更多,這取決於該系統和其配置在機器的資源的實際限制。

-1

他們使用你的ISP像NAT(網絡地址轉換)。 你可以在路由器後面訪問不同的電腦,因爲你的路由器的路由映射到內部的PC。

E.g.谷歌數據中心做同樣的事情。將「Google.com」映射到不同的內部服務器,允許他們總共接受超過65k的連接。

相關問題