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抓包来证实。