3

我已经读过三件事的组合会导致 TCP 延迟 200 毫秒: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());
}

我没有看到任何延迟。为什么不?

4

1 回答 1

0

我相信您会看到延迟确认。您将 4 个和 4 个字节写入套接字。服务器的 TCP 堆栈接收一个段(可能包含来自 int 数的至少 4 个字节)并唤醒服务器应用程序线程。该线程将一个字节写回流中,并且该字节在 ACK 段内发送到客户端。即 TCP 堆栈让应用程序有机会立即发送回复。所以你看不到延迟。您可以编写流量转储,还可以在两台计算机之间进行实验以查看实际发生的情况。

于 2013-10-21T19:34:30.287 回答