HTTP 原理与实战 - 初试抓包

382

校招时期对于 HTTP 的理解仍然有许多疑惑,新的 RFC 标准,新的协议,原理,其中的算法,应用与实践都没有彻底弄懂。所以开这个系列:「深入理解 HTTP」

未来有关 HTTP 的文章也将不断完善这个系列。

通过本文,将了解做 HTTP 研究的铺垫与环境准备工作。

一、发展历史

  • 20 世纪 60 年代,美国国防部建立 ARPA,四个分布在各地的节点,成为互联网始祖
  • 20 世纪 70 年代,研究人员对 ARPA 网提出了 TCP/IP 协议,该协议成为当时的主流,并在 80 年代中期进入了 UNIX 内核
  • 1989 年,欧洲核子研究中心研究员提出了一篇论文,把超文本系统完美地运行在互联网上,称之为万维网,Word Wide Web:
    • 基于 HTTP (超文本传输协议)传输文本
    • 使用 HTML (超文本标记语言)描述超文本文档
    • 使用 URI ,作为资源的统一标识符
  • 20 世纪 90 年代初,HTTP/0.9 发布,没有 RFC 标准号,特点是:
    • 只允许用 GET 动作从服务器上获取 HTML 文档
    • 响应请求后立即关闭连接
  • 1996 年,HTTP/1.0 发布,标准 RFC 1945,特点是:
    • 增加 HEAD、POST 等新方法
    • 增加响应状态码特性,标记可能的错误原因
    • 引入了协议版本号概念
    • 引入了 HTTP Header 概念,可以让 HTTP 处理请求和响应更加灵活
    • 传入的数据不再仅仅限于文本
  • 1999 年,HTTP/1.1 发布,标准 RFC 2616,是一个里程碑的版本,至今(2020 年)仍然许多人使用该版本,是一份非常正式的标准,特点是:
    • 增加了 PUT、DELETE 等新方法
    • 增加了缓存管理和控制
    • 明确连接管理,允许长连接
    • 增加分块传输(chunked),利于大文件传输
    • 强制要求 Host 头,让互联网主机托管成为可能
  • 2014 年,HTTP/1.1 发布新标准 RFC 7230-7235,优化了细节,没有任何实质性的改动
  • 2015 年,HTTP/2.0 发布,标准 RFC 7540,它是 Google 基于 SPDY 协议定制出来的,特点是:
    • 二进制协议,不再是纯文本
    • 可发起多个请求,不再是 1.1 的管道传输
    • 使用赫夫曼编码压缩头部,减少数据传输量
    • 服务器可以主动向客户端推送数据
    • 增强安全性,要求加密通信
  • 2018 年,HTTP/3.0 标准开始制定,它是 Google 在 HTTP/2 在草案阶段时发明的,它基于 QUIC 协议提出来的,可能未来会跳过 HTTP/2.0 直接进入 HTTP/3.0

二、定义

HTTP,HyperText Transfer Protocol,超文本传输协议

  • 协议:对活动参与者的一种行为约定和规范
  • 传输:两端之间信息的搬运
  • 超文本:文本指的是完整的有意义的数据,可以被浏览器、服务器的应用程序解析,而不是 TCP/UDP 底层新协议解析的二进制包(datagram);超文本,超越了普通文本的文本,一段文本即可定义多种数据,例如 HTML,XML 等

所以,HTTP 就是专门用于网络种两点间传输各种超文本数据的约定和规范

三、常用工具

探索 HTTP 的原理的必备工具:

  • Wireshark
  • Chrome
  • Telnet
  • OpenResty

Wireshark,网络抓包工具。可以截取 TCP/IP 协议栈中传输的所有流量,按照协议类型、地址、端口等任意过滤,功能强大

Chrome,浏览器。对 HTTP/1.1、HTTPS、HTTP/2、QUIC 等协议都支持不错

Telnet,虚拟终端。可以基于 TCP 远程登录主机,用这个可以模拟浏览器的行为,连接服务器后手动发送 HTTP 请求,可以从最原始的层么研究 HTTP 协议

OpenResty,Nginx 的强化版“服务器”。支持 HTTP/HTTPS,可以方便快速地搭建动态网关,也能通过 LUA 写一些 Web 服务器的业务响应逻辑

四、HTTP 抓包

4.1 环境搭建

注意:脚本工具包上传的一些内容是本文定制的,源脚本如文件中的 README 信息所示,属于极客时间

使用环境如下:

  • Win 10
  • openresty-1.17.8.1-win64.zip (2020年7月4日)
  • WireShark 3.2.5-win64,July 1,2020
  • Telnet

其他系统平台可以使用虚拟机来运行 Win10,Telnet 工具,WIn10 自带,可以直接开启:Win 的小娜搜索 -> 启用或关闭 Windows 功能 -> Telnet Client

其他的软件包与脚本到仓库下载:

配置 hosts 域名映射,文件地址:C:\WINDOWS\system32\drivers\etc

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

接着启动 openresty 就会碰到一系列的端口占用 bug,可以尝试以下命令验证 win 平台的端口占用

// 查找端口占用.以下是 80
netstat -ano|findstr ":80"
// 查看 PID 对应的服务,以下是 4192
tasklist /fi "PID eq 4192"
// 杀死进程以及子进程,以下是 4192
taskkill /PID 4192 -t -f

结果 80 端口被前仆后继地占用...

本来以为,修改 Nginx 的配置端口号了,改成 openresty\conf\nginx.conf 中的端口为 7077 即可?

工具包的 www 目录下有对 nginx 操作的各种脚本:

  • start.bat
  • reload.bat
  • list.bat
  • stop.bat

接着发现该目录下的脚本启动不了,但后期需要使用啊!

所以上面的修改端口方法是错误,查看错误日志 \www\logs\error.log ,发现还是 80 端口占用问题

分析原因: www 目录下的脚本重新定义了配置文件,www\conf\ 下的配置会重写 openresty 目录下的配置!

那么分析一下 www 的 nginx 是怎么配置的?

查看 www\conf\nginx.conf,会发现这里的配置是比较分耦合的,把配置分成不同的文件,再 include :

# http conf
http {
    #include     http/common.conf;
    #include     http/cache.conf;
    #include     http/resty.conf;
    #include     http/mime.types;

    include     http/*.conf;

    include     http/servers/*.conf;

}

于是,把 www\conf\http\servers\ 目录下的配置文件端口都修改为 7077 即可

  • http.conf
  • http2.conf
  • origin.conf

这里上传到 GayHub 的脚本与文件是已经修改好的了!

好接着,再使用脚本启动,发现还是错误了,继续查看错误日志,发现是访问权限问题,于是需要把 openresty\nginx.exe 属性中改启动权限为超级管理员

接着访问http://localhost:7077/ 即可看到欢迎界面,也可以通过命令查看是否该进程启动成功,如果成功的话会看到两个同名 nginx 进程

4.2 本地抓包

服务器是安装在本地的,因此抓取本地环回的包,打开 wireshark 进行启动设置:

  1. 过滤器:由于改了服务器的端口,不再是 80,因此新建过滤器,针对 HTTP 7077 端口设定
  2. 网络:选择如下图中标注 3 ,针对本机环回进行抓包

此时,打开 chrome ,请求一下:http://localhost:7077/

此时可以看到 wireshark 成功抓到了刚刚的那个请求的包:

使用完成后,要关闭 nginx 服务,直接用 www 目录的 stop.bat 脚本关闭即可

参考

  • 极客时间 - 透视 HTTP协议
  • CSDN - Windows 脚本常用命令