对所有连接重复使用同一端口是否会对性能产生影响?

Is there a performance impact to re-using the same port repeatedly for all connections?

WebSockets/HTTPS 的标准是端口 443,世界各地的每个客户端都连接到服务器端口 443。起初这让我感到困惑,因为我想象所有流量都流经一个实体,这将是一个如果有一个实体为所有网络流量提供服务,那将是一个疯狂的瓶颈。然后我了解到“端口”只是一个数字,客户端和服务器上的实际实体是套接字。套接字连接到端口,以便内核知道将传入流量转发到哪个套接字(如果这是错误的,请纠正我)。所以套接字是比端口更高级的实体。

我的问题是让所有流量都转到服务器上的单个端口是否有任何性能差异。要正确地将传入流量多路分解到套接字,必须需要更多信息(可能是客户端 hostname/port?)。而如果每个客户端都使用服务器端的唯一端口,则仅服务器端口就足以进行多路分解。

My question is whether there is any performance difference at all to having all traffic go to a single port on the server. To properly de-multiplex incoming traffic to a socket, more information must be needed (maybe the client hostname/port?).

假设所有流量都流向同一个程序(即网络服务器进程),那么让所有流量进入一个端口可能比使用多个端口更有效,因为网络服务器只需要处理一个套接字来接受连接,而不必为多个端口中的每一个创建一个单独的套接字。

TCP 连接由 5-tuple(源 IP、源端口、目标 IP、目标端口、协议)唯一标识,因此网络堆栈 de-multiplex 传入的工作量无论使用多少个端口,流量都将相同(散列 5 元组)。

Whereas if every client were using a unique port on the server side, the server port alone would be sufficient to de-multiplex.

但是,这样做会将服务器限制为相对较少的客户端,因为在任何给定主机上只有 65535 个端口可用(端口字段为 16 位宽),并且其中许多端口可能已经可用正在用于其他服务......并且服务器必须为每个分配的端口创建一个套接字,这很快就会变得笨拙。因此,给每个客户端一个唯一的端口会导致 port-number 争用问题,而实际上并没有加快任何速度。