前面说到,HTTP事务是由HTTP报文的格式化数据块进行通信的,本文就详细介绍一下HTTP报文的组成和结构。
HTTP报文是由一行一行的简单字符串组成的。由于HTTP报文都是纯文本,所以你可以很方便的对其进行读写。
下图显示一个简单的HTTP事务的报文:
从客户端发往服务器的报文叫请求报文(request message),服务器收到请求报文后,作为响应发往客户端的报文称为响应报文(response message),请求报文和响应报文的格式都是一样的,HTTP报文格式主要包含三个部分:
起始行:
请求报文的起始行说明这个HTTP请求的需求【如上图中的:GET /index_page.html HTTP/1.0 说明:要向服务器通过GET方法获取 /index_page.html 资源,HTTP协议版本为HTTP/1.0】
响应报文的起始行 说明服务器的响应情况【如上图中的:HTTP/1.0 200 OK,说明服务器的响应情况为 200 OK】
首部字段:
在HTTP的报文起始行后面往往会有多个首部字段(非必须),这些字段都以 Key:value的格式发出,首部以一个空行结束(空行后面就是主体,也可能没有主体)
如上图中的请求报文中的首部字段有:
Accept:text/html,application/xhtml+xml,application/xml;
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Cookie:balabala....
Host:www.myweb.com
响应报文中的首部字段有:
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Thu, 29 Mar 2018 08:20:03 GMT
Server:openresty
Transfer-Encoding:chunked
主体:
报文主体就是报文的主要数据部分,它可以是任意数据类型的数据。比如请求主体中包含了要发给服务器的数据,响应主体中装载了要返回给客户端的数据。
起始行和首部都是文本化且具有特定结构的,主体则可包含所有二进制数据和文本。
下面介绍一个HTTP报文实例:
这个是Google Chrome 开发者模式下的HTTP请求抓包数据,下面解释这个报文:
HTTP报文便于阅读,但不好的地方在于解析起来不太方便。
HTTP /1.1 首部字段说明:
HTTP首部字段有很多,这里列举说明一下HTTP/1.1 的首部字段:
通用首部字段
请求首部字段:
响应首部字段 :
实体首部字段:
在非HTTP/1.1中使用到的首部字段还有 Cookie、 Set-Cookie 和 Content-Disposition 等在其他 RFC 中定义的首部字段的使用频率也很高。
这些非正式的首部字段统一归纳在 RFC4229 HTTP Header Field Registrations 中。
参考:
《HTTP权威指南》