我有以下问题:
我有 sockfd = socket(AF_INET, SOCK_STREAM, 0)
在我设置并绑定套接字后(让我们说sockfd.sin_port = htons(666)),我立即执行:
listen(sockfd, 3);
sleep(50); // for test purposes
Run Code Online (Sandbox Code Playgroud)
我正在睡觉50秒来测试积压参数,这似乎被忽略了,因为我可以在端口666上建立连接*超过3次.
*:我的意思是我从客户端发送的每个第N个SYN(n> 3)获得一个syn/ack并放置在侦听队列中,而不是被丢弃.可能有什么不对?我已经阅读了listen(2)和tcp(7)的手册页,发现:
使用Linux 2.2更改了TCP套接字上的backlog参数的行为.现在它指定了等待接受的完全建立的套接字的队列长度,而不是未完成的连接请求的数量.可以使用/ 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()积压的目的.