Java Serversocket.accept() 没有按照客户端连接的顺序返回套接字?

问题描述 投票:0回答:2

我们在 Java 服务器和 C++ 客户端之间创建 2 个连接。 Java ServerSocket 对象调用accept()两次,每次返回1个套接字; C++ 客户端调用 connect() 两次。我们假设accept()返回的第一个套接字的端口应该与调用connect()的第一个客户端套接字的端口相同,并且第二对套接字也相同。

但是通过检查每个套接字上的端口号,我偶尔会看到异常情况,其中来自accept()的第一个套接字连接到调用connect()的第二个客户端套接字,而来自accept()的第二个套接字连接到第一个客户端插座。

这里服务器和客户端都是单线程建立连接的。顺序怎么可以颠倒呢?

java sockets port sequence
2个回答
1
投票

来自两个连接的初始同步数据包的顺序可能会在网络上交换。例如,如果“第一个”连接的初始 SYN 数据包被丢弃,并且直到“第二个”连接的初始 SYN 数据包之后才会重新发送该数据包。此外,即使您的服务器和客户端是单线程的,处理 TCP 堆栈的系统代码也可能是多线程的。


0
投票

您不知道“客户端连接的顺序”是什么。连接是带有数据包重试的三向握手。 backlog队列中的顺序将是最终ACK的接收顺序,对此您没有任何了解。

© www.soinside.com 2019 - 2024. All rights reserved.