我有以下问题:
我有 sockfd = socket(AF_INET, SOCK_STREAM, 0)
之后我设置并绑定了套接字(比如用sockfd.sin_port = htons(666)
),然后立即执行:
listen(sockfd, 3);
sleep(50); // for test purposes
我正在睡眠50秒以测试backlog参数,但似乎被忽略了,因为我可以在666端口上建立超过3次的连接。
*:我的意思是,对于客户端发送的每个第N个SYN(n> 3)放置在监听队列中,我都会收到一个syn/ack,而不是被丢弃。出了什么问题?我已经阅读了listen(2)和tcp(7)的man页面,并发现:
TCP套接字上backlog参数的行为在Linux 2.2中发生了变化。 现在,它指定等待接受的完全建立的套接字的队列长度,而不是不完整的连接请求的数量。 不完整套接字队列的最大长度可以使用/proc/sys/net/ipv4/tcp_max_syn_backlog来设置。启用syncookies后,没有逻辑最大长度,该设置将被忽略。 更多信息请参见tcp(7)。
但即使使用sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2
和sysctl -w net.ipv4.tcp_syncookies=0
,我仍然得到相同的结果!我一定是错过了什么,或者完全误解了listen()
的backlog目的。
backlog
设置为1时,它会被舍入为2(即下一个最高的2的幂)。但是,即使我使用backlog
1调用listen
,我仍然可以成功地创建100个连接到套接字。 - satoru