Debian Stretch 源 tcp 端口*始终*偶数

Debian Stretch 源 tcp 端口*始终*偶数

在使用 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 值奇偶校验

您可能还想看后续提交 1580ab63fc9a03593072cc5656167a75c4f1d173

相关内容