accept()和TCP数据包传递的行为

时间:2012-06-28 14:29:10

标签: sockets tcp port

Java文档说,正在侦听端口ServerSocket的{​​{1}},x会从其返回新的5555Socket y方法:

  1. accept()的本地端口设置为y;以及

  2. 5555继续在端口x上侦听5555个新连接。

  3. 我已经证实上述情况确实如此。

    然而,Port上的这个维基百科条目有这样的说法:

      

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

监听套接字是特殊的。内核只向那些作为three-way handshake一部分的TCP段提供,它们在头中有明确的标志。完成后,您将建立一个已建立的 TCP连接,该连接由完整的元组(src addr, src port, dst addr, dst port)标识。

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

这也可能有助于研究TCP state diagram以更好地了解所有这些如何结合在一起。

答案 1 :(得分:1)

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