我们在Java服务器和C客户端之间创建了2个连接 . Java ServerSocket对象调用accept()两次,每次返回1个套接字; C客户端调用connect()两次 . 我们假设accept()返回的第一个Socket的端口应该与调用connect()的第一个客户端套接字的端口相同,第二个套接字的端口相同 .
但是通过检查每个套接字上的端口号,偶尔会看到异常情况,其中第一个Socket从accept()连接到第二个客户端套接字调用connect(),第二个套接字从accept()连接到第一个客户端套接字 .
服务器和客户端都是单线程,用于 Build 连接 . 如何逆转序列?
2 回答
可以在网络上切换来自两个连接的初始同步分组的顺序 . 例如,如果“第一”连接的初始SYN数据包被丢弃,并且该数据包在“第二”连接的初始SYN数据包之后才重新发送 . 此外,即使您的服务器和客户端是单线程的,处理TCP堆栈的系统代码也可能是多线程的 .
你不知道'来自客户的连接顺序'是什么 . 连接是与包重试的三次握手 . 积压队列中的序列将是最终ACK的接收序列,您对此没有任何了解 .