gpt4 book ai didi

java - ServerSocket 是否接受任意端口上的返回套接字?

转载 作者:可可西里 更新时间:2023-11-01 02:31:08 24 4
gpt4 key购买 nike

关于 java 中的服务器套接字,我看到过许多与此类似的答案:“假设您的服务器在端口 5000 上有一个服务器套接字。客户端 A 和客户端 B 将连接到我们的服务器。

客户端 A 在端口 5000 上向服务器发出请求。客户端 A 端的端口由操作系统选择。通常,操作系统会选择下一个可用的端口。此搜索的起点是先前使用的端口号 + 1(因此,例如,如果操作系统最近遇到我们端口 45546,则操作系统将尝试 45547)。

假设没有连接问题,服务器会收到客户端 A 的连接请求,连接到端口 5000。然后服务器会打开自己的下一个可用端口,并将其发送给客户端。在这里,客户端 A 连接到新端口,服务器现在又可以使用端口 5000。”

我在 stackoverflow 的多个问题中看到了这样的答案,这些问题是关于如何在 accept() 的返回套接字中使用与 ServerSocket 正在监听的端口不同的端口。我一直以为TCP是通过四方信息来识别的:

Client IP : Client Port and Server IP : Server Port ->protocol too (to distincting TCP and UDP)

那么为什么 accept() 需要返回绑定(bind)到不同端口的套​​接字?每个 header 中发送的四重信息是否足以区分来自不同机器的同一服务器端口的多个连接,而无需使用服务器机器上的不同端口进行通信?

最佳答案

The Server then opens up its own next available port, and sends that to the client.

没有。它创建一个具有相同 本地端口号的新套接字。没有第二个端口号被分配或发送到客户端。作为服务器对连接请求的响应的 SYN/ACK 段不包含第二个端口号。

Here, Client A connects to the new port,

没有。客户端确认 SYN/ACK 数据包,客户端在确认 SYN/ACK 后连接到原始端口。没有第二个连接。

and the server now has port 5000 available again."

一直都是。

I've seen answers like this in multiple questions on stackoverflow about how a different port is used in the returned socket of the accept() than the port that the ServerSocket is listening on.

任何此类答案都是不正确的,应该“带着极端偏见”投反对票,并发表负面评论。 TCP 握手在 RFC 793 中定义并且不指定第二端口和第二连接消息的分配和交换。只有三个消息,这还不足以发生这种情况。

So why would the accept() need to return a socket bound to a different port?

不是。

Doesn't the quartet of information sent in every header distinguish multiple connections to the same server port from different machines enough where it would not need to use different ports on the server machine for communication?

是的。

关于java - ServerSocket 是否接受任意端口上的返回套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17731247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com