一、HTTP 简介
HTTP (全称为"超文本传输协议")是一种应用非常广泛的应用层协议。
HTTP 往往是基于传输层的 TCP 协议实现的。(HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3 基于 UDP 实现)。
目前我们主要使用的还是 HTTP1.1 和 HTTP2.0。本文章主要以 HTTP 1.1 版本为主。
https 是在 http 基础之上做了一个加密解密的工作(SSL)。
二、HTTP 协议格式:
HTTP 是一个文本格式的协议。可以通过 Chrome 开发者工具或者 Fiddler 抓包,分析 HTTP 请求/响应的细节。
由于 Fiddler 抓 HTTP 的效果更好,所以我们采用 Fiddler 作为我们的抓包工具。
2.1 抓包工具的使用:
Fiddler 下载地址:Fiddler 官网
下载流程:
- 打开官网,点击下面红色框框里面的内容。
- 填入信息即可安装。

- 安装成功后的界面如下(左边一开始不一定有信息):
-
出现这个页面,一定要选取“是”同意安装证书,否则无法抓取 HTTPS(如果点了否,就要卸掉,重新安装)。
使用教程:

-
左侧窗口显示了所有的 HTTP请求/响应,可以选中某个请求查看详情。
-
右侧上方显示了 HTTP 请求的报文内容。(切换到 Raw 标签页可以看到详细的数据格式)。
-
右侧下方显示了 HTTP 响应的报文内容。(切换到 Raw 标签页可以看到详细的数据格式)。
-
请求和响应的详细数据,可以通过右下角的 View in Notepad 通过记事本打开。
-
可以使用 ctrl + a 全选左侧的抓包结果,delete 键清除所有被选中的结果。
点击左下角 Capturing 即可停止抓包,再次点击开始抓包。

抓包工具的原理:
Fiddler 相当于一个 “代理”。
浏览器访问 csdn 时,就会把 HTTP 请求先发给 Fiddler,Fiddler 再把请求转发给 csdn 的服务器。当 csdn 服务器返回数据时,Fiddler 拿到返回数据,再把数据交给浏览器。因此 Fiddler 对于浏览器和 csdn 服务器之间交互的数据细节,都是非常清楚的。

2.2 HTTP 请求报文格式:
一个 HTTP 请求报文,分成 4 个部分(1)首行(2)请求头(3)空行(4)正文。

- 首行:
首行又包含三个部分。
- 请求的方法(GET,POST之类的)。
- 请求的 URL(请求的对方地址)。
- 版本号(例如 HTTP/1.1)。
这三个部分使用空格进行区分。
- 请求头(header):
请求的属性,冒号分割的键值对。
每组属性之间使用\n
分隔。
遇到空行表示就 Header 部分结束。
- 空行:
最后一个 header 后面,存在一个空行,类似于链表,使用 null 结尾。
- 正文(body):
空行后面的内容都是 Body。Body 允许为空字符串。如果 Body 存在,则在 Header 中会有一个 Content-Length 属性来标识 Body 的长度。
2.3 HTTP 响应报文格式:
一个 HTTP 响应报文也是分成 4 个部分(1)首行(2)响应头(3)空行(4)正文。
基本和 HTTP 的请求报文格式差不多,区别比较大的就是首行,所以接下来主要分析首行。
响应的首行也是由三部分组成(1)版本号(2)状态码(3)状态码描述。
状态码和状态码描述,可以反应此次响应具体情况。

2.4 HTTP 协议格式总结:

这里有个问题:为什么 HTTP 报文要存在 “空行”?
因为 HTTP 协议并没有规定报头部分的键值对有多少个。空行就相当于是 “报头的结束标记”,或者是"报头和正文之间的分隔符"。HTTP 在传输层依赖 TCP 协议,TCP 面向字节流,如果没有这个空行,就会出现"粘包问题"。