HTTP协议——HTTP报文组成

一、报文流

        HTTP报文是在HTTP应用程序之间发送的数据块,这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义。这些报文在客户端、服务器和代理之间流动。

1、报文流入源端服务器

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


2、报文向下游流动

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


二、报文的组成

        HTTP报文是简单的格式化数据块,每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。它们由三个部分组成:对报文进行描述的其实行、包含属性的首部块、以及可选的、包含数据的主题部分。
        起始行和首部就是由行分隔的 ASCII文本。每行都以一个由2个字符组成的行终止序列作为结束,包括一个回车符(ASCII码13)和一个换行符(ASCII码10),这个行终止序列可以写为CRLF。(稳健的应用程序也应该接受单个换行符作为行的终止)
        实体的主体和报文的主体是一个可选的数据块。与起始行和首部不同的是,主体中可包含文本或二进制数据,也可以为空如上图,Content-type行说明了主体是一个纯文本文档,Content-length说明了主体有19字节。

1、报文的语法

        HTTP报文分为请求报文和响应报文。请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客户端。请求和响应报文的基本报文结构相同。

请求报文的格式
<method><request-URL><version>
<headers>
<entity-body>
响应报文的格式
<version><status><reason-phrase>
<headers>
<entity-body>

各部分的简要描述

方法(method)

        客户端希望服务器对资源执行的动作,是一个单独的词,如GET,POST等。

请求RUL(request-URL)

        命名了所请求资源,或者URL路径组件的完整URL。如果直接与服务器进行对话,只要URL的路径组件是资源的绝对路径,通常就不会有什么问题——服务器可以嘉定自己是URL的主机/端口。

版本(version)

        报文锁使用的HTTP版本,其格式如下:
        HTTP/<major>.<minor>
        其中主要版本号(major)和次要版本号(minor)都是整数。

状态码(status-code)

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

原因短语(reason-phrase)

        数字状态码的可读版本,包含行种植序列之前的所有文本。原因短语只对人类有意义。

首部(header)

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

实体的主体部分(entity-body)

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

2、起始行

        所有的HTTP报文都是以一个起始行作为开始。请求报文的起始行说明了要做些什么。响应报文的起始行说明发生了什么。
请求行
请求报文请求服务器对资源进行一些操作。请求行(即请求报文的起始行),包含一个方法和一个请求URL,这个方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法。请求行中包含HTTP的版本,用来告知服务器,客户端使用的是那种HTTP。
如下例子:

请求方法是GET,请求URL为/test/hi-there.txt,版本为HTTP/1.1。

响应行

响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应行(即响应报文的起始行),包含了响应报文使用的HTTP版本、数字状态码,以及描述操作状态的文本形式的原因短语。
这些字段都由空格符进行分隔,如下例子:


HTTP版本为HTTP/1.0,状态码为200,原因短语为OK,表示文档已经呗成功返回来。

方法

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

HTTP规范中定义了一组常用的请求方法,如GET、POST,具体如下:

整体范围

已定义范围

分类

GET

从服务器获取一份文档

HEAD

只从服务器获取文档的首部

POST

向服务器发送需要处理的数据

PUT

将请求的主体部分存储在服务器上

TRACE

对可能经过代理服务器传送到服务器上去的报文进行追踪

OPTIONS

决定可以在服务器上执行哪些方法

DELETE

从服务器上删除一份文档

        具体的方法介绍后面会介绍。
状态码
        状态码用来告诉客户端,发生了什么事;状态码位于响应的起始行中。状态码在每条响应报文的起始行中返回的,以一个数字和一个可读的状态组成;数字码便于程序进行差错处理,原因短语则便于理解。

        具体的状态码分类如下:

整体范围

已定义范围

分类

100~199

100~101

信息提示

200~299

200~206

成功

300~399

300~305

重定向

400~499

400~415

客户端错误

500~599

500~505

服务器错误

        当前HTTP版本只为每类状态定义了几个代码,如果收到不认识的状态码,可能有人将其作为当前协议的扩展定义的。可以根据其所在范围,将它当作那个类别中一个普通的成员来处理。

原因短语
        原因短语为状态码提供了文本形式的解释,和状态码成对出现,是状态码的可读版本,应用程序将其传给客户,说明在请求期间发生了什么;稍后会整理出一些状态码和其建议使用的一些原因短语
版本号

        版本号会以http/x、y的形式出现在请求和响应报文的起始行中,为应用程序提供了一种将自己遵循的协议版本告知对方的方式
        通信时最好使请求和响应的版本号保持一致,否则很容易造成误解,使程序无法识别
        PS:版本号不会被当做分数处理,每个数字都是独立的,比如,HTTP/2.22版本高于HTTP/2.3

3、首部

        http首部字段向请求和响应报文中添加一些附加信息;本质来讲,他们知识一些名/值对的列表。
首部分类
        HTTP规范定义了集中首部字段,应用程序也可以随意发明自己所用的首部。HTTP首部可以分为以下几类。

        通用首部:即可出现在请求报文中,也可出现在响应报文中
        请求首部:提供更多有关请求的信息
        响应首部:提供更多有关响应的信息
        实体首部:描述主体的长度和内容,或者资源本身
        扩展首部:规范中没有定义的新首部

        每个http首部都有一种简单的语法:名字后面是冒号(:),然后跟上可选的空格,再跟上字段值,最后以一个CRLF结束。

首部延续行
将长的首部行分为多行可以提高可读性,多出来的每行前面至少要有一个空格或制表符(tab)。
例如:

       

        在这个例子中,响应报文里包含了一个Server首部,其值被划分成了多个延续行。该首部的完整值为Test Server Version 1.0。后面户详细介绍所有HTTP首部。

4、实体的主体部分

        HTTP报文的第三部分是可选的实体主体部分。实体的主体是HTTP报文的复合,就是HTTP要传输的内容。
        HTTP报文可以承载很多类型的数字数据:图片、视频、HTML文档、软件应用程序、信用卡事务、电子邮件等。




猜你喜欢

转载自blog.csdn.net/vikeyyyy/article/details/80612178