我有以下问题:
我有sockfd = socket(AF_INET, SOCK_STREAM, 0)
在我设置并绑定套接字后(假设使用sockfd.sin_port = htons(666)
),我立即执行:
listen(sockfd, 3);
sleep(50); // for test purposes
我正在睡觉50秒来测试积压参数,这似乎被忽略了,因为我可以在端口666上建立连接*超过3次。
*:我的意思是我从客户端发送的每个第N个SYN(n> 3)得到一个syn / ack并放在侦听队列中,而不是被丢弃。可能有什么不对?我已经阅读了listen(2)和tcp(7)的手册页,并发现:
使用Linux 2.2改变了TCP套接字上的backlog参数的行为。 现在它指定了等待接受的完全建立的套接字的队列长度,而不是未完成的连接请求的数量。不完整套接字的队列的最大长度可以 使用 的/ proc / SYS /网/的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()
的积压目的。
答案 0 :(得分:38)
listen()
的积压参数只是建议性的。
backlog参数提供提示 执行哪个 实施应用于限制 中的未完成连接数 套接字的侦听队列。
当前版本的Linux内核将其最接近2的最高幂,最小值为16.令人尊敬的代码位于reqsk_queue_alloc()。
答案 1 :(得分:3)
不同的操作系统提供不同数量的排队连接和不同的积压数。 FreeBSD似乎是少数实际上具有1对1映射的操作系统之一。 (来源:http://books.google.com/books?id=ptSC4LpwGA0C&lpg=PA108&ots=Kq9FQogkTr&dq=berkeley%20listen%20backlog%20ack&pg=PA108#v=onepage&q=berkeley%20listen%20backlog%20ack&f=false)