這明顯是進入了思維的誤區(qū),65535是指可用的端口總數(shù),并不代表服務(wù)器同時只能接受65535個并發(fā)連接。
舉個例子:
我們做了一個網(wǎng)站,綁定的是TCP的80端口,結(jié)果是所有訪問這個網(wǎng)站的用戶都是通過服務(wù)器的80端口訪問,而不是其他端口。可見端口是可以復用的。
即使linux服務(wù)器只在80端口偵聽服務(wù), 也允許有10萬、100萬個用戶連接服務(wù)器。Linux系統(tǒng)不會限制連接數(shù)至于服務(wù)器能不能承受住這么多的連接,取決于服務(wù)器的硬件配置、軟件架構(gòu)及優(yōu)化。
01
我們知道兩個進程如果需要進行通訊最基本的一個前提是:能夠唯一的標示一個進程。在本地進程通訊中我們可以使用PID來唯一標示一個進程,但PID只在本地唯一,網(wǎng)絡(luò)中的兩個進程PID沖突幾率很大。
這時候就需要另辟它徑了,IP地址可以唯一標示主機,而TCP層協(xié)議和端口號可以唯一標示主機的一個進程,這樣可以利用IP地址+協(xié)議+端口號唯一標示網(wǎng)絡(luò)中的一個進程。
能夠唯一標示網(wǎng)絡(luò)中的進程后,它們就可以利用socket進行通信了。socket(套接字)是在應(yīng)用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應(yīng)用層調(diào)用已實現(xiàn)進程在網(wǎng)絡(luò)中通信。
socket源自Unix,是一種"打開—讀/寫—關(guān)閉"模式的實現(xiàn),服務(wù)器和客戶端各自維護一個"文件",在建立連接打開后,可以向自己文件寫入內(nèi)容供對方讀取或者讀取對方內(nèi)容,通訊結(jié)束時關(guān)閉文件。
02
唯一能夠確定一個連接有4個東西:
1. 服務(wù)器的IP
2. 服務(wù)器的Port
3. 客戶端的IP
4. 客戶端的Port
服務(wù)器的IP和Port可以保持不變,只要客戶端的IP和Port彼此不同就可以確定一個連接數(shù)。
一個socket是可以建立多個連接的,一個TCP連接的標記為一個四元組(source_ip, source_port, destination_ip, destination_port),即(源IP,源端口,目的IP,目的端口)四個元素的組合。只要四個元素的組合中有一個元素不一樣,那就可以區(qū)別不同的連接。
舉個例子:
->你的主機IP地址是1.1.1.1, 在8080端口監(jiān)聽
->當一個來自 2.2.2.2 發(fā)來一條連接請求,端口為5555。這條連接的四元組為(1.1.1.1, 8080, 2.2.2.2, 5555)
->這時2.2.2.2又發(fā)來第二條連接請求,端口為6666。新連接的四元組為(1.1.1.1, 8080, 2.2.2.2, 6666)
那么,你主機的8080端口建立了兩條連接;
->(2.2.2.2)發(fā)來的第三條連接請求,端口為5555(或6666)。第三條連接的請求就無法建立,因為沒有辦法區(qū)分于上面兩條連接。
同理,可以在同一個端口號和IP地址上綁定一個TCP socket和一個UDP socket
因為端口號雖然一樣,但由于協(xié)議不一樣,所以端口是完全獨立的。
TCP/UDP一般采用五元組來定位一個連接:
source_ip, source_port, destination_ip, destination_port, protocol_type
即(源IP,源端口,目的IP,目的端口,協(xié)議號)
綜上所述,服務(wù)器的并發(fā)數(shù)并不是由TCP的65535個端口決定的。服務(wù)器同時能夠承受的并發(fā)數(shù)是由帶寬、硬件、程序設(shè)計等多方面因素決定的。
所以也就能理解淘寶、騰訊、頭條、百度、新浪、嗶嗶嗶嗶等為什么能夠承受住每秒種幾億次的并發(fā)訪問,是因為他們采用的是服務(wù)器集群。服務(wù)器集群分布在全國各地的大型機房,當訪問量小的時候會關(guān)閉一些服務(wù)器,當訪問量大的時候回不斷的開啟新的服務(wù)器。
以上個人淺見,歡迎批評指正。
認同我的看法,請點個贊再走,感謝!
喜歡我的,請關(guān)注我,再次感謝!






