为什么不允许将套接字绑定到多个端口?

3
这个限制存在的原因是什么?它的技术原因是什么?
据我所知,端口被引入是为了区分同一主机上的不同设施(服务、连接等),因此从逻辑上讲,这个限制是合理的。然而,SO_REUSEADDR存在的目的是允许一个端口绑定多个套接字,但反过来却不行。这似乎是实际可行的,因为它可以节省在多路复用上浪费的系统调用;许多SO问题寻求(徒劳地)解决这个问题。但缺乏实现表明我无法想象其中存在一些障碍。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - chemdt
1个回答

4
原因在于UDP和TCP连接是基于IP-Port对进行关键字匹配的。这是堆栈内部确定哪些数据归属于哪个连接的方式。
如果有多个端口与一个连接相关联,那么就需要一些其他机制来确定连接和相应的应用程序线程/会话之间的匹配关系,以便正确地传递数据。

他们没有指定要使用哪种类型的套接字。可以配置原始IP套接字以接收所有传入的数据包并自己处理连接,但我怀疑那不是这个人在问什么。 - chemdt
感谢您的回答,@David,但这并没有解释限制。为什么不使用相同的套接字在(地址、端口)到套接字映射中添加另一条记录呢?这不会比使用两个或更多套接字影响性能更糟。在Linux内核中,有一个检查,如果端口正在使用中,但为什么需要这样做呢? - PlushBeaver
这只是标准在70年代建立的方式。端口和IP地址的使用方式自然地导致它们被用作连接的关键。 - David Hoelzer
现在和以前,使用(地址,端口)来键入系统资源不需要明确规则来防止绑定到多个端点。至于标准,我在RFC 768(UDP)中找不到这个限制。我怀疑没有操作系统网络堆栈会毫无理由地破坏有用的功能。RFC 761(TCP)指出:“[端口]与来自Internet通信层的网络和主机地址连接起来,形成一个套接字。一对套接字唯一标识每个连接”,这与* TCP *(或面向连接的协议)绑定到多个端口相冲突。 - PlushBeaver
1
啊!你可以使用原始套接字来完成第二点中想要的功能,但是需要注意的是你必须自己过滤每个数据包,并且返回的数据将包括第四层头部信息。 - chemdt
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接