操作
- Spring MVC启动服务端
- Postman发送正常的HTTP GET请求
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 客户端Keep-Alive及ACK
- 服务端FIN及ACK
- 客户端继续两次Keep-Alive及ACK
- 服务端RST
- 客户端自始至终都使用同一端口
- 完
操作
- Spring MVC启动服务端
- Postman发送正常的HTTP GET请求
- 服务端FIN前停止服务
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 客户端Keep-Alive及ACK
- 服务端RST
- 客户端自始至终都使用同一端口
- 完
操作
- Spring MVC启动服务端
- Postman发送header带Connection=close的HTTP GET请求(抓包发现Connection还是keep-alive……)
实验结果同案例一
操作
- Spring MVC启动服务端
- Postman发送异常的HTTP GET请求(服务端处理异常)
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 四次挥手(客户端、服务端其中一方都可能发起)
- 客户端自始至终都使用同一端口
- 完
操作
- Spring MVC启动服务端
- Postman发送正常的HTTP GET请求
- Postman紧接着发送异常的HTTP GET请求
- Postman紧接着发送正常的HTTP GET请求
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- GET请求及ACK
- 分成两帧GET响应及ACK
- 四次挥手(服务端发起)
- 客户端使用新的端口执行正常的HTTP GET请求
- 完
操作
- Spring MVC启动服务端
- Postman发送正常https协议的HTTP GET请求
实验结果
- 三次握手
- GET请求及ACK
- 客户端发送带PSH的包、服务端ACK
- 服务端发送带PSH的包、客户端ACK
- 来来回回几次客户端ACK后服务端发送PSH、客户端ACK(PSH这些应该是证书、密钥相关的流程)
- 15秒后客户端FIN及ACK
- 服务端PSH
- 客户端RST(这里客户端的行为看起来比较奇怪)
- 然后新的端口三次握手到客户端FIN前又执行了一遍
- 客户端不FIN、发送带PSH的包、服务端ACK
- 服务端两次PSH及ACK
- 客户端Keep-Alive及ACK
- 服务端PSH及ACK
- 服务端FIN及ACK
- 客户端继续两次Keep-Alive及ACK
- 服务端RST
- 完
操作
- Spring MVC启动服务端
- Postman发送正常https协议的HTTP GET请求
- 客户端Keep-Alive前Postman发送正常https协议的HTTP GET请求
实验结果除了在第一次Keep-Alive前增加了客户端一次PSH、服务端两次PSH外与案例六一样
操作
- Spring MVC启动服务端
- Postman发送正常https协议的HTTP GET请求
- 服务端Keep-Alive ACK后Postman发送正常https协议的HTTP GET请求
实验结果除了在第一次Keep-Alive ACK后增加了客户端一次PSH、服务端两次PSH、客户端Keep-Alive外与案例六一样
操作
- Spring MVC启动服务端
- Postman发送正常https协议的HTTP GET请求
- 客户端FIN ACK后Postman发送正常https协议的HTTP GET请求
实验结果
- 客户端FIN ACK及之前与案例六相同
- 客户端FIN及ACK
- 客户端使用新的端口执行正常https协议的HTTP GET请求
- 完
操作
- Spring MVC启动服务端
- RestTemplate(默认构造器SimpleClientHttpRequestFactory)发送正常的HTTP GET请求
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 客户端RST
- 客户端自始至终都使用同一端口
- 完
操作
- Spring MVC启动服务端
- RestTemplate(默认构造器)发送正常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 10秒后四次挥手(客户端发起)
- 完
操作
- Spring MVC启动服务端
- RestTemplate(默认构造器)发送正常的HTTP GET请求
- 构造新的RestTemplate发送正常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 分成两帧GET响应及ACK
- 10秒后四次挥手(客户端发起)
- 客户端自始至终都使用同一端口
- 完
操作
- Spring MVC启动服务端
- RestTemplate(默认构造器)发送header带Connection=close的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 四次挥手(服务端发起)
- 完
操作
- Spring MVC启动服务端
- RestTemplate(默认构造器)发送异常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 四次挥手(服务端发起)
- 完
14.2. 案例十四2
操作
- Spring MVC启动服务端
- RestTemplate(默认构造器)发送异常的HTTP GET请求(服务端返回正常的响应码)
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 10秒后四次挥手(客户端发起)
- 完
操作
- Spring MVC启动服务端
- RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送正常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 60秒后服务端FIN及ACK
- 客户端FIN ACK 120秒后服务端RST
- 完
操作
- Spring MVC启动服务端
- RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送正常的HTTP GET请求
- 在服务端FIN前构造新的RestTemplate发送正常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果相当于两次独立的案例十五,端口不一样
操作
- Spring MVC启动服务端
- RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送正常的HTTP GET请求
- 在服务端FIN前原RestTemplate发送正常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果与案例十六相比相当于复用了连接
操作
- Spring MVC启动服务端
- RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送正常的HTTP GET请求
- 在服务端FIN后原RestTemplate发送正常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果与案例十六相比相当于第一个连接的服务端RST替换成客户端的FIN(第二个连接的情况不变)
操作
- Spring MVC启动服务端
- RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送header带Connection=close的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 四次挥手(服务端发起)
- 完
操作
- Spring MVC启动服务端
- RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送异常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 四次挥手(服务端发起)
- 完
操作
- Spring MVC启动服务端
- RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造,并设置HttpClient的ConnectionManager)发送正常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果
- 三次握手
- GET请求及ACK
- 分成两帧GET响应及ACK
- 60秒后服务端FIN及ACK
- 客户端FIN ACK 120秒后服务端RST
- 完
操作
- Spring MVC启动服务端
- RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造,并设置HttpClient的ConnectionManager)发送正常的HTTP GET请求
- 在服务端FIN前构造新的RestTemplate、但ConnectionManager保持一致,发送正常的HTTP GET请求
- RestTemplate执行后阻塞避免程序退出
- 最后解除阻塞程序退出
实验结果显示复用了相同的连接
其它资料:
https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-client-access
https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html