概述
前段時間,組內的一個小夥伴問了俺一個問題:
調用socket.accept方法,建立連接後,服務器端會爲其創建一個新端口嗎?
客戶端與服務端成功建立連接後,客戶端這邊肯定是需要開啓一個新的端口的,而服務端其實只需要一個監聽端口就行,不用每個新連接一來,就創建一個新的端口。
如上圖,客戶端跟服務端,建立了兩個連接,連接1和連接2,端口分別是59989和59990,而服務端的監聽端口是8080。因此這裏就有個疑問:
客戶端端口爲59989發出的數據,到達服務端的8080端口後,爲啥一定是連接1對應的服務端
socket
來處理呢?能是連接2的嗎?
由於四元組可以唯一確定一個TCP
連接,如下:
{源IP,源端口,目標IP,目標端口}
因此就算目標IP
和目標端口是一樣的,仍然可以通過源IP
和源端口區分一個TCP
連接,因此是不會亂的。
另外,四元組中之所以需要源端口
,是因爲同一個客戶端機器,假設有兩個進程與服務端創建連接,那麼源IP,目標IP,目標端口
這三個是一樣的,無法唯一區分一個TCP
連接,因此需要加多一個源端口
。
查看單進程能打開的文件句柄數
這個要看服務器是怎麼配置的,可以使用如下命令查看單進程能打開的文件句柄數:
ulimit -n
像騰訊雲的機器,好多配置都是10w
以上的。一個TCP
連接會佔用一個文件句柄,文件句柄數越大,也就是表示進程能支持的併發連接數就越大。
端口限制
無論是客戶端服務器還是服務端服務器,最多隻有65535
個。
TCP併發連接數
對於客戶端服務器而言,如果單進程的文件句柄數大於等於64512
的話,那麼最多能有64512
(其中1024個用戶程序是不能用的)個併發連接與服務器打交道。而對於服務端服務器而言,由於使用監聽端口的方式,系統底層就能處理連接了,如果文件句柄數是無限制的,那麼併發連接數是無限制的。