Fork me on GitHub

HTTP报文是什么样子的?

一、报文结构

HTTP请求报文和响应报文结构基本相同,都是由以下三个部分组成:

1. 起始行:描述请求或者响应头的基本信息

2. 头部字段集合:使用key-value形式描述报文

3. 消息正文:实际传输的数据,这里不一定是纯文本格式,还能是图片、音频、视频等格式,在前面的文章中有学过。消息正文又称为“实体”,但与“header”对应,很多时候就直接称为“body”。

规定:HTTP协议必须要有heaher,可以没有body,而且再header和正文之间要用一个空行隔开。

所以,一个完整的HTTP报文是这样的:

起始行和头部字段集合对应人的头,空格对应人的脖子,消息正文对应人的身体。

            

 

 

 以上篇文章访问服务器抓到的包看一下报文头部信息:

 

 

 在其中我们标出了起始行和头部字段集合,但是并没有消息正文部分,因此我们就发现这个HTTP报文是一个大头儿子,身子小头部大,在很多时候header头不宜过大,会影响阅读。

现在我们对HTTP报文三个部分分别进行详细学习。

1. 起始行,也被称为请求行,它的作用是描述了客户端要如何操作服务端资源,它由三个部分组成:

(1)请求方法:表示对资源的操作,例如Get、Post等,上面起始行中用的方法是GET

(2)请求目标:表示要访问的URI,标识了请求方法要操作的资源,上面起始行中请求的目标是/,表示网站根目录下的默认文件

(3)版本号:表示报文使用的HTTP版本, 上面起始行中用的版本号是HTTP/1.1

2. 状态行,现在来介绍起始行的孪生兄弟——状态行,表示服务器响应的状态

 

 

(1)版本号:表示报文使用的HTTP版本

(2)状态码:一个三位数,表示服务器的响应结果,这里返回了304,表示浏览器要访问的资源通过缓存查询到了,因此从缓存中返回

(3)原因:作为状态吗的补充,更详细的解释数字。这里是Not Modified,表示“没有修改”

3. 头部字段

请求头或者响应头加上头部信息字段和空格就组成了请求或者响应头部字段。

头部字段使用注意事项:

(1)字段名不区分大小写,例如“Host”也可以写成“host”,但首字母大写的可读性更好;
(2)字段名里不允许出现空格,可以使用连字符“-”,但不能使用下划线“_”。例如,“test-name”是合法的字段名,而“test name”“test_name”是不正确的字段名;
(3)字段名后面必须紧接着“:”,不能有空格,而“:”后的字段值前可以有多个空格;
(4)字段的顺序是没有意义的,可以任意排列不影响语义;

我们这里来简单测试一下头部信息正确或者错误会返回什么信息,可以在实验环境里用 Telnet 连接 OpenResty 服务器试一下,手动发送 HTTP 请求头,试验各种正确和错误的情况。

首先将web服务器打开,www下的start点击后list开启服务器,接着win+r打开命令行窗口,输入telnet,进入初始化页面:

 

 

 然后输入指令:open www.chrono.com 80连接上了服务器。

这里要注意,输入指令后出现正在连接的提示,其实这时就已经默认连接上浏览器了,这时我们使用快捷键ctrl+],再点击enter键,进入编辑页面:

 

 

 

 

 

 接下来输入如下信息:

GET /09-1 HTTP/1.1
Host:   www.chrono.com
 
 
GET /09-1 HTTP/1.1
Host : www.chrono.com

首先模拟第一个HTTP请求,输入后点击两次enter键,得到相应结果,如下所示:

 

 访问成功,说明主机地址前加入空格对HTTP请求没有影响。

然后再来试一下第二种再host后面加入请求:

 

 访问失败,说明host后面不能加任何空格。验证了上面的说法。

二、课后习题

1. 如果拼 HTTP 报文的时候,在头字段后多加了一个 CRLF,导致出现了一个空行,会发生什么?

答:空行后面的内容被当成了报文主体
讲头字段时说“:”后的空格可以有多个,那为什么绝大多数情况下都只使用一个空格呢?

答:这时约定俗成的默认用法,按照rfc标准,空格可以是零个或多个,但一个空格已经成了约定俗成的习惯。

至此,结束。

posted @ 2021-02-23 16:58  叶语婷  阅读(724)  评论(0编辑  收藏  举报