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

标签 sockets tcp port

Java 文档说 ServerSocket, x 正在监听端口 5555 返回一个新的 Sockety,来自其 accept() 方法,这样:

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

  2. 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 的阅读和理解,

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

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

因此,鉴于 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/

相关文章:

java - 在Java中,是否有一种方法可以通过连接到serverSocket的套接字来获取服务器对象?

linux - 在哪个本地接口(interface)上接收到连接或数据包?

c - 为什么我的 getservbyname 函数总是返回 NULL?

.net - 通过已建立的连接与防火墙后面的设备对话 - 如何?

c# - 如何在 2 个 Visual C# 应用程序之间进行 TCP-IP 通信?

go - 在 Golang 中设置连接生命周期的时间

windows - 无法使用 SSH 连接到服务器,在 Windows 10 中显示 "ssh: connect to host 178.128.60.26 port 22: Connection timed out"

tomcat - 如何在不同端口后面的单个 Tomcat 实例上运行不同的应用程序?

windows-server-2003 - 如何确定 Windows 服务器上的端口是否打开?

c - c语言的socket编程中,为什么要在server程序中指定socket地址?