from:http://www.ideawu.net/blog/archives/533.html

"因?yàn)門(mén)CP端口號(hào)是16位無(wú)符號(hào)整數(shù), 最大65535, 所以一臺(tái)服務(wù)器最多支持65536個(gè)TCP socket連接." - 一個(gè)非常經(jīng)典的誤解! 即使是有多年網(wǎng)絡(luò)編程經(jīng)驗(yàn)的人, 也會(huì)持有這個(gè)錯(cuò)誤結(jié)論.

要戳破這個(gè)錯(cuò)誤結(jié)論, 可以從理論和實(shí)踐兩方面來(lái).

理論

系統(tǒng)通過(guò)一個(gè)四元組來(lái)唯一標(biāo)識(shí)一條TCP連接. 這個(gè)四元組的結(jié)構(gòu)是{local_ip, local_port, remote_ip, remote_port}, 對(duì)于IPv4, 系統(tǒng)理論上最多可以管理2^(32+16+32+16), 2的96次方個(gè)連接.

因?yàn)閷?duì)于同一臺(tái)服務(wù)器來(lái)說(shuō), 一般只有一個(gè) local_ip, 那么, 同一臺(tái)服務(wù)器可以管理 2^(16+32+16) 個(gè)連接. 而一個(gè)服務(wù)(進(jìn)程, 如 Nginx 進(jìn)程)一般只監(jiān)聽(tīng)一個(gè) local_port, 那么, 同一臺(tái)服務(wù)就可以管理 2^(32+16) 個(gè)連接. 而如果從一臺(tái)遠(yuǎn)端機(jī)器(所謂的 client)來(lái)連接這臺(tái)服務(wù)器上的一個(gè)服務(wù), 那么 local_ip, local_port, remote_ip 這3個(gè)變量是固定的, 那么, 就只能建立 2^16=65536 個(gè)連接了. 這就是經(jīng)典的誤解的來(lái)源!

如果不僅僅考慮TCP, 則是一個(gè)五元組, 加上協(xié)議號(hào)(TCP, UDP或者其它).

實(shí)踐

服務(wù)器綁定一個(gè)ip:port, 然后accept連接, 所有accept的連接使用的本地地址也是同樣的ip:port.

擴(kuò)展內(nèi)容

如果某個(gè)客戶端向同一個(gè)TCP端點(diǎn)(ip:port)發(fā)起主動(dòng)連接, 那么每一條連接都必須使用不同的本地TCP端點(diǎn), 如果客戶端只有一個(gè)IP則是使用不同的本地端口, 該端口的范圍在*nix系統(tǒng)上的一個(gè)例子是32768到61000, 可以通過(guò)如下命令查看:

[root@benegg.com ~]# cat /proc/sys/net/ipv4/ip_local_port_range  32768   61000 

也就是說(shuō), 一個(gè)客戶端連接同一個(gè)服務(wù)器的同一個(gè)ip:port(比如進(jìn)行壓力測(cè)試), 最多可以發(fā)起30000個(gè)左右的連接.

TCP客戶端(TCP的主動(dòng)發(fā)起者)可以在同一ip:port上向不同的服務(wù)器發(fā)起主動(dòng)連接, 只需在bind之前對(duì)socket設(shè)置SO_REUSEADDR選項(xiàng).

系統(tǒng)支持的最大打開(kāi)文件描述符數(shù)(包括socket連接):

[root@benegg.com ~]# cat /proc/sys/fs/file-max 580382 

單個(gè)進(jìn)程所能打開(kāi)的最大文件描述符數(shù):

[root@benegg.com ~]# ulimit -n 1024 

結(jié)論

無(wú)論是對(duì)于服務(wù)器還是客戶端, 認(rèn)為"一臺(tái)機(jī)器最多建立65536個(gè)TCP連接"是沒(méi)有根據(jù)的, 理論上遠(yuǎn)遠(yuǎn)超過(guò)這個(gè)值.

另外, 對(duì)于client端, 操作系統(tǒng)會(huì)自動(dòng)根據(jù)不同的遠(yuǎn)端 ip:port, 決定是否重用本地端口.

Related posts:

  1. 連連看游戲開(kāi)發(fā)實(shí)踐(1) – 算法
  2. 對(duì)P2P應(yīng)用不友好的NAT
  3. Tomcat網(wǎng)站server.xml設(shè)置
  4. P2P穿透NAT的思路
  5. SSDB 的雙主和多主配置
Posted by ideawu at 2010-07-16 16:44:50