Http Log

Spring MVC、RestTemplate、Postman实验记录

  1. 案例一

操作

  • Spring MVC启动服务端
  • Postman发送正常的HTTP GET请求

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 客户端Keep-Alive及ACK
  • 服务端FIN及ACK
  • 客户端继续两次Keep-Alive及ACK
  • 服务端RST
  • 客户端自始至终都使用同一端口
  1. 案例二

操作

  • Spring MVC启动服务端
  • Postman发送正常的HTTP GET请求
  • 服务端FIN前停止服务

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 客户端Keep-Alive及ACK
  • 服务端RST
  • 客户端自始至终都使用同一端口
  1. 案例三

操作

  • Spring MVC启动服务端
  • Postman发送header带Connection=close的HTTP GET请求(抓包发现Connection还是keep-alive……)

实验结果同案例一

  1. 案例四

操作

  • Spring MVC启动服务端
  • Postman发送异常的HTTP GET请求(服务端处理异常)

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 四次挥手(客户端、服务端其中一方都可能发起)
  • 客户端自始至终都使用同一端口
  1. 案例五

操作

  • Spring MVC启动服务端
  • Postman发送正常的HTTP GET请求
  • Postman紧接着发送异常的HTTP GET请求
  • Postman紧接着发送正常的HTTP GET请求

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 四次挥手(服务端发起)
  • 客户端使用新的端口执行正常的HTTP GET请求
  1. 案例六

操作

  • 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
  1. 案例七

操作

  • Spring MVC启动服务端
  • Postman发送正常https协议的HTTP GET请求
  • 客户端Keep-Alive前Postman发送正常https协议的HTTP GET请求

实验结果除了在第一次Keep-Alive前增加了客户端一次PSH、服务端两次PSH外与案例六一样

  1. 案例八

操作

  • Spring MVC启动服务端
  • Postman发送正常https协议的HTTP GET请求
  • 服务端Keep-Alive ACK后Postman发送正常https协议的HTTP GET请求

实验结果除了在第一次Keep-Alive ACK后增加了客户端一次PSH、服务端两次PSH、客户端Keep-Alive外与案例六一样

  1. 案例九

操作

  • Spring MVC启动服务端
  • Postman发送正常https协议的HTTP GET请求
  • 客户端FIN ACK后Postman发送正常https协议的HTTP GET请求

实验结果

  • 客户端FIN ACK及之前与案例六相同
  • 客户端FIN及ACK
  • 客户端使用新的端口执行正常https协议的HTTP GET请求
  1. 案例十

操作

  • Spring MVC启动服务端
  • RestTemplate(默认构造器SimpleClientHttpRequestFactory)发送正常的HTTP GET请求

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 客户端RST
  • 客户端自始至终都使用同一端口
  1. 案例十一

操作

  • Spring MVC启动服务端
  • RestTemplate(默认构造器)发送正常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 10秒后四次挥手(客户端发起)
  1. 案例十二

操作

  • Spring MVC启动服务端
  • RestTemplate(默认构造器)发送正常的HTTP GET请求
  • 构造新的RestTemplate发送正常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 分成两帧GET响应及ACK
  • 10秒后四次挥手(客户端发起)
  • 客户端自始至终都使用同一端口
  1. 案例十三

操作

  • Spring MVC启动服务端
  • RestTemplate(默认构造器)发送header带Connection=close的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 四次挥手(服务端发起)
  1. 案例十四

操作

  • Spring MVC启动服务端
  • RestTemplate(默认构造器)发送异常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 四次挥手(服务端发起)

14.2. 案例十四2

操作

  • Spring MVC启动服务端
  • RestTemplate(默认构造器)发送异常的HTTP GET请求(服务端返回正常的响应码)
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 10秒后四次挥手(客户端发起)
  1. 案例十五

操作

  • Spring MVC启动服务端
  • RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送正常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 60秒后服务端FIN及ACK
  • 客户端FIN ACK 120秒后服务端RST
  1. 案例十六

操作

  • Spring MVC启动服务端
  • RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送正常的HTTP GET请求
  • 在服务端FIN前构造新的RestTemplate发送正常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果相当于两次独立的案例十五,端口不一样

  1. 案例十七

操作

  • Spring MVC启动服务端
  • RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送正常的HTTP GET请求
  • 在服务端FIN前原RestTemplate发送正常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果与案例十六相比相当于复用了连接

  1. 案例十八

操作

  • Spring MVC启动服务端
  • RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送正常的HTTP GET请求
  • 在服务端FIN后原RestTemplate发送正常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果与案例十六相比相当于第一个连接的服务端RST替换成客户端的FIN(第二个连接的情况不变)

  1. 案例十九

操作

  • Spring MVC启动服务端
  • RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送header带Connection=close的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 四次挥手(服务端发起)
  1. 案例二十

操作

  • Spring MVC启动服务端
  • RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造)发送异常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 四次挥手(服务端发起)
  1. 案例二十一

操作

  • Spring MVC启动服务端
  • RestTemplate(通过默认的HttpComponentsClientHttpRequestFactory构造,并设置HttpClient的ConnectionManager)发送正常的HTTP GET请求
  • RestTemplate执行后阻塞避免程序退出
  • 最后解除阻塞程序退出

实验结果

  • 三次握手
  • GET请求及ACK
  • 分成两帧GET响应及ACK
  • 60秒后服务端FIN及ACK
  • 客户端FIN ACK 120秒后服务端RST
  1. 案例二十二

操作

  • 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