HTTP 报文结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 报文结构相关的知识,希望对你有一定的参考价值。

参考技术A

HTTP 报文有 请求报文 响应报文 两种。
请求报文 :从客户向服务器发送请求报文。
响应报文 :从服务端到客户的回答。

由于 HTTP 是 面向文本的 ,因此在报文中的每一个字段都是一些 ASCII 码串,因此各个字段的长度是不确定的。
这也造成了 HTTP 报文结构的统一性,不然无法解析出数据。

HTTP的这两种报文都由三部分组成: 开始行 首部行 实体主体

区分 请求报文 响应报文

方法 : 向请求资源指定的资源发送请求报文的方法,其作用是可以指定请求的资源按期望产生某种行为。
URL : 链接
HTTP版本 :目前有 HTTP/1.0、HTTP/1.1、HTTP/2.0 版本,其中 HTTP1.0 版本使用较广泛。

以下为 HTTP/1.0 和 HTTP/1.1 支持的方法:

状态码(Status-Code) 都是三位数字的,分为 5 大类共 33 种。
如:

1.是用来说明浏览器、服务器或报文主体的一些信息。
2.可以有好几行,也可以不使用
3.每个首部行都是由 首部字段名 [空格] 组成
4.每个首部行在结束地方都有 CRLF (『回车』和『换行』符)

HTTP 首部字段分为 4 种: 通用首部字段 请求首部字段 响应首部字段 实体首部字段

一张图展示所有字段:

脑图链接:
https://www.processon.com/view/link/58025201e4b0d6b27dd4c8af

在请求报文中,一般是 post/put 提交的表单信息。与首部行之间有 CRLF 即空行。

说了这么多,再上点例子来辅助理解。
打开 chrome 控制台,点击 NetWork , 然后输入一个网址,回车,一般我们都会有这样的场面

页面中有很多的请求,点击一个请求进去呢,比如第一个

你会发现请求报文和响应报文都在图中,不过这些都是 chrome 浏览器为了我们方便查看,帮我们美化过了的。
不知道你们是否有注意到 view source 字眼,点击看看

你会发现, 响应报文 和 请求报文就是上面讲的 HTTP 报文结构-- 开始行、首部行。

而实体主体可以在 Request Headers 下面的 Request Payload 看到,下图是我编写这边文章时的自动保存的请求。大家可以自己尝试下。

下图是使用 wireshark 抓到这条请求的 HTTP 报文,蓝色框框部分就是实体主体。

HTTP 报文有 请求报文 响应报文 两种。
HTTP的这两种报文都由三部分组成: 开始行 首部行 实体主体
开始行可用于区分两种报文。
首部行都是由 首部字段名 组成,每个首部行在结束地方都有 CRLF
首部行和实体主体间有 CRLF

http报文结构

1.HTTP报文

那么什么是HTTP报文呢?

HTTP报文是用于HTTP协议交互的信息,HTTP报文本身是由多行数据构成的字符串文本。

 

请求报文和响应报文

HTTP通信过程包括客户端往服务器端发送请求以及服务器端给客户端返回响应两个过程。

客户端往服务器端发送请求时的报文叫做请求报文

服务器端接受客户端请求后,返回给客户端的报文叫做响应报文

 

2.请求报文及响应报文的结构

不管是请求报文还是响应报文,都由起始行报文头域空行报文主体构成

HTTP报文结构如图:

起始行
报文头域
空行
报文主体

 

 

请求报文起始行叫请求行

响应报文的起始行叫状态行

报文头域往往由多个头域构成,每个头域由一个域名,冒号(:)域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符

请求报文的报文头域又分为请求头域,通用头域,实体头域

响应报文的报文头域又分为响应头域,通用头域,实体头域

空行的作用就是分割报文头域和报文主体,它告诉接收方报文头域到此为止。

报文主体又称为报文实体或者实体,即所要传输的数据,主体中可以包含文本或者二进制数据,也可以为空

 

 

请求报文结构

技术图片

 

请求报文实例

 技术图片

 

 

响应报文实例

技术图片

 

 

 

请求行

请求行由请求方法字段URL字段HTTP协议版本字段3个字段组成,它们用空格分隔

HTTP中的请求方法包括:GET、POST、HEAD、PUT、DELETE。一般常用的为GET和POST方式。

HTTP协议版本有两种:HTTP1.0 和 HTTP1.1

HTTP1.0/HTTP1.1的区别:

HTTP1.0对于每个连接都只能传送一个请求和响应,请求完服务器返回响应就会关闭,HTTP1.0没有Host字段。

而HTTP1.1在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段。

 

状态行

响应行一般由协议版本状态码及其状态码的简单描述3个字段组成,它们也用空格分隔 比如 HTTP/1.1 200 OK

常见状态码:

100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。

200~299:表示成功接收请求并已完成整个处理过程。常用200

300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)

400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)

500~599:服务器端出现错误,常用500

 

通用头域

通用头域包含请求和响应消息都支持的头域,对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。

通用头域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。

 

实体头域

请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域实体所谓的实体就是上面所说的报文主体,也就是想要传输的原始数据)组成。

实体头域包含关于实体的原信息

实体头包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。

 

请求头域

请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理

请求头域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。

 

响应头域

响应头域主要描述服务器的信息Request-URI进一步的信息。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。

响应头域包含Age、 Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW- Authenticate。

以上是关于HTTP 报文结构的主要内容,如果未能解决你的问题,请参考以下文章

HTTP报文结构分析&HTTP请求方法剖析

HTTP结构

HTTP的报文结构和状态码总结

HTTP-报文结构

HTTP报文结构和内容(转)

http请求报文结构