首页 > 解决方案 > springboot使用http respose header传输:编码,但是tcp发送两个数据包即使响应很小

问题描述

@SpringBootApplication
@RestController
public class HttpChunkedApplication {

    public static void main(String[] args) {
        SpringApplication.run(HttpChunkedApplication.class, args);
    }

    @PostMapping("/home/getMsg")
    public ChunkedRsp login( HttpServletResponse response ){
        return new ChunkedRsp("aaa","bbb","ccc");
    }
}
@Data
public class ChunkedRsp {
   private String A;
   private String B;
   private String C;

    public ChunkedRsp(String a, String b, String c) {
        A = a;
        B = b;
        C = c;
    }
}

运行应用程序,然后

  1. sudo tcpdump -i any -nnAls0 端口 8080
  2. curl -X POST http://0.0.0.0:8080/home/getMsg

tcpdump 显示两个数据包: tcp dump packet when I curl

标签: spring-boothttptomcattcphttp-headers

解决方案


您所描述的正是分块编码应该如何工作(参见例如Wikipedia):

  • 每个块都以它的长度(十六进制)和\r\n,
  • 序列0\r\n\r\n表示消息的结束。

发送的 TCP 段数取决于您的 TCP/IP 堆栈(操作系统)。如果连接速度很并且TCP_NO_DELAY选项为 false,则段将被合并:见这个问题

默认情况下,Tomcat 将TCP_NO_DELAY选项设置为trueon the sockets(参见文档)。要禁用它,请修改您的连接器配置:

<Connector port="8080"
           socket.tcpNoDelay="false"
           ... />

并在真实连接上测试您的服务器(不是环回设备127.0.0.1,它非常快)。


推荐阅读