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

Why exactly binding a socket to multiple ports is not allowed?

为什么会有这个限制?它的技术原因是什么?

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

原因是 UDP 和 TCP 连接是基于 IP 端口对的。这就是堆栈如何确定内部的内容。

如果我们有多个端口到一个端口,则需要一些其他机制来锁定连接,以便将正确的数据传送到正确的应用程序 thread/session。