常言道 “实践出真知”,又有俗语 “光说不练是假把式”。要研究 HTTP 协议,最好有一个实际可操作、可验证的环境,通过实际的数据、现象来学习,肯定要比单纯的 “动嘴皮子” 效果要好的多。

现成的环境当然有,只要能用浏览器上网,就会有 HTTP 协议,就可以进行实验。但现实的网络环境又太复杂了,有很多无关的干扰因素,这些 “噪音” 会 “淹没” 真正有用的信息。

所以,我给你的建议是:搭建一个 “最小化” 的环境,在这个环境里仅有 HTTP 协议的两个端点:请求方和应答方,去除一切多余的环节,从而可以抓住重点,快速掌握 HTTP 的本质。

https://static001.geekbang.org/resource/image/85/0b/85cadf90dc96cf413afaf8668689ef0b.png

简单说一下这个 “最小化” 环境用到的应用软件:

Wireshark 是著名的网络抓包工具,能够截获在 TCP/IP 协议栈中传输的所有流量,并按协议类型、地址、端口等任意过滤,功能非常强大,是学习网络协议的必备工具。

它就像是网络世界里的一台 “高速摄像机”,把只在一瞬间发生的网络传输过程如实地 “拍摄” 下来,事后再 “慢速回放”,让我们能够静下心来仔细地分析那一瞬到底发生了什么。

Chrome 是 Google 开发的浏览器,是目前的主流浏览器之一。它不仅上网方便,也是一个很好的调试器,对 HTTP/1.1、HTTPS、HTTP/2、QUIC 等的协议都支持得非常好,用 F12 打开 “开发者工具” 还可以非常详细地观测 HTTP 传输全过程的各种数据。

如果你更习惯使用 Firefox,那也没问题,其实它和 Chrome 功能上都差不太多,选择自己喜欢的就好。

与 Wireshark 不同,Chrome 和 Firefox 属于 “事后诸葛亮”,不能观测 HTTP 传输的过程,只能看到结果。

Telnet 是一个经典的虚拟终端,基于 TCP 协议远程登录主机,我们可以使用它来模拟浏览器的行为,连接服务器后手动发送 HTTP 请求,把浏览器的干扰也彻底排除,能够从最原始的层面去研究 HTTP 协议。

OpenResty 你可能比较陌生,它是基于 Nginx 的一个 “强化包”,里面除了 Nginx 还有一大堆有用的功能模块,不仅支持 HTTP/HTTPS,还特别集成了脚本语言 Lua 简化 Nginx 二次开发,方便快速地搭建动态网关,更能够当成应用容器来编写业务逻辑。

选择 OpenResty 而不直接用 Nginx 的原因是它相当于 Nginx 的 “超集”,功能更丰富,安装部署更方便。我也会用 Lua 编写一些服务端脚本,实现简单的 Web 服务器响应逻辑,方便实验。