spring-boot - 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;
}
}
运行应用程序,然后
- sudo tcpdump -i any -nnAls0 端口 8080
- curl -X POST http://0.0.0.0:8080/home/getMsg
tcpdump 显示两个数据包: tcp dump packet when I curl
解决方案
您所描述的正是分块编码应该如何工作(参见例如Wikipedia):
- 每个块都以它的长度(十六进制)和
\r\n
, - 序列
0\r\n\r\n
表示消息的结束。
发送的 TCP 段数取决于您的 TCP/IP 堆栈(操作系统)。如果连接速度很慢并且TCP_NO_DELAY
选项为 false,则段将被合并:见这个问题。
默认情况下,Tomcat 将TCP_NO_DELAY
选项设置为true
on the sockets(参见文档)。要禁用它,请修改您的连接器配置:
<Connector port="8080"
socket.tcpNoDelay="false"
... />
并在真实连接上测试您的服务器(不是环回设备127.0.0.1
,它非常快)。
推荐阅读
- javascript - 这个嵌套的三元运算符如何使用 javascript 工作?
- javascript - 如果接受 FCM 通知请求,如何使 React 只允许用户进入下一页?
- reactjs - 谷歌 Chrome 扩展程序无法在少数笔记本电脑上运行
- python - 简单的两路套接字通信
- java - 如何使用任何 selenium Web 驱动程序定位器定位元素
- azure - ADF - 执行管道 - 将活动名称作为参数传递
- python - 读取具有自定义日期格式的 Excel 文件
- google-bigquery - 并非所有从 firebase 导出到 biqquery 的事件
- python - 找不到适合 Python 3.7 的 pyspark Docker 映像
- redisson - Redisson 3.16.2 上无法识别的字段“reconnectionTimeout”