为什么不允许将套接字精确绑定到多个端口?
Why exactly binding a socket to multiple ports is not allowed?
为什么会有这个限制?它的技术原因是什么?
AFAIU,引入端口是为了区分同一主机的设施(服务、连接等),所以逻辑上限制是合理的。然而,SO_REUSEADDR
的存在是为了允许一个端口到多个套接字的绑定,而不是反过来。这看起来很实用,因为它可以避免浪费在多路复用上的系统调用;许多 SO 问题都在寻求(徒劳地)一种方法来做到这一点。但缺乏实施表明存在一些我无法理解的障碍。
原因是 UDP 和 TCP 连接是基于 IP 端口对的。这就是堆栈如何确定内部的内容。
如果我们有多个端口到一个端口,则需要一些其他机制来锁定连接,以便将正确的数据传送到正确的应用程序 thread/session。
为什么会有这个限制?它的技术原因是什么?
AFAIU,引入端口是为了区分同一主机的设施(服务、连接等),所以逻辑上限制是合理的。然而,SO_REUSEADDR
的存在是为了允许一个端口到多个套接字的绑定,而不是反过来。这看起来很实用,因为它可以避免浪费在多路复用上的系统调用;许多 SO 问题都在寻求(徒劳地)一种方法来做到这一点。但缺乏实施表明存在一些我无法理解的障碍。
原因是 UDP 和 TCP 连接是基于 IP 端口对的。这就是堆栈如何确定内部的内容。
如果我们有多个端口到一个端口,则需要一些其他机制来锁定连接,以便将正确的数据传送到正确的应用程序 thread/session。