關(guān)于TCP服務(wù)器最大并發(fā)連接數(shù)有一種誤解就是“因?yàn)槎丝谔柹舷逓?5535,所以TCP服務(wù)器理論上的可承載的最大并發(fā)連接數(shù)也是65535”仰楚。
先說結(jié)論:對于TCP服務(wù)端進(jìn)程來說万伤,他可以同時連接的客戶端數(shù)量并不受限于可用端口號。并發(fā)連接數(shù)受限于linux可打開文件數(shù)粒氧,這個數(shù)是可以配置的,可以非常大节腐,所以實(shí)際上受限于系統(tǒng)性能外盯。
從理論上說,端口號的作用是在網(wǎng)絡(luò)連接中標(biāo)識應(yīng)用層的進(jìn)程翼雀,服務(wù)端一般使用眾所周知的端口號進(jìn)行監(jiān)聽饱苟,客戶端連接時系統(tǒng)自動分配端口號。一個服務(wù)端進(jìn)程服務(wù)于n個客戶遠(yuǎn)程進(jìn)程狼渊,只需要能通過ip地址+端口號的組合把他們區(qū)分開即可箱熬,沒有必要占用本機(jī)的其他端口號,客戶端連接數(shù)增加并不會占用服務(wù)器端口號狈邑,因此端口號并不能限制并發(fā)連接數(shù)城须。當(dāng)然一臺機(jī)器上端口號數(shù)量的上限確實(shí)是65536個,因?yàn)閠cp首部中使用16bit去存儲端口號米苹。所以如果說65536影響了連接數(shù)糕伐,只有一種可能,就是同一臺客戶端機(jī)子上開n個進(jìn)程去連同一個服務(wù)端進(jìn)程蘸嘶,因?yàn)榭蛻舳薸p是同一個良瞧,為了區(qū)分出這些連接,只能使用客戶端連接的端口號亏较,那么服務(wù)端和一個客戶端主機(jī)之間的tcp連接數(shù)理論上線確實(shí)是65536莺褒。但是,服務(wù)端可以連接n多客戶端機(jī)子呢雪情。
實(shí)際上遵岩,確實(shí)有個限制端口號的配置,就是MaxUserPort巡通,這實(shí)際上是一臺主機(jī)向外連接使用端口數(shù)的限制尘执,這個數(shù)也可以配置的,可能默認(rèn)值才5000宴凉,實(shí)際上對于正常的服務(wù)器主機(jī)是夠用的誊锭,因?yàn)槟闶堑葎e人連接進(jìn)來的,不是要去連接很多不同的其他主機(jī)的弥锄。當(dāng)然你的服務(wù)器上可能跑了一些轉(zhuǎn)發(fā)的服務(wù)丧靡,這樣你就需要對外連接了蟆沫,如果被限制在這個配置這兒了確實(shí)需要改。但是這個MaxUserPort確實(shí)和服務(wù)器可以承載的來自客戶端的并發(fā)連接數(shù)沒有關(guān)系温治。
伴隨這個誤解的還有另外一個誤解饭庞,就是accept之后產(chǎn)生的已連接套接字占用了新的端口。這個絕對是錯誤的熬荆,linux內(nèi)核不會這么寫的舟山,因?yàn)橥耆珱]必要嘛÷笨遥客戶端連接上來之后產(chǎn)生的這個socket fd就是用來區(qū)分客戶端的累盗,里面會填上客戶端的ip和端口作為發(fā)包用,來自客戶端的包也會使用這個fd去讀取突琳∪粽可以試試netstat -ano,然后起一個服務(wù)器看下本今,客戶端連上來這后產(chǎn)生的套接字的服務(wù)端端口還是監(jiān)聽的端口拆座。