[英]Maintaning more than 65535 connections on single IP
閱讀以下文章: 10M並發Websocket
因此,有1000個Websocket服務器在端口10000-11000上偵聽。 與這些服務器之一建立連接時,我假設它們會繼續從具有隨機端口的隨機建立的TCP連接進行通信。 那么,當使用一個IP且有64K端口時,一個如何保持10M連接? 連接是否由IP端口對識別? 是否可以建立從不同IP到同一端口的兩個不同連接? 這是如何工作的?
與這些服務器之一建立連接時,我假設它們會繼續從具有隨機端口的隨機建立的TCP連接進行通信。
錯誤的假設。 他們使用與他們監聽相同的本地端口號與客戶端通信。
那么,當使用一個IP且有64K端口時,一個如何保持10M連接?
沒問題
連接是否由IP端口對識別?
是。
是否可以建立從不同IP到同一端口的兩個不同連接?
是。
這是如何工作的?
往上看。 IP:端口對。 你是在自問自答。
很抱歉徹底改變了我的答案。
如果計算機具有足夠的內存和處理能力,則Linux可以輕松支持數百萬個開放套接字。 TCP / IP堆棧允許此操作,因為操作系統針對給定TCP數據包的目標套接字由源IP和目標IP以及端口元組確定。
實施websocket協議的服務器僅需要偵聽通常由HTTP或HTTPS端口號定義的單個TCP套接字,但在此示例中不需要。 作為標准TCP握手的一部分,服務器OS和應用程序在收到作為Websocket請求的HTTP請求時為與新客戶端的TCP連接打開唯一的套接字。 websocket軟件包負責將此新套接字上使用的協議從標准HTTP升級到websocket。
在示例中,為每個websocket套接字啟動了一個goroutine。
客戶端,即發起TCP連接的一側,受其操作系統可以為給定目標主機和端口打開的臨時端口數量的限制。 老實說,我不知道這是客戶端OS還是TCP / IP規范本身的限制。
我認為您缺少的一部分是TCP連接,實際上是兩對IP:PORT。
一台用於服務器,一台用於客戶端。
TCP套接字的偵聽端通常總是相同的IP /端口對。
示例: net.Listen("tcp", ":8080")
在端口8080上偵聽(在這種情況下,在所有接口上)
連接(客戶端)端通常使用單個傳出IP和隨機端口。
示例: net.Dial("tcp","server:8080)
選擇一個隨機的臨時端口,然后嘗試連接到server:8080
。
因此,在上面的示例中,該連接為: client.ip:32768 -> server.ip:8080
: client.ip:32768 -> server.ip:8080
(其中32768是所選的臨時端口)
這兩對結合在一起構成了獨特的聯系。
服務器端可以從單個客戶端獲得與可用(客戶端)端口一樣多的連接。 IP地址也可以占用盡可能多的客戶端。
可以認為,對於一個監聽套接字,理論上可以有2 ^ 16(端口)* 2 ^ 32(ipv4地址)連接。
實際上,有保留的IP,端口,內存限制等,因此數量要少得多。
例如,Linux上的臨時端口范圍是32768-61000。這意味着如果我net.Dial("tcp", "server:8080")
超過28232次,我將開始報錯net.Dial("tcp", "server:8080")
因為我已經用完了臨時端口給定服務器地址的范圍。 但是,如果服務器在2個單獨的端口上偵聽,則可以對第一個端口執行28232,對第二個端口執行另一個28232。
當您看到人們進行10MM連接測試時,他們必須使用多個客戶端IP或多個服務器IP /端口來實現此目的(或兩者結合才能獲得10MM唯一的client:ip / server:ip對)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.