Oli*_*uby 9 networking debian tcp linux-kernel handshake
在使用 Azure 负载平衡器调试一些奇怪的行为时,我注意到我的本地 Debian Stretch TCP 堆栈仅与偶数端口建立 TCP 连接。我不会使用奇怪的源端口启动单个 TCP 握手。这是故意的吗?
Fer*_*ner 12
这是为了减少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 值奇偶性
您可能还想查看后续提交 1580ab63fc9a03593072cc5656167a75c4f1d173。