3 回答

TA貢獻1951條經驗 獲得超3個贊
當與這些服務器之一建立連接時,我假設它們繼續從隨機建立的 TCP 連接與隨機端口進行通信。
錯誤的假設。它們使用正在偵聽的相同本地端口號與客戶端通信。
那么,當使用一個IP,并且有64K端口時,如何保持10M連接?
不是問題。
連接是否由 IP 端口對識別?
是的。
可以建立從不同 IP 到同一端口的兩個不同連接嗎?
是的。
這是如何在引擎蓋下工作的?
往上看。IP:端口對。你是在自問自答。

TA貢獻1806條經驗 獲得超5個贊
很抱歉完全改變了我的答案。
如果機器有足夠的內存和處理能力,Linux 可以輕松支持數百萬個打開的套接字。TCP/IP 堆棧允許這樣做,因為操作系統針對給定 TCP 數據包的目標套接字由源和目標 IP 以及端口元組確定。
實現 websocket 協議的服務器只需要偵聽單個 TCP 套接字,通常由 HTTP 或 HTTPS 端口號定義,但在本示例中不需要。作為標準 TCP 握手的一部分,當接收到作為 websocket 請求的 HTTP 請求時,服務器操作系統和應用程序為與新客戶端的 TCP 連接打開一個唯一的套接字。websocket 包負責將這個新套接字上使用的協議從標準 HTTP 升級到 websocket。
在示例中,為每個 websocket 套接字啟動了一個 goroutine。
客戶端,即發起 TCP 連接的一側,受到其操作系統可以為給定目標主機和端口打開的臨時端口數量的限制。老實說,我不知道這是客戶端操作系統的限制還是 TCP/IP 規范本身的限制。

TA貢獻1828條經驗 獲得超13個贊
我認為您缺少的部分是 TCP 連接實際上是兩對 IP:PORT。
一種用于服務器,一種用于客戶端。
tcp 套接字的偵聽端通??偸窍嗤?IP/端口對。
示例:net.Listen("tcp", ":8080")
正在偵聽端口 8080(在這種情況下在所有接口上)
連接(客戶端)端通常使用單個傳出 IP 和隨機端口。
示例:net.Dial("tcp","server:8080)
選擇一個隨機可用的臨時端口,然后嘗試連接到server:8080
。
因此,在上面的示例中,該連接是:(client.ip:32768 -> server.ip:8080
其中 32768 是所選的臨時端口)
這兩對組合形成了獨特的聯系。
服務器端可以從單個客戶端獲取與可用(客戶端)端口一樣多的連接。如果有 IP 地址,也可以使用盡可能多的客戶端。
把它想象成,對于一個監聽套接字,理論上你可以有 2^16(ports) * 2^32(ipv4 addrs) 個連接。
實際上,有保留的 IP、端口、內存限制等,因此數量要少得多。
例如,Linux 上的臨時端口范圍是 32768 - 61000。這意味著如果我net.Dial("tcp", "server:8080")
超過 28232 次,我將開始收到錯誤,因為我將用盡給定服務器地址的臨時端口范圍。但是,如果服務器正在偵聽 2 個單獨的端口,我可以對第一個端口執行 28232,對第二個端口執行另一個 28232。
當您看到人們進行 10MM 連接測試時,他們必須使用多個客戶端 IP 或多個服務器 IP/端口來實現這一點(或兩者的組合以獲得 10MM 唯一的客戶端:ip/服務器:ip 對)
- 3 回答
- 0 關注
- 196 瀏覽
添加回答
舉報