HTTP协议报文概述

一. 概述

www(或web)定义了3个重要的概念,它们分别是访问信息的手段与位置(URI,Uniform Resource Identifier),信息的表现形式(HTML,HyperText Markup Language)以及信息转发(HTTP,HyperText Transfer Protocol)等操作。URI比URL(Uiniform Resource Locator)更广泛,不局限于标识互联网资源,还可以标识所有资源。

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),采用TCP协议而非UDP协议。

用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的http报文叫做请求报文,响应端的叫做响应报文。

报文,是网络中交换和传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。

HTTP报文是由一行一行简单的字符串组成的。HTTP报文都是纯文本,不是二进制代码,所以人们可以很方便地对其进行读写。如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了。

HTTP三点注意事项:

HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。

HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http协议通讯流程:

 二. 报文流动

报文会流入源端服务器,工作完成之后,会流会用户的Agent代理。

HTTP报文会像河水一样流动,不管是请求报文还是响应报文,所有报文都会向下游流动。所有报文的发送者都在接受者的上游。如下图所示,对请求报文来说,代理1位于代理3的上游,但对响应报文来说,它就位于代理3的下游。

HTTP默认使用80端口,工作机制是,首先客户端向服务器的80端口建立一个TCP连接,然后在这个TCP连接上进行请求和应答以及数据报文的发送。

web浏览器执行的程序为客户端程序,在服务器端执行的程序为服务器端程序。

javascript是一种嵌入在HTML中的编程语言,作为客户端程序可以运行于多个浏览器中。

cgi是web服务器调用外部程序时所使用的一种服务应用的规范。

cookie,web服务器用cookie在客户端保存信息(多为用户名和登录名,或网络购物中购物车商品信息)。从web服务器检查cookie可以确保是否为同一对端的通信,从而存放于购物车里的商品信息(网购场合)就不必要再保存到服务器上了。

三. 协议版本

HTTP协议有三个版本:1.0, 1.1和2,目前一般都是HTTP/2(2.0)。

http采用方案hypertext transfer protocol,https采用方案hypertext transfer protocol security。

各版本主要特点:

HTTP1.0:无状态,无连接。在http1.0中每一个命令和应答都会触发一次TCP连接的建立和断开。

HTTP1.1: 持久连接,请求管道化,增加缓存处理(新增字段如cache-control),增加Host字段支持断点传输等。HTTP/1.1版的头部信息是文本,数据体可以是二进制或文本。

HTTP/2:二进制分帧,多路复用,头部压缩,服务器推送。 HTTP/2的头信息和数据体都是二进制,并且统称为“帧”,头信息帧和数据帧。(HTTP/2单向认证加密报文如下图,数据加密不能抓取数据)

(HTTP/2协议握手分2种方式,一种叫h2,一种叫h2c。

h2要求必须使用TLS加密,在TLS握手期间会顺带完成HTTPS/2协议的协商,如果协商失败(比如客户端不支持或者服务端不支持),则会使用HTTPS/1继续后续通讯。

h2c不使用TLS,而是多了一次基于HTTP协议的握手往返来完成向HTTP/2协议的升级,一般不建议使用。)

 

四. 报文的组成

HTTP报文本身是由多行(用CR+LF作为换行符)数据构成的字符串文本。

HTTP报文是简单的格式化文本。如下图所示。每条报文都包含一条来自客户端的请求或者一条来自服务器的响应。它们由三部分组成:对报文进行描述的起始行、包含属性的首部块以及可选的、包含数据的主体部分。

首部与主体由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。

注:CR+LF:CR(Carriage Return,回车,16进制0x0d,\r)和LF(Line Feed,换行,16进制0x0a,\n)。

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

1. 报文的语法

请求报文的格式

<method> <request-URL> <version>  
<headers>  
  
<entity-body>

响应报文的格式

<version> <status> <reason-phrase>  
<headers>  
      
<entity-body>  

下面是对报文格式各部分的解释:

method(方法)

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

request-URL(请求URL)

命名了所请求资源,或者URL路径组件的完整URL。

version(版本)

报文所使用的HTTP版本,其格式:HTTP/<major>.<minor>

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

status(状态码)

由三位数字组成,描述了请求过程中所发生的情况。

reason-phrase(原因短语)

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

headers(首部)

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

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

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

 2. 起始行

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

请求行。请求报文请求服务器对资源进行一些操作。请求报文的起始行,称为请求行,包含 一个方法和一个请求URL,方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法。请求行还包含HTTP的版本,用来告知服务器, 客户端使用的是哪种版本的HTTP。所有的这些字段都由空格符分隔。在HTTP/1.0之前,并不要求请求行中包含HTTP版本号。

响应行。响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,称为响应行,包含了响应报文使用的HTTP版本、数字状态码,以及描述状态码的文本信息的原因短语。所有的这些字段都由空格符分隔。在HTTP/1.0之前,并不要求响应行中包含HTTP版本号。

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

HTTP规范中定义了一组常用的请求方法。

注:并不是所有服务器都实现了上面列出的7种方法。而且,由于HTTP设计得易于扩展,所以除了这些方法以外,其他服务器可能还会是实现一些自己的请求方法,称为扩展方法。

状态码。用来告诉客户端,发生了什么事情。

