1、测试
测试环境:
- win7 个人电脑;
- Server 是 SpringBoot web server;
client 端代码(默认为长连接):
RestTemplate rest = new RestTemplate();
for (int i &#61; 0; i < 1000;i&#43;&#43;){rest.postForObject("http://localhost:8080/ailysis/scenario/test", Strings.repeat("a", 1000), Object.class);
}
client 端代码&#xff08;短连接&#xff09;&#xff1a;
for (int i &#61; 0; i < 1000;i&#43;&#43;){try {HttpURLConnection connection &#61; (HttpURLConnection)new URL("http://localhost:8080/ailysis/scenario/test").openConnection();connection.setRequestMethod("POST");connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);connection.setConnectTimeout(30000);connection.setReadTimeout(30000);connection.setRequestProperty("Connection-type", "application/json");connection.setRequestProperty("Connection", "Close");OutputStream outputStream&#61;connection.getOutputStream();outputStream.write(JSONBuilder.object("content", Strings.repeat("a", 1000).toJSONString().getBytes()));outputStream.flush();outputStream.close();System.out.println(connection.getResponseCode());} catch (IOException e) {...}
}
server 端代码&#xff1a;
&#64;RequestMapping("/test")
public ResponseEntity<Integer> test(HTTPServletRequest request){return new ResponseEntity<>(request.getContengLength(), HttpStatus.OK)
}
请求内容长度 | 发送次数 | 局域网 (ms) | 本地访问 (ms | 长连接 |
---|
1000 | 1 | 271 | 219 | True |
1000 | 1000 | 4754 | 3297 | True |
10000 | 1000 | 5345 | 3080 | True |
1000 | 10000 | 35939 | 21930 | True |
10000 | 10000 | 32377 | 22430 | True |
几点说明&#xff1a;
- 以上情况&#xff0c;RestTemplate 会在相同的连接上发送 HTTP 数据包&#xff0c;也就是所谓的长连接&#xff1b;
- 时间消耗基本上跟 HTTP 请求次数相关&#xff1b;HTTP 协议是个很重的协议&#xff0c;比如&#xff0c;TCP 空报文的总大小为 54 字节&#xff08;54 &#61; 14&#43;20&#43;20&#xff09;&#xff0c;分别为链路层报文头 14 &#61; 6 &#43; 6 &#43; 2&#xff0c;ip 报文头 20 字节&#xff0c;tcp 报文头 20&#xff0c;有时候 tcp 会带一些选项参数&#xff0c;一般十几个字节。但是一个空 HTTP 报文&#xff0c;基本都大于 300 字节。所以说&#xff0c;HTTP 是个很重的传输协议&#xff0c;只不过现在网速越来越快了&#xff0c;传输效率不再是制约系统的瓶颈了&#xff0c;HTTP 才得以大行其道&#xff1b;
- 最后发现&#xff0c;长短连接对该场景&#xff0c;影响不是很大&#xff1b;因为是本地或局域网&#xff0c;tcp 三次握手所消耗的时间很少&#xff0c;如果在互联网上&#xff0c;另当别论。
- 测试中不涉及服务器的并发处理&#xff0c;仅测试单连接的处理情况&#xff1b;
2、wireshark 数据流
1、单个 HTTP 连接建立到关闭的 wireshark 抓包视图&#xff1a;
2、长连接上发送两个 HTTP 数据包的视图&#xff1a;
在长连接模式&#xff0c;尽管发送了两个 HTTP&#xff0c;但是只建立了一个 TCP 连接&#xff1a;
21.0.0.43:20082 <&#61; > 30.0.24.111:8080
3、使用短连接发送两个 HTTP 包的视图&#xff1a;
可以清楚的看到&#xff0c;有两次建立连接和释放连接的过程&#xff0c;建立了两条 TCP 连接&#xff1a;
21.0.0.43:27575 <&#61; > 30.0.24.111:8080
21.0.0.43:27578 <&#61; > 30.0.24.111:8080
4、长连接上发送多个 HTTP 包的视图&#xff1a;