linux tcp server端未調用accept, client端連接成功解決思路

tags:    時間:2014-03-23 19:21:16
linux tcp server端未調用accept, client端連接成功
今天做測試,server<->client。server調用listen沒有調用accept, client端connect成功。有沒有大牛解答下

netstat 網路連接狀況如下,ESTABLISHED 表明3次握手已經建立起來了。但是查看不到服務端的進程號。
[root@localhost ~]# netstat -antpl|grep 7001
tcp        0      0 0.0.0.0:7001                0.0.0.0:*                   LISTEN      23348/tcpserver     
tcp       11      0 192.168.5.45:7001           192.168.5.45:49746          ESTABLISHED -       
            
tcp        0      0 192.168.5.45:49746          192.168.5.45:7001           ESTABLISHED 23349/tcpclient    
------解決方案--------------------
server端調用listen后,在內核層是默認有accept的隊列的,默認好像是3個. 這個時候需要用戶層主動調用accept將socket取出來。 你可以做個嘗試, server只listen不accpet,開啟多個client去連接server,看看能連上幾個。
------解決方案--------------------
有哪個大牛來說說原理,沒有調用accept,為何也能建立連接呢?
------解決方案--------------------
你理解可能有偏差。
accept的本質並不是觸發三次握手過程,而是「如果某個鏈接完成了三次握手,則喚醒被阻塞的accept調用」。

在你調用listen的時候,系統已經準備了一個小隊列,用於接收匹配的客戶端連接。這也是為什麼listen函數帶了一個隊列大小參數。
listen調用成功后,客戶端連接上來會完成三次握手,不需要你干預。如果你調用accept,則系統會從已經完成三次握手的鏈接中返回返回給你一個。

這個可以通過wireshark抓包來證實。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網