【问题标题】:Why exactly binding a socket to multiple ports is not allowed?为什么不允许将套接字精确绑定到多个端口?
【发布时间】:2015-06-03 13:22:54
【问题描述】:

为什么存在这个限制?它的技术原因是什么?

AFAIU,引入端口是为了区分同一主机的设施(服务、连接等),所以逻辑上这个限制是合理的。但是,SO_REUSEADDR 的存在允许单端口对多套接字绑定,但反之则不行。这似乎很实用,因为它可以避免浪费在多路复用上的系统调用;许多 SO 问题寻求(徒劳无功)一种方法来做到这一点。但缺乏实施表明存在一些我无法想象的障碍。

【问题讨论】:

  • SO_REUSEADDR 不允许您在使用 AF_INET 套接字时重用已经绑定了活动侦听器的地址。

标签: sockets port bind


【解决方案1】:

原因是 UDP 和 TCP 连接是基于 IP-Port Pair 的。这就是堆栈在内部确定什么与什么相匹配的方式。

如果我们有多个端口到一个,则需要一些其他机制来为连接设置密钥,以便将正确的数据传递到正确的应用程序线程/会话。

【讨论】:

  • 他们没有指定使用哪种类型的套接字。可以配置一个原始 IP 套接字来接收 所有 传入的数据包并自己处理连接,但我怀疑这就是那个人要问的。
  • 感谢@David 的回答,但这并不能解释限制。为什么不在同一个套接字的(地址、端口)到套接字映射中添加另一条记录?它不会比使用两个或更多套接字更糟地影响性能。在 Linux 内核中,there is a check 如果某个端口正在使用中,但为什么需要它?
  • @chemdt 我主要指的是 UDP 套接字。我知道原始套接字功能,但我正在寻求的是理解为什么套接字以它们的方式工作。
  • 这就是标准在 70 年代建立的方式。端口和 ips 的使用方式自然会导致它们被用于连接密钥。
  • 啊!您可以使用原始套接字在第二点中完全按照您的意愿行事,但问题是您必须自己过滤每个数据包,并且返回的数据将包括第 4 层标头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多