13

图解HTTP权威指南(一)| HTTP报文 - InfoQ 写作平台

 3 years ago
source link: https://xie.infoq.cn/article/a40e00cc900dce19a517d5e2c
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

图解 HTTP 权威指南(一)| HTTP 报文

运维汪
关注
发布于: 2020 年 12 月 22 日
d264058d1496dfcbc67c399be0524d21.png

1、报文流是如何流动的

2、HTTP报文的三个组成部分

3、请求和响应报文之间的区别

4、请求报文支持的各种方法

5、和响应报文一起返回的各种状态码

6、各种各样的HTTP首部都是用来做什么的

二、报文流

1、什么是HTTP报文

HTTP报文是在HTTP应用程序直接发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头。这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理直接流动。

常用术语:流入、流出、上游、下游

2、报文流入源端服务器

HTTP使用术语流入(inbound)流出(outbound)来描述事务处理(transaction)的方向。报文流入源端服务器,工作完成后,会流回用户的Agent代理中。

003524115245d4972e82d6d8409b9533.png
3、报文向下游流动

HTTP报文会像河水一样流动。不管是请求报文还是响应报文,所有报文都会向下游(downstream)流动。所有的报文的发送者都在接收者的上游(upstream)。

0db1fdc2d9ff6b33fc35e79f8c83cc35.png

对于请求报文来说,代理1位于代理3的上游;但对于响应报文来说,它就位于代理3的下游。

三、报文的组成

HTTP报文是简单的格式化数据块。每条报文都包含一条来自客户端的请求,或者一条来自服务端的响应。他们由三个部分组成:对报文进行描述的起始行(start line),包含属性的首部(header)块,以及可选的、包含数据的主体(body)部分。

bf0f6c7e3d0400532f529a191db0490b.png

起始行和首部是由行分隔符的ASCII文本,每行都以一个由两个字符组成的行终止序列作为结束,其中包含一个回车符(ASCII码13)和一个换行符(ASCII码10)。

实体的主体或报文的主体是一个可选的数据块。与起始行和首部不同的是主体可以包含文本或二进制数据,也可以为空。

四、报文的语法

所有的HTTP报文都可以分为两类:请求报文(request message)和响应报文(response massage)。请求报文会向Web服务器请求一个动作。响应报文会将请求的结果返回给客户端。请求和响应报文的基本报文机构相同。

b6edfe583cf2c3df7b5d397c756cf800.png

请求报文的格式

<method> <request-URL> <version>
<headers>
<entity-body>
3420d44f7fc8b5d356f77e09d15314c4.png

响应报文的格式

<version> <status> <reason-phrase>
<headers>
<entity-body>
6135cda5182138885e0768e71e3d6409.png

1、起始行

所有的HTTP报文都以一个起始行作为开始。请求报文的其实行说明了要做些什么。响应报文的起始行说明了发生什么

1)请求行

请求报文请求服务器对资源进行一些操作。请求报文的起始行,或称为请求行,包含了一个方法和一个请求的URL,这个方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法。请求行中还包含了HTTP的版本,用来告知服务器,客户端使用的是哪种HTTP。

2)响应行

响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,或称为响应行,包含了响应报文使用的HTTP版本、数字状态码,以及描述操作状态的文本形式的原因短语。

请求的起始行以方法作为开始,方法用来告知服务器需要做些什么。

e5a1f2602f98def9cc609b0643ba3606.png
3、版本号

报文所使用的HTTP版本,格式为:

HTTP/<major>.<minor>

其中主要版本号(major)和次要版本号(minor)都是整数。

4、状态码(status code)

这三位数字描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(“成功”、“出错”等)。

fcf2c3302fa26f04cd544c28baf3cce2.png
5、原因短语(reason-phrase)

数字状态的可读版本,包含行终止序列之前的所有文本。

6、首部(header)

可以有零个或多个首部,每个首部都包含有个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF。首部都是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始。

e1cc369ba754732d149cec6293434ef3.png
7、实体的主体部分(entity-body)

实体的主题部分包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK