HTTP 协议深入理解(一)

前言

聊聊 HTTP 协议的知识点 中介绍了 HTTP 协议主要负责服务端和客户端的数据传输,数据传输主要分为 2 块:一是请求数据,客户端向服务端请求数据;二是响应数据:服务端向客户端响应数据,然而请求和响应都是通过请求报文和响应报文来完成的。今天我将带大家了解 HTTP 协议请求报文和响应报文的组成部分有哪些。

HTTP 报文

在 【HTTP 图解】中将请求报文和响应报文主要分为 2 块:报文首部和报文主题,具体如下图所示:

在这里插入图片描述
为了方便理解,我将 HTTP 请求报文和响应报文做了如下拆分:

HTTP 请求报文组成部分:请求行、请求头、请求体(请求正文),其中:

  • 请求报文首部 = 请求行 + 请求头。
  • 请求头 = 请求首部字段、通用首部字段、实体首部字段、其他。

HTTP 响应报文组成部分:响应行、响应头、响应体(请求正文)其中:

  • 响应报文首部 =响应行 + 响应头 。
  • 响应头 = 响应首部字段、通用首部字段、实体首部字段、其他。

关于请求报文和响应报文我将继续沿用百度查询西红柿炒鸡蛋怎么做?来进行解释,下面示例将采用 Wireshark 抓包工具来查看整个请求过程的 HTTP 协议信息。

首先通过 PostMan 输入如下图所示请求访问:
在这里插入图片描述
下图是 Wireshark 抓包工具抓取到 HTTP 请求:
在这里插入图片描述
按照如下图所示操作获取 HTTP 请求报文信息。
在这里插入图片描述
如下图所示就是百度查询西红柿炒鸡蛋怎么做?请求报文和响应报文。
在这里插入图片描述

HTTP 请求报文

如下所示就是 HTTP 的请求报文。

GET /s?wd=%E8%A5%BF%E7%BA%A2%E6%9F%BF%E7%82%92%E9%B8%A1%E8%9B%8B%E6%80%8E%E4%B9%88%E5%81%9A%EF%BC%9F& HTTP/1.1
User-Agent: PostmanRuntime/7.19.0
Accept: */*
Cache-Control: no-cache
Postman-Token: fc464443-fecf-4b81-977a-3a51347bfd91
Host: www.baidu.com
Accept-Encoding: gzip, deflate
Cookie: BIDUPSID=E179BB978E232DFBD9C11561AA2C7793; PSTM=1603590330; BAIDUID=E179BB978E232DFB6A030667626C4CEE:FG=1; BD_HOME=1; H_PS_PSSID=32809_1445_32856_31253_32230_7516_7605_32115_32846_32913; delPer=0; BD_CK_SAM=1; PSINO=1; BDSVRTM=12
Connection: keep-alive

请求行

请求行包含内容:请求方法、URI 、HTTP 协议版本。如下所示就是百度查询西红柿炒鸡蛋怎么做的请求行。

GET /s?wd=%E8%A5%BF%E7%BA%A2%E6%9F%BF%E7%82%92%E9%B8%A1%E8%9B%8B%E6%80%8E%E4%B9%88%E5%81%9A%EF%BC%9F& HTTP/1.1

GET:是 HTTP 请求方法,表示获取资源并且不会对资源做任何修改操作。

其他常见的HTTP 方法有:

  • PUT:常用于更新资源。通过请求体携带资源发送给服务器。
  • POST:一般用与在请求正文中传输数据,常用于创建新资源。
  • DELETE:删除资源。

HTTP/1.1:表示HTTP协议版本是 1.1。
中间内容:搜索的URI,URL 解码后的内容是 wd=西红柿炒鸡蛋怎么做?&

请求头

如下所示就是 HTTP 的请求报文中请求头的信息。

User-Agent: PostmanRuntime/7.19.0
Accept: */*
Cache-Control: no-cache
Postman-Token: fc464443-fecf-4b81-977a-3a51347bfd91
Host: www.baidu.com
Accept-Encoding: gzip, deflate
Cookie: BIDUPSID=E179BB978E232DFBD9C11561AA2C7793; PSTM=1603590330; BAIDUID=E179BB978E232DFB6A030667626C4CEE:FG=1; BD_HOME=1; H_PS_PSSID=32809_1445_32856_31253_32230_7516_7605_32115_32846_32913; delPer=0; BD_CK_SAM=1; PSINO=1; BDSVRTM=12
Connection: keep-alive
  • User-Agent:表示客户端设备的类型,如上所示请求客户端为PostMan。
  • Accept:表示期望服务端返回资源的类型 / 表示任意资源。常见的格式有:test/html、application/json
  • Cache-Control:响应的数据是否缓存到客户端,no-cache 表示不进行缓存。
  • Host:请求服务器的域名。
  • Accept-Encoding:客户端声明请求体和响应体可以被编码压缩。

