测试Nagle算法

307 阅读1分钟

1. Nagle算法解释含义

Nagle 算法要求,当一个 TCP 连接中有在传数据(已经发出但还未确认的数据)时,小于 MSS 的报文段就不能被发送,直到所有的在传数据都收到了 ACK。同时收到 ACK 后,TCP 还不会马上就发送数据,会收集小包合并一起发送。

2. 测试demo

public class NagleClient {
    public static void main(String[] args) throws Exception {
        try {
            System.out.println(InetAddress.getLocalHost().getHostAddress());
            Socket socket = new Socket();
           
            SocketAddress address = new InetSocketAddress("1.117.109.40" , 9091);
            socket.connect(address);
            OutputStream output = socket.getOutputStream();
            String str = "hulanceshi\r\n";
            byte[] request = str.getBytes(StandardCharsets.UTF_8);
            // 分 5 次发送 5 个小包
            for (int i = 0; i < 5; i++) {
                output.write(request);
            }
            TimeUnit.SECONDS.sleep(1);
            socket.close();
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

nc -l -p 9999

实际包被合并了

image.png

socket.setTcpNoDelay(true);

实际上是发了5次

image.png

3. 用到的命令

nc 1.117.109.40 9091 > testNoNagle.pcap

nc -l -p 9091 < testNoNagle.pcap