springboot使用HTTP响应头transfer:编码,但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 port 8080
  2. curl -X POST http://0.0.0.0:8080/home/getMsg

tcpdump显示两个数据包:当我curl

时,tcp转储数据包

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

  • 每个chunk都以其长度(十六进制)和rn为前缀,
  • 序列0rnrn表示消息结束。

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

Tomcat默认将套接字上的TCP_NO_DELAY选项设置为true(参见文档)。要禁用它,请修改连接器配置:

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

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