Cookie 和 Connection: keep-alive 是HTTP 协议重点要掌握的知识点。

Cookie:设置请求的 Cookie 信息,HTTP 协议是无状态的协议,也就是说在HTTP 协议中是不会对请求和响应做持久化。例如网站登录信息无法保存问题,这个就是靠Cookie解决的。

Connection: keep-alive HTTP 协议每次通信就需要连接和断开TCP 链接,这样会造成大量的通信的开销。为解决这一问题,HTTP 1.1 提出持久连接,只要任意一方没有提出断开连接,则保持TCP 连接状态。如果想使用持久连接则需要声明 Connection: keep-alive。

请求体

POST 请求参数信息会显示在请求体中,因为这里示例是GET 请求,所以请求体没有内容。

HTTP 响应报文

如下所示就是 HTTP 的响应报文。

HTTP/1.1 200 OK
Bdpagetype: 3
Bdqid: 0xdc4ae6fa0041428c
Cache-Control: private
Ckpacknum: 2
Ckrndstr: a0041428c
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Sun, 25 Oct 2020 10:45:17 GMT
Server: BWS/1.1
Set-Cookie: delPer=0; path=/; domain=.baidu.com
Set-Cookie: BD_CK_SAM=1;path=/
Set-Cookie: PSINO=1; domain=.baidu.com; path=/
Set-Cookie: BDSVRTM=13; path=/
Set-Cookie: H_PS_PSSID=32809_1445_32856_31253_32230_7516_7605_32115_32846_32913; path=/; domain=.baidu.com
Traceid: 1603622717028232167415873753798041223820
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked

<!DOCTYPE html>
<!--STATUS OK-->
省略具体HTML 信息

响应行

响应行包含 HTTP 版本号、状态码、状态码原因短语。

HTTP/1.1 200 OK

常见的状态码以及状态码原因短语如下:

  • 200 OK 服务器成功返回请求书籍
  • 201 CREATED 新建或修改数据成功
  • 202 Accepted 表示一个请求已经进入后台排队(异步任务)
  • 204 NO CONTENT 删除数据成功
  • 400 INVALID REQUEST 请求有错误,服务器没有进行新建或修改数据的操作(幂等操作)
  • 401 Unauthorized 没有权限(令牌、用户名、密码错误)
  • 403 Forbidden 得到授权(与401错误相对),但是访问是被禁止的
  • 404 NOT FOUND 请求记录不存在,服务器没有进行操作(幂等操作)
  • 406 Not Acceptable 请求的格式不符合(比如用户请求JSON格式,但是只有XML格式)
  • 500 INTERNAL SERVER ERROR 服务器发生错误,无法判断发出的请求是否成功

响应头

响应头和请求头差不多,主要声明响应的一些公共信息参数。有些参数和请求头是一样的。

响应体

响应体主要包含响应的具体内容。百度查询西红柿炒鸡蛋怎么做具体响应体如下图所示:
在这里插入图片描述

小结

本文主要讲述了 HTTP 协议由请求报文响应报文组成,其中请求报文包含了:请求行、请求头、请求体,响应报文包含了:响应行、响应头、响应体。需要注意的是HTTP 协议是无状态协议,但是可以通过Cookie 记录状态,还有就是HTTP 协议通过 持久连接减少通信的开销。

参考文献

[1]【日】上野 宣著 图解HTTP

©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:上身试试 返回首页