在TCP應用程式中,雙方的通訊是連線導向的,在同一台電腦上的多個串連需要能相互區別。TCP協議裡面是用[源IP+源Port+目的IP+目的Port]來區別兩個不同串連的。也就是說,只要這四個參數中有一個以上不同,這兩個串連就不同。在BBS上面看到很多人簡單地認為可使用的連接埠個數是可建立的串連的限制因素,其實這個不對的。服務端和用戶端軟體的串連限制因素是不同的,下面我們分別來看看。
在服務端軟體中,會有一個連接埠用來監聽接受用戶端的串連,站在用戶端的角度來看,它叫目的連接埠,不同電腦串連到服務端該連接埠的串連的IP(即源IP)必然不同,而同一台電腦的兩個不同串連則使用不同的連接埠(即源連接埠)串連到服務端的。不管有幾個用戶端串連,服務端只使用了一個連接埠,服務端通過源IP和源連接埠來識別不同的客戶。有人就會問難道服務端能接受無數個串連。理論上是這樣的,但事實並非如此,因為系統每建立一個串連都要使用一定的分頁記憶體和非頁面緩衝池的記憶體,而電腦的記憶體資源不可能無限,因此服務端也不可能接受無數的串連。當串連數達到一定數目時,可能就會出現10055的錯誤,這個錯誤就是告訴你記憶體資源不足了。具體的記憶體資源和可接受串連數的限制關係有空的時候再另外寫一篇。
用戶端和服務端不同,用戶端每發起一個串連都要使用一個隨機的連接埠,稱為臨時連接埠。因為連接埠的範圍是0~65535,而1024以下的是系統保留的連接埠,因此理論上最多可以有65535-1024個連接埠可以使用,但實際測試卻發現可能5000個串連都達不到就會出現10048的錯誤。其實這是因為windows系統設定了限制。在windows中這個臨時連接埠預設的範圍是1024~5000,也就是只有3977個可用連接埠,如果再多就會不行了,會出現10048的錯誤。當然有可能還沒到達這麼多個就出現記憶體資源不足的錯誤了,因為用戶端和服務端一樣,也會受記憶體資源因素的限制。但這是硬體資源上的問題,我們主要看一下怎麼調整這個臨時連接埠範圍的限制。windows提供了一種方法來解決這個問題,在註冊表HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下建一個MaxUserPort的雙位元組值,指定最大的臨時連接埠個數,比如改為10000,那可用的臨時連接埠範圍就是1024~10000了。該參數最大可以改到65534。
修改MaxUserPort貌似需要重啟電腦才會生效,我修改成50000後,發起5000個串連到服務端就一部分串連出現10048的錯誤。重啟後連了近2萬個串連,始終沒有出現10048的錯誤。