客户端向一个HTTP服务器发送请求报文时,会发生很多事情。状态码是在每条响应报文的起始行中返回的。

下面是状态码的分类

 

1xx-指示信息,表示请求已接收,继续处理。

2xx - 请求成功,表示成功处理了请求的状态代码。

3xx - 请求被重定向,表示要完成请求,需要进一步操作。301-资源(网页等)被永久转移到其它URL。

4xx - 请求错误,这些状态代码表示请求可能出错,妨碍了服务器的处理,通常是客户端出错,需要客户端进一步处理。404 - 请求的资源(网页等)不存在

5xx - 服务器错误,这些状态代码表示服务器在尝试处理请求时发生内部错误,这些错误可能时服务器本身的错误,而不是客户端的问题。500 - 内部服务器错误

1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。

代码   说明
100   (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 
101   (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。

2xx (成功)
表示成功处理了请求的状态代码。

代码   说明
200   (成功)  服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201   (已创建)  请求成功并且服务器创建了新的资源。
202   (已接受)  服务器已接受请求,但尚未处理。
203   (非授权信息)  服务器已成功处理了请求,但返回的信息可能来自另一来源。
204   (无内容)  服务器成功处理了请求,但没有返回任何内容。
205   (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206   (部分内容)  服务器成功处理了部分 GET 请求。

3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。

代码   说明
300   (多种选择)  针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301   (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303   (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304   (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305   (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307   (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。

代码   说明
400   (错误请求) 服务器不理解请求的语法。
401   (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403   (禁止) 服务器拒绝请求。
404   (未找到) 服务器找不到请求的网页。
405   (方法禁用) 禁用请求中指定的方法。
406   (不接受) 无法使用请求的内容特性响应请求的网页。
407   (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408   (请求超时)  服务器等候请求时发生超时。
409   (冲突)  服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410   (已删除)  如果请求的资源已永久删除,服务器就会返回此响应。
411   (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412   (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413   (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414   (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415   (不支持的媒体类型) 请求的格式不受请求页面的支持。
416   (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417   (未满足期望值) 服务器未满足”期望”请求标头字段的要求。

5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。

代码   说明
500   (服务器内部错误)  服务器遇到错误,无法完成请求。
501   (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502   (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503   (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504   (网关超时)  服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505   (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
状态码详述 

原因短语。是响应起始行中最后一个组件。为状态码提供了文本形式的解释。例:200 OK中,OK就是原因短语。

版本号。为HTTP应用程序提供了一种将自己所遵循的协议版本告知对方的方式。版本号 说明了应用程序支持的最高版本。版本好不会被当作小数来处理。版本的每个数字都回被当成一个单独的数字来处理。因此,每个数字都必须单独进行比较,以便确 定哪个版本更高。比如,HTTP/2.22就比HTTP/2.3的版本更高,因为22比3大。

 3. 首部

首部字段向请求和响应报文中添加一些附加信息。从本质上来说,它们只是一些名/值对的列表。

首部分类

请求首部:提供更多有关请求的信息

响应首部:提供更多有关响应的信息

通用首部:既可以出现在请求报文中,也可以出现在响应报文中

实体首部:描述主体的长度和内容,或者资源自身

扩展首部:规范中没有定义的新首部

常见首部实例

Content-type:指定数据格式。1.0规定,头部信息必须是ASCII码,后面的数据可以是任何格式。常见的Content-type字段值:text/plain, text/html, text/css, image/jpeg, image/png, image/svg+xml, audio/mp4, video/mp4, application/javascript, application/pdf, application/zip, aplication/atom+xml。这些数据类型总称为MIME type,每个值包含一级类型和二级类型,之间用斜杠分割。除了预定义的类型,厂商也可自定义类型。MIME type还可以在尾部使用分号,添加参数,如:

Content-type: text/html; charset=utf-8

上述类型表明,发送的是网页,而且编码是UTF-8。

Accept:客户端申明可以接受的数据格式。如:Accept: */*可以接受任何数据格式。

Content-Encoding:指定数据的压缩方法,如:gzip,compress,deflate。

Accept-Encoding:客户端申明可以接受的压缩方法。

Connection:默认keep-alive(1.1之后),客户端可发送Connection: close明确要求服务器关闭TCP链接。目前,对于同一域名,大多数浏览器允许同时建立6个持久连接。

Content-length:声明本次响应的数据长度。

Transfer-Encoding:声明回应将有数量未定的数据块组成。Transfer-Encoding: chunked

Host:指定服务器的域名。 

4. 实体的主体部分

HTTP报文的负荷。就是HTTP要传输的内容。

HTTP报文可以承载很多类型的数字数据:图片、视频、HTML文档、软件应用程序等。

 

参考:

1. 图解http

2. runoob.com HTTP简介

3. HTTP协议之报文详解

4. HTTP 协议详解 (增删减及标注) simba

5. HTTP 方法:GET 对比 POST

6. HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比

7. HTTP/2.0 相比1.0有哪些重大改进?

8. HTTP协议入门1.0,1.1,2 阮一峰

9. 看完让你彻底搞懂Websocket原理

10. Cronet网络库系列(三):HTTPS/HTTP2/HTTP3/QUIC/WebSocket详解

posted @ 2017-08-27 13:46  yuxi_o  阅读(617)  评论(0编辑  收藏  举报