HTTP 原理与实战 - 抓包分析

541

🚀学会了基本的抓包后,本偏实践 HTTP 抓包分析 TCP 连接的实际情况

一、工具请求

使用可以发送 HTTP 的工具例如 Postman 与浏览器对 URI 做请求,并抓包分析

IP 请求

在基础工作篇中已经预先设定好环境了,现在这里就直接可以请求抓包了:

  • 启动 openresty
  • 开启 wireshark,本机抓包,限制 7077 端口
  • chrome 访问:http://127.0.0.1:7077/

得到 wireshark 抓包数据:

注意:seq 是随机初始化的值,这里显示 0 是 wireshark 优化的结果,是一个“相对值”,右键协议首选项,可以取消 “Relative sequence numbers”

第一列是时间顺序排列浏览器与服务器交互的数据包,下面对这段请求做分析:

No.1 - No.3No.4 - No.6 两组数据包看到都差不多,代表的是三次握手,从 Info 列中可以看出这段报文中,30987 是浏览器端口,7077 是服务器端口。所以发现三次握手进行了两次?原因取决于浏览器的决策

清除缓存,在 chrome 无痕模式下进行请求,抓包时三次握手和预期结果就一样了:

  • 三次握手
    • No.1 - No.3 进行 TCP 三次握手
  • HTTP 请求与响应
    • No.4 浏览器进行了 HTTP GET 请求
    • No.5 服务器响应浏览器 ACK ,表示收到请求
    • No.6 服务器响应浏览器数据,并响应状态码 200 ,表示响应成功
    • No.7 浏览器响应服务器 ACK ,表示收到响应
  • 四次挥手

没有四次挥手?

可以发现,没有四次挥手,这是因为 HTTP 1.1 默认长连接,放着一段时间会发几个心跳,然后就进行四次挥手了。

关于进行四次挥手的时机还有是否是无痕模式还有区别,对 http://127.0.0.1:7077/ 进行请求:

  • 正常模式下,会发现每次都是进行四次挥手后再进行新的三次握手,再进行 HTTP 请求数据
  • 无痕模式下,直接进行 HTTP 请求数据,直接响应

真是非常有意思,具体策略跟 chrome 内部有关系,这里研究 HTTP 原理,不多说,通过 IP 抓包可以发现整体流程还是和预期的一样的:TCP 连接 - HTTP 请求与响应 - TCP 释放

域名请求

域名请求其实也是一样,域名是有多级缓存的,浏览器会先查询域名对应的 IP 然后再次请求,抓包请求查看结果是一样的,这是因为解析域名使用 DNS,这个使用的是 UDP 协议进行的 IP 查询,由于本机的域名映射 hosts 已经有了,因此就直接查到了

注意点

  • HTTP 使用的端口是 80 端口,但它还经常使用 8000 端口和 8080 端口
  • 现代的浏览器往往会秘密地发送 favicon.ico 请求,获取网站的图标
  • 有时建立多个连接是为了并发建立多个连接,提高数据传输效率

二、手动请求

基于 Telnet 建立 TCP 连接,手动编写 请求报文做 HTTP 报文,并分析报文

服务端的常通过各种服务来获取 HTTP 的报文信息,加以应用

在应用层经常使用 Telnet 协议来登录远程主机,其实大白话就是维持了一个 TCP 连接,然后我们可以在这个 TCP 连接的基础做各种应用层协议的操作,例如,可以做 HTTP 协议的请求与响应

回顾一下域名映射 hosts

127.0.0.1 www.chrono.com
127.0.0.1 www.metroid.net
127.0.0.1 origin.io

Win 10 自带 Telnet 服务,但使用起来也是非常蛋疼,原本以为用 Cmder 或许会好点,结果是内嵌 Win 10 的服务的,本质还是一样

废话到此为止,这里就是想提醒,Telnet 工具每一步要注意,否则就测试失败

  • 开启 openresty:\www\start.bat

  • 测试请求:浏览器请求 www.chrono.com:7077 ,出现欢迎界面表示域名映射成功

  • 启动 Telnet:Win + R 输入 cmd,并且 telnet chrono.com 7077

  • 进入服务器:CTRL + ]

  • 进入编辑模式:按一下回车

  • 发送请求:直接复制以下请求报文,在 CMD 右键(黏贴),并按两下回车

    GET /09-1 HTTP/1.1
    Host:www.chrono.com
    
  • 响应结果:发现成功的响应报文,显示了请求的头部的一些信息

  • URI 定位: /09-1 其实是定位到了 www\lua\09-1\ 下,这里的配置是在 \www\conf\http\servers\locations.inc 中做的,然后使用脚本启动,会加载这份配置

注意:

  • 这个过程请求报文不要手写,操作也要快,因为非常容易断开连接,HTTP 请求是非常快的过程
  • Nginx 默认请情况下是不允许头部字段出现 _
  • Nginx 默认的请求头大小不能超过 8K,可以使用 large_client_header_buffers 命令修改