Java 文档说 ServerSocket
, x
正在监听端口 5555
返回一个新的 Socket
,y
,来自其 accept()
方法,这样:
y
的本地端口设置为5555
;和x
继续在端口5555
上监听以accept()
新连接。
经验证,确实是上述情况。
但是,Port 上的这个维基百科条目有这样的话:
This process is known as listening and involves the receipt of a request on the well-known port and reestablishing one-to-one server-client communications on another private port, so that other clients may also contact the well-known service port.
对我来说,上面的维基百科摘录往往更有意义......因为根据我对 TCP/IP 的阅读和理解,
目标 IP 地址有助于将数据包传送到正确的主机;和
目标端口有助于将数据包传送到目标主机上的正确进程
因此,鉴于 Java 中 accept()
的文档和行为,我想知道在多线程客户端尝试与多线程服务器通信的情况下如何实现数据包传递(通过打开两个通信 channel ,每个线程一个)?在这种情况下,当所有数据包都设置了相同的目标 IP 地址和端口值时,Java(或底层 TCP/IP 堆栈)如何知道哪个数据包属于哪个 channel ?
编辑:请在下方查看 EJP 的回复以及 Nikolai 的评论。根据他们的说法,上述维基百科的说法是错误的。 EJP 继续修复维基百科条目。
最佳答案
监听套接字比较特殊。内核只向它传递那些属于 three-way handshake 的 TCP 段。 ,在标题中有明确的标志。一旦完成,您就有了一个已建立的 TCP 连接,该连接由一个完整的元组 (src addr, src port, dst addr, dst port)
标识。
因此,在绑定(bind)到同一本地端口的监听套接字和已连接套接字之间的网络堆栈内部没有歧义。
它也可能有助于研究 TCP state diagram更好地了解所有这些是如何组合在一起的。
关于sockets - accept() 和 TCP 数据包传递的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11246879/