socket 程式設計時,單機最多可以建立多少個 tcp 連線,受到作業系統的影響。
windows 下單機的tcp連線數受多個引數影響:
最大tcp連線數
[hkey_local_machine \system \currentcontrolset \services \tcpip \parameters]
tcpnumconnections = 0x00fffffe (default = 16,777,214)
以上登錄檔資訊配置單機的最大允許的tcp連線數,預設為 16m。這個數值看似很大,這個並不是限制最大連線數的唯一條件,還有其他條件會限制到tcp 連線的最大連線數。
最大動態埠數
tcp客戶端和伺服器連線時,客戶端必須分配乙個動態埠,預設情況下這個動態埠的分配範圍為 1024-5000 ,也就是說預設情況下,客戶端最多可以同時發起3977 個socket 連線。我們可以修改如下登錄檔來調整這個動態埠的範圍
[hkey_local_machine \system \currentcontrolset \services \tcpip \parameters]
maxuserport = 5000 (default = 5000, max = 65534)
最大tcb 數量
系統為每個tcp 連線分配乙個tcp 控制塊(tcp control block or tcb),這個控制塊用於快取tcp連線的一些引數,每個tcb需要分配 0.5 kb的pagepool 和 0.5kb 的non-pagepool,也就說,每個tcp連線會占用 1kb 的系統記憶體。
系統的最大tcb數量由如下登錄檔設定決定
[hkey_local_machine \system \currentcontrolset \services \tcpip \parameters]
maxfreetcbs = 2000 (default = ram dependent, but usual pro = 1000, srv=2000)
非server版本,maxfreetcbs 的預設值為1000 (64m 以上物理記憶體)
server 版本,這個的預設值為 2000。
也就是說,預設情況下,server 版本最多同時可以建立並保持2000個tcp 連線。
最大tcb hash table 數量
tcb 是通過hash table 來管理的,下面登錄檔設定決定了這個hash table 的大小
hkey_local_machine \system \currentcontrolset \services \tcpip \parameters]
maxhashtablesize = 512 (default = 512, range = 64-65536)
這個值指明分配 pagepool 記憶體的數量,也就是說,如果maxfreetcbs = 1000 , 則 pagepool 的記憶體數量為 500kb
那麼 maxhashtablesize 應大於 500 才行。這個數量越大,則hash table 的冗餘度就越高,每次分配和查詢 tcp 連線用時就越少。這個值必須是2的冪,且最大為65536.
參考: ibm websphere voice server 在windows server 2003 下的典型配置
maxuserport = 65534 (decimal)
maxhashtablesize = 65536 (decimal)
maxfreetcbs = 16000 (decimal)
二、個人總結
tcp/ip 協議規定的,只用了2個位元組表示埠號。容易讓人誤解為1個server只允許連線65535個client。
typedef struct _network_address_ip
network_address_ip, *pnetwork_address_ip;
(1)其實65535這個數字,只是決定了伺服器端最多可以擁有65535個bind的socket。也就是說,最多可以開65535個伺服器程序,但是你要知道這個能夠連線客戶端的數量沒有任何關係,accept過來的socket是不需要bind任何ip位址的,也沒有埠占用這一說。作為server端的socket本身只負責監聽和接受連線操作。
(2)tcp協議裡面是用[源ip+源port+目的ip+目的 port]來區別兩個不同連線,所以連入和連出是兩個不同的概念。連出connect就不錯了,需要生成隨機埠,這個是有限的連入的話, 因socket的分配受記憶體分頁限制,而連接受限制(windows)。
(3)所以,千萬不要誤以為1個server只允許連線65535個client。記住,tcp連出受埠限制,連入僅受記憶體限制。
例如server,ip:192.168.16.254,port:8009
client1:ip:192.168.16.1,port:2378
client2:ip:192.168.16.2,port:2378
client1和client2雖然port相同,但是ip不同,所以是不同的連線。
(4)想讓1個server併發高效得連線幾萬個client,需要使用iocp「完成埠(completion port)」的技術。
詳情請參考文章:
三、書籍推薦
《linux多執行緒服務端程式設計:使用muduo c++網路庫》,陳碩著。
請查閱「附錄d,關於tcp併發連線的幾個思考題與試驗」。
Windows Socket 程式設計
伺服器端 客戶端 在 http fayaa.com code 處理的高亮顯示效果 c 語言 臨時自用 include include void main if lobyte wsadata wversion 1 hibyte wsadata wversion 1 socket socksrv soc...
Windows Socket程式設計
windows下socket程式設計主要包括以下幾部分 服務端1 初始化windows socket庫。2 建立socket。3 繫結socket。4 監聽。5 accept。6 接收 傳送資料。客戶端1 初始化windows socket庫。2 建立socket。3 連線socket。4 接收 傳...
Windows Socket程式設計
1 初始化windows socket庫。2 建立socket。3 繫結socket。4 監聽。5 accept。6 接收 傳送資料。1 初始化windows socket庫。2 建立socket。3 連線socket。4 接收 傳送資料。服務端每接收到乙個客戶端的socket,則建立乙個執行緒。滿...