3

Java 文档说,ServerSocket监听x端口的 , 会从它的方法5555返回一个新的Socket, ,这样:yaccept()

  1. 的本地端口y设置为5555;和

  2. x继续在端口上侦听5555accept()连接。

我已经验证了上述情况确实如此。

然而,这个关于港口的维基百科条目有这样的说法:

此过程称为侦听,涉及在知名端口上接收请求并在另一个私有端口上重新建立一对一的服务器-客户端通信,以便其他客户端也可以联系知名服务端口。

对我来说,上面的维基百科摘录往往更有意义......因为根据我对 TCP/IP 的阅读和理解,

  1. 目标 IP 地址有助于将数据包传递到正确的主机;和

  2. 目标端口有助于将数据包传递到目标主机上的正确进程

因此,鉴于accept()Java 中的文档和行为,我想知道如果多线程客户端尝试与多线程服务器通信(通过打开两个通信通道,每个线程中一个),如何实现数据包传递?在这种情况下,当所有数据包都设置了相同的目标 IP 地址和端口值时,Java(或底层 TCP/IP 堆栈)如何知道哪个数据包属于哪个通道?

编辑:请参阅 EJP 的回复以及 Nikolai 在下面的评论。据他们说,上述维基百科的说法是错误的。EJP 继续并修复了维基百科条目。

4

2 回答 2

3

监听套接字是特殊的。内核只向它传递属于三向握手的 TCP 段,这些段在标头中有明确的标志。完成后,您将建立一个由完整元组标识的 TCP 连接(src addr, src port, dst addr, dst port)

因此,网络堆栈内部在侦听和连接到同一本地端口的套接字之间没有歧义。

研究TCP 状态图也可能有助于更好地了解所有这些是如何结合在一起的。

于 2012-06-28T14:41:30.787 回答
1

维基百科的文章是错误的。了:我修好了。现在再看看。接受的连接使用与侦听端口相同的本地端口号。

于 2012-06-28T21:56:10.720 回答