socket.accept後,會產生新端口嗎?

概述


前段時間,組內的一個小夥伴問了俺一個問題:

調用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個用戶程序是不能用的)個併發連接與服務器打交道。而對於服務端服務器而言,由於使用監聽端口的方式,系統底層就能處理連接了,如果文件句柄數是無限制的,那麼併發連接數是無限制的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章