关于 java 中的 serversockets,我已经看到了许多与此类似的答案:“假设您有一个服务器,其 serversocket 在端口 5000 上。客户端 A 和客户端 B 将连接到我们的服务器。
客户端 A 在端口 5000 上向服务器发送请求。客户端 A 端的端口由操作系统选择。通常,操作系统会选择下一个可用的端口。此搜索的起点是先前使用的端口号 + 1(例如,如果操作系统最近遇到了我们的端口 45546,那么操作系统将尝试 45547)。
假设没有连接问题,服务器收到客户端 A 的连接请求,连接端口 5000。然后服务器打开自己的下一个可用端口,并将其发送给客户端。在这里,客户端 A 连接到新端口,而服务器现在又可以使用 5000 端口了。”
我在 stackoverflow 上的多个问题中看到了这样的答案,关于如何在 accept() 的返回套接字中使用与 ServerSocket 正在侦听的端口不同的端口。我一直认为 TCP 是由四重信息标识的:
客户端 IP:客户端端口和服务器 IP:服务器端口 -> 协议(区分 TCP 和 UDP)
那么为什么 accept() 需要返回绑定到不同端口的套接字呢?在每个标头中发送的四重信息是否不足以区分来自不同机器的到同一服务器端口的多个连接,因为它不需要使用服务器机器上的不同端口进行通信?