HTTP 报文格式
HTTP 协议的请求报文和响应报文的结构基本相同,由四部分组成:
- ① 起始行(start line):描述请求或响应的基本信息;
- ② 头部字段集合(header):使用
key-value
形式更详细地说明报文; - ③ 空行 + CRLF回车换行
- ④ 消息正文(body):实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
HTTP 是一个 “纯文本” 的协议,所以头数据都是 ASCII 码的文本,可以很容易地用肉眼阅读。
请求报文格式:
响应报文格式:
注:根据 RFC 2616(HTTP/1.1)规定,头部字段中,字段值的前面可以有一个或多个可选的空格,但是字段名中以及字段名和
:
之间不能有空格。这就是为什么浏览器的开发者工具和一些抓包工具得到的Http报文是可读性更好的带空格版本。
请求报文的请求行
请求行简要地描述了客户端想要如何操作服务器端的资源。
请求行由三部分组成:请求方法 + 空格
+ URI + 空格
+ 版本号 + CRLF回车换行
- ① 请求方法:是一个动词,如 GET/POST,表示对资源的操作方式;
- ② 请求目标:请求目标的路径 path,通常是一个 URI,标记了请求方法要操作的资源;
- ③ 版本号:表示报文使用的 HTTP 协议版本,如 HTTP/1.1 。
这三个部分通常使用空格(space)来分隔:
URI:统一资源标识符(Uniform Resource Identifier)
响应报文的状态行
在这里它不叫“响应行”,而是叫“状态行”(status line),意思是服务器响应的状态。
状态行由三部分组成:版本号 + 空格
+ 状态码 + 空格
+ 原因 + CRLF回车换行
- ① 版本号:表示报文使用的 HTTP 协议版本,如 HTTP/1.1;
- ② 状态码:一个 3 位数字,表示处理的结果,比如 200-成功,500-服务器错误,404-资源不存在;
- ③ 原因描述:作为数字状态码补充,是更详细的解释文字,帮助人理解原因。
头部字段
HTTP 协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:
-
① 通用字段:在请求头和响应头里都可以出现;比如
Date
、Connection
-
② 请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件;比如
Host
、Accept
等 -
③ 响应字段:仅能出现在响应头里,补充说明响应报文的信息;比如
Server
等 -
④ 实体字段:它实际上属于通用字段,但专门描述 body 的额外信息。比如
Content-Length
等
对 HTTP 报文的解析和处理实际上主要就是对头字段的处理,理解了头字段也就理解了 HTTP 报文。
常用头字段 - Host 字段
-
Host 是一个请求字段,只能出现在请求头里。
-
Host 同时也是唯一一个 HTTP/1.1 规范里要求必须出现的字段,也就是说,如果请求头里没有 Host,那这就是一个错误的报文。
-
Host 字段其实是在告诉服务器这个请求应该由哪个主机来处理。
常用头字段 - User-Agent 字段
-
User-Agent 是一个请求字段,只出现在请求头里。
-
它使用一个字符串来描述发起 HTTP 请求的客户端,服务器可以依据它来返回最合适此浏览器显示的页面。
常用头字段 - Date 字段
- Date 字段是一个通用字段,但通常出现在响应头里,表示 HTTP 报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略。
常用头字段 - Server 字段
-
Server 字段是一个响应字段,只能出现在响应头里。 它告诉客户端当前正在提供 Web 服务的软件名称 和 版本号。
-
Server 字段也不是必须要出现的,因为这会把服务器的一部分信息暴露给外界,如果这个版本恰好存在bug,那么黑客就有可能利用 bug 攻陷服务器。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的描述信息。<