在使用 Azure 负载均衡器调试一些奇怪的行为时,我注意到我的本地 Debian Stretch TCP 堆栈仅与偶数端口建立 TCP 连接。我不会使用奇怪的源端口启动单个 TCP 握手。这是故意的吗?
答案1
这是为了减少connect()
和之间的争用bind()
(出现在 Linux 4.2 中;Jessie 有 3.16,Stretch 有 4.9):
犯罪07f4c90062f8fc7c8c26f8f95324cbe8fa3145a5 作者:埃里克·杜马塞特 日期:2015年5月24日星期日14:49:35 -0700 tcp/dccp:尽量不要在 connect() 中耗尽 ip_local_port_range 繁忙服务器上长期存在的一个问题是可用 TCP 端口很小 范围 (/proc/sys/net/ipv4/ip_local_port_range) 和默认值 connect() 系统调用中源端口的顺序分配。 如果主机有大量活动 TCP 会话,则有可能 非常高,所有端口都被至少一个流使用, 并且后续的bind(0)尝试失败,或者必须扫描大部分 空间寻找插槽。 在此补丁中,我更改了 __inet_hash_connect() 中的起点 因此我们尝试支持偶数 [1] 端口,为 bind() 留下奇数端口 用户。 我们仍然执行顺序搜索,因此不能保证,但是 如果 connect() 目标非常不同,最终结果是我们离开 更多可用于bind()的端口,我们将它们分布在整个范围内, 减少 connect() 和 bind() 查找插槽的时间。 此策略仅在 /proc/sys/net/ipv4/ip_local_port_range 时有效 是偶数,即如果开始/结束值具有不同的奇偶性。 因此,默认的 /proc/sys/net/ipv4/ip_local_port_range 更改为 32768 - 60999(而不是 32768 - 61000) 这里安全方面没有任何变化,只有一些糟糕的散列 计划最终可能会受到这一变化的影响。 [1]:奇/偶属性取决于 ip_local_port_range 值奇偶校验