net.core.rmem_max和net.ipv4.tcp_rmem之间的区别是什么?

什么是net.core.rmem_max和net.ipv4.tcp_rmem的第三个值之间的区别?对于tcp连接,哪个具有更高的优先级? 对于下面的两个示例,tcp连接的最大缓冲区是多少?
Case 1:
sysctl -w net.core.rmem_max=7388608
sysctl -w net.ipv4.tcp_rmem='4096 87380 8388608'

Case 2:
sysctl -w net.core.rmem_max=8388608
sysctl -w net.ipv4.tcp_rmem='4096 87380 7388608'

与TCP相关的优先级? - Nils
@Nils 是的,针对TCP连接。 - bydsky
1个回答

核心是整体的最大接收缓冲区,而tcp只涉及该协议。 至于优先级问题: 似乎tcp设置将优先于常规的最大设置,这有点令人困惑。设置最大对当前的tcp设置没有影响(在CentOS 5上进行了测试)。 更正确的描述应该是:default_max - 但可能太长了。

2你的解释是有道理的,但这和man tcp关于tcp_rmem最大值的说法相冲突:“每个TCP套接字使用的接收缓冲区的最大大小。此值不会覆盖全局net.core.rmem_max”- 请参考http://stackoverflow.com/questions/31546835/tcp-receiving-window-size-higher-than-net-core-rmem-max。那么`man tcp`是错误的吗? - nh2
@nh2 这并不是第一次出现 man 手册错误的情况。 - Nils
2你是怎么具体测试的? - Wildcard
1@Wildcard 在设置完第一个值后,我读取了其他的值。 - Nils
3@Nils,仅仅读取数值并不能告诉你是否有一个覆盖另一个的情况 - 你必须实际尝试获取一个超过net.core.[wmem/rmem]_max缓冲区大小的TCP缓冲区,以测试这种覆盖。 - Jordan Pilat
1我已经在这里报告了明显的 man 手册错误:https://bugzilla.kernel.org/show_bug.cgi?id=209327 - nh2