我有一个iOS聊天应用程序通过TCP套接字与java XMPP聊天服务器通信。服务器机器(机器1)正在运行redhat linux。最近我将聊天服务器移动到具有类似配置的另一台Linux机器(机器2),除了它有更多的处理器。服务器工作的方式是,一旦它从客户端(data1)接收到特定数据,它就会向客户端发送2 xml数据包(data2和data3)。看看wireshark中的数据包,我看到下面的内容 machine1中的一致行为。
iOS App Java server
SYN -->
<-- SYN,ACK
ACK -->
TCP handshake ends here
data1 -->
<-- ACK
<-- data2
ACK -->
<-- data3
ACK -->
但是在机器2中,它的工作原理如下。(并非总是如此)
iOS App Java server
SYN -->
<-- SYN,ACK
ACK -->
TCP handshake ends here
data1 -->
<-- ACK
<-- data2
<-- data3
ACK -->
ACK -->
如上所述,客户端一次性发送2个数据包的ACK。 为什么行为会发生这样的变化。由于应用程序在两种情况下都是相同的,因此可能使服务器发送数据3而不接收数据2的ACK。我已经验证了这些机器中的大多数TCP套接字相关属性,如发送缓冲区,TCO_NODELAY等,但所有这些看起来都是一样的。如果需要行为在机器1中,我该怎么办。
我也注意到这种行为主要是通过wifi连接时看到的。