linux so reuseaddr,SO_REUSEADDR(setsockopt选项)-Linux是什么意思?

TCP的主要设计目标是在遇到数据包丢失,数据包重新排序以及数据包复制(此处是关键)的情况下,实现可靠的数据通信。

在连接建立时,TCP / IP网络堆栈如何处理所有这些是相当明显的,但是在连接关闭之后会发生一种边缘情况。如果在会话结束时立即发送的数据包被复制并延迟,从而使4向关闭数据包在延迟的数据包之前到达接收器,会发生什么情况?堆栈会尽职地关闭其连接。然后,随后出现延迟的重复数据包。堆栈应该做什么?

更重要的是,如果在给定IP地址+ TCP端口组合上具有打开套接字的程序关闭其套接字,然后过一会儿,程序出现并希望监听相同的IP地址和TCP端口号,该怎么办? ?(典型情况:程序被杀死并迅速重启。)

有两种选择:禁止重用该IP /端口组合至少2倍于数据包可以飞行的最大时间。在TCP中,这通常称为2x MSL延迟。有时您还会看到2× RTT,大致相等。

这是所有常见TCP / IP堆栈的默认行为。2×MSL通常在30到120秒之间,并且在netstat输出中显示为TIME_WAIT周期。在那之后,堆栈假定由于TTL过期而在途中丢弃了任何恶意数据包,因此套接字离开了状态,从而允许重用IP /端口组合。TIME_WAIT

允许新程序重新绑定到该IP /端口组合。在具有BSD套接字接口的堆栈(实际上是所有Unix和类似Unix的系统,以及通过Winsock的 Windows)中,您必须在调用之前通过设置SO_REUSEADDR选项来询问这种行为。setsockopt()bind()

SO_REUSEADDR由于通常的使用模式是进行配置更改,因此通常在网络服务器程序中设置,因此需要重新启动该程序以使更改生效。如果不使用SO_REUSEADDR,则bind()在您杀死它时,如果先前实例的连接已打开,则在重新启动的程序的新实例中的调用将失败。这些连接会将TCP端口保持TIME_WAIT30-120秒的状态,因此您属于上述情况1。

设置的风险SO_REUSEADDR在于它会造成歧义:TCP数据包标头中的元数据不够独特,堆栈无法可靠地判断数据包是否陈旧,因此应丢弃该数据包而不是将其传递到新的侦听器套接字,因为显然是为即将死去的听众准备的。

如果您看不到这是真的,那么以下是侦听机的TCP / IP堆栈必须与每个连接配合使用才能做出的决定:本地IP:每个连接都不唯一。实际上,这里的问题定义表示我们有意重用了本地IP。

本地TCP端口: Ditto。

远程IP:造成歧义的机器可以重新连接,因此不利于消除数据包的正确目的地。

远程端口:在行为良好的网络堆栈中,传出连接的远程端口无法快速重用,但只有16位,因此您有30-120秒的时间来迫使堆栈通过数万个选择并重用端口。在1960年代,计算机的工作速度很快。

如果您的答案是远程堆栈应该TIME_WAIT在其侧面进行某些操作以禁止临时TCP端口重用,则该解决方案将假定远程主机是良性的。恶意参与者可以随意重用该远程端口。

我想侦听器的堆栈可以选择仅严格禁止来自TCP 4元组的连接,以便在该TIME_WAIT状态期间阻止给定的远程主机与同一远程临时端口重新连接,但是我不知道任何具有那个特别的提炼。

本地和远程TCP序列号:这些序列号也不是唯一的,以至于新的远程程序无法提供相同的值。

如果我们今天要重新设计TCP,我想我们会将TLS或类似的东西集成为一项非可选功能,其作用之一是使这种无意和恶意的连接劫持成为不可能,但这需要添加大字段(128位及以上),这在1981年发布当时最新版本的TCP(RFC 793)的文档时还算不上实际。

如果不进行这种强化,则在允许TIME_WAIT您进行以下操作期间重新绑定所造成的歧义可以:a)将用于旧侦听器的陈旧数据错误地传递到属于新侦听器的套接字,从而破坏侦听器的协议或错误地将陈旧数据注入连接; 或b)错误地将新侦听器套接字的新数据分配给旧侦听器的套接字,因此无意中将其丢弃。

安全的做法是等待TIME_WAIT一段时间。

归根结底,这TIME_WAIT取决于成本选择:等待一段时间或承担不必要的数据丢失或意外数据注入的风险。

许多服务器程序会冒此风险,因此决定最好立即备份服务器,以免错过不必要的传入连接。

这不是一个普遍的选择。许多程序-甚至需要重新启动才能应用设置更改的服务器程序-都选择不做任何选择SO_REUSEADDR。程序员可能知道这些风险,并选择不采用默认设置,或者他们可能不知道问题所在,但正在从明智的默认设置中受益。

某些网络程序为用户提供了配置选项中的一个选择,从而使最终用户或sysadmin失去了责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值