Ros*_*iff 6 freebsd tcp keepalive
在处理在 FreeBSD 上运行并使用 TCP 的服务器应用程序时,我注意到即使我的应用程序明确禁用了 TCP 套接字上的 SO_KEEPALIVE,也会发送 TCP keepalive 探测。
根据RFC1122 第 4.2.3.6 节(TCP Keep-Alives):
“如果包含保持连接,应用程序必须能够为每个 TCP 连接打开或关闭它们,并且它们必须默认为关闭。”
我发现可调参数net.inet.tcp.always_keepalive已启用(设置为 1),禁用它会阻止发送 keepalive 探测器。
在 FreeBSD 中包含这种行为背后的原因是什么?据我所知,Linux 和 Windows 没有这样的选项,但 FreeBSD 和 Mac OS X 有,因此它们违反了 RFC。
更具体地说,在什么情况下忽略应用程序的愿望是有意义的?
在我的情况下,这是一个简单的修复,因为我可以禁用该选项,但我想了解它为什么在那里。
这个问题表明 Linux 的行为符合 RFC。
小智 7
此处给出了默认开启 keep-alive 的基本原理:https : //svnweb.freebsd.org/base?view=revision&revision=47752
添加控制全局 TCP keepalive 的句柄并默认开启。
尽管有它们的名字,但它不会使 TCP 会话保持活动状态,但如果另一端已经AWOL,它会杀死它们。这种情况经常发生在使用 NAT、动态 IP 分配或正常运行时间上限为 2^32 * 10^-3 秒的客户端。
由于此原因,网络流量没有可检测到的增加:对于实时 TCP 连接,每两小时有两个最小的 TCP 数据包。
许多服务器已经启用了keepalive。
主机要求 RFC 已有 10 年历史,并且不知道当今 Internet 正在流失的客户端。
无论如何,如果应用程序要求,最好关闭保持活动状态,例如(在 C 中):
int val = 0;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));
Run Code Online (Sandbox Code Playgroud)
但要解决这个问题并不容易。
| 归档时间: |
|
| 查看次数: |
1544 次 |
| 最近记录: |