# 1. HTTP报文概念
概念:是HTTP通信中的基本单位,由8位组字节流组成。
# 2. HTTP报文整体结构
整体结构:报文首部 + 空行 + 报文实体
有些地方会写为(这样也可以):起始行 + 首部字段 + 空行 + 报文实体
(首部也就是头部)
另外对于请求报文和响应报文,它们主要是报文首部不同:
请求报文:

真实例子:

响应报文:

真实例子:

# 3. HTTP报文组成
上面👆介绍了一下HTTP报文的整体结构,这里主要是做一下细分。
HTTP报文的整体是:报文首部 + 空行 + 报文实体
不过因为:报文首部 = 起始行 + 首部字段,其实起始行也挺重要的,所以我就分为两部分说了。
大家记住这张图就可以了:

# 3.1 起始行
请求报文中叫:请求行
由:方法 + URI + 版本号 组成
例:GET index.html HTTP/1.1
真实例子可以看上面👆HTTP整体报文那张图。
响应报文中叫:状态行
由:版本号 + 状态码 + 原因短语
例:HTTP/1.1 200 OK
(这个原因短语就是之前学习HTTP状态码每个状态码对应的英文单词,比如404 Not Found)
# 3.2 首部字段
在第四节中细讲。
# 3.3 空行
空行:也就是CR(回车符) 或 LF(换行符),它的作用就是用来区分头部和实体。
例如下面这个实例:

在Connection: keep-alive下面就有一个换行符。
注意点:
如果在头部中故意加一个空行,空行后面的内容会被全部当成实体
# 3.4 报文实体
报文实体也就是具体请求和响应的数据了,就是我们俗说的body。
请求报文中叫:请求体
响应报文中叫:响应体
# 4. HTTP首部字段
(HTTP报文中最繁琐的就是首部字段了,也就是我们经常在network上看到的那么一大串的配置)

HTTP首部字段我会从这几个方面来讲解:
- HTTP首部字段结构
- 四种HTTP首部字段类型
- 非标准的首部字段
- Accept相关字段
# 4.1 HTTP首部字段结构
- 首先基本结构是:
由:key: value
例子:Content-Type: text/html
- 多个字段值用
,号连接:
由:key: value1, value2
例:Keep-Alive: timeout=15, max=100
- 若是字段值有可选参数且是多个则用
;号连接:
由:key: value1, q=1;value2, q=0.8
例:Accept: text/html, q=1; application/xml, q=0.8
- 若是首部字段重复不同的浏览器有不同的处理结果,有些浏览器会优先处理第一次出现的首部字段,而有些则先处理最后出现的首部字段
# 4.2 四种HTTP首部字段类型
首部字段从类型上来说,有四种:
- 通用首部字段(General Header Fields):请求和响应报文都会用的字段
- 请求首部字段(Request Header Fields):请求报文时用的字段
- 响应首部字段(Response Header Fields):响应报文时用的字段
- 实体首部字段(Entity Header Fields):请求和响应报文的实体部分用的字段
而每一种类型下面又有很多字段,可能一下要记这么多也比较难,所以面试时能尽量把自己知道的说出来就可以了,让面试官知道对于一些重要的字段你还是有了解的。
以下我列举了一些,不过标了星号的可是重点哦。
# 通用首部字段

这边有一个需要注意的点:
Connection首部字段有一个值是keep-alive,表示开启持久连接。
而其实还有一个首部字段也叫Keep-Alive,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。
对于这个Keep-Alive首部字段,有两个参数:
timeout:指定了一个空闲连接需要保持打开状态的最小时长(以秒为单位)。需要注意的是,如果没有在传输层设置 keep-alive TCP message 的话,大于 TCP 层面的超时设置会被忽略。max:在连接关闭之前,在此连接可以发送的请求的最大值。在非管道连接中,除了 0 以外,这个值是被忽略的,因为需要在紧跟着的响应中发送新一次的请求。HTTP 管道连接则可以用它来限制管道的使用。
案例🌰:
