我已经读过三件事的组合会导致TCP延迟200ms:Nagle算法,延迟确认和“写 - 写 - 读”组合。但是,我无法使用Java套接字重现这种延迟,因此我不确定我是否理解正确。
我正在使用Java 7在Windows 7上运行测试,其中两个线程使用套接字通过环回地址。我没有触及任何套接字上的tcpNoDelay选项(默认为false),也没有使用操作系统上的任何TCP设置。客户端代码的主要部分如下所示。服务器在从客户端收到的每两个字节后用一个字节进行响应。
for (int i = 0; i < 100; i++) {
client.getOutputStream().write(1);
client.getOutputStream().write(2);
System.out.println(client.getInputStream().read());
}
我没有看到任何延迟。为什么不呢?
答案 0 :(得分:0)
我相信你会看到延迟确认。 您向套接字写入4和4个字节。服务器的TCP堆栈接收一个段(可能包含一个int数字中至少4个字节)并唤醒服务器应用程序线程。该线程将一个字节写回流,并将该字节发送到ACK段内的客户端。即TCP堆栈为应用程序提供了立即发送回复的机会。所以你看到没有延迟。 您可以编写流量转储,并在两台计算机之间进行实验,以查看实际发生的情况。