HTTP 报文

174 阅读4分钟

用于HTTP协议交互的信息叫HTTP报文。

HTTP报文本身是由多行数据构成的字符串文本。

HTTP报文大致分为报文首部和报文主体,通常,并不一定有主体。

报文首部:服务端或客户端响应或请求的内容及属性。

报文主体:被发送的数据。

请求报文分为:请求行、请求首部字段、通用首部字段、实体首部字段、其他

响应报文分为:状态行、响应首部字段、通用首部字段、实体首部字段、其他

  • 请求行:包含用户请求的方法,请求URI和HTTP版本
  • 状态行:包含表明响应结果的状态码,原因短语和HTTP版本
  • 首部字段:请求和响应的各种条件和属性的各类首部 首部一般分为请求首部、响应首部、通用首部、实体首部
  • 其他:可能包含HTTP未定义的首部,Cookie等

HTTP传输过程中可以按照数据原貌直接传输,也可以通过编码提升传输速率。编码在计算机完成,会消耗更多CPU。

报文主体由8位组字节组成,通过HTTP通信传输

实体主体作为请求或响应的有效载荷数据被传输,内容由实体首部和实体主体组成。

HTTP报文的主体用户传输实体主体,通常报文主体等于实体主体。只有在传输中进行编码操作时,实体主体内容发生变化,才导致它和报文主体有差异。

HTTP有一种称为内容编码的功能,达到和压缩一样的作用。内容编码是应用在实体编码内容上的编码格式,保持实体信息原样压缩。内容编码后的实体由客户端解码。常用的内容编码格式有gzip、compress、deflate、identity。

HTTP请求编码实体尚未全部传输完之前,页面无法显示。在传输大数据的时候,通常吧数据分割成多块,能够让页面逐步显示,这个功能叫分块传输编码。

分块传输每块都会用16进制标记块的大小,最后一块会使用【0】来标记。

发送邮件我们可以添加文字和附件是因为采用了MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。图片等二进制数据以ASCII码字符串编码的方式指明,就是利用MIME来描述标记数据类型。在MIME扩展中会使用一种称为多部分对象集合的方法,容纳多分不同类型的数据。

HTTP协议中也采纳来多部分对象集合,发送的一份报文主体内可含有多个类型实体。

多部分对象集合包含的对象:

  • multipart/form-data:web表单文件上传时
  • multipart/byteranges:响应报文包含多个范围的内容时使用

使用多部分对象集合时,需要在首部字段加上Content-type。

HTTP支持范围请求(Range Request),比如说下载一个文件,可以从上次未下载完成的地方开始继续下载。

执行范围请求时,会用到首部字段Range来指定byte范围。如

  • Range:bytes=5001-10000 5000到10000字节
  • Range:bytes=5001- 5000到最后
  • Range:bytes=0-3000,5000-7000 开始到3000,5000到7000

针对范围请求,响应会返回状态码206。对于多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。如果服务器不支持范围请求,会返回200和全部的实体内容。

一个网页可能会有多种语言的相同界面,界面都一样,只有语言不一样,当浏览器默认语言为中文时,访问相同的URI的web页面时,则会显示中文的网页,这样的机制称为内容协商(Content Negotiation),主要涉及到的时资源文件等。

内容协商机制指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端适合的资源,内容协商会以语言、字符集、编码方式等为基准判断响应的资源。

某些首部字段就是判断的基准:

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Content-Language

内容协商技术分为一下三种:

  • 服务器驱动协商:由服务器进行内容协商。以请求首部字段为参考,在服务器端自动处理。
  • 客户端驱动协商:有客户端进行内容协商,用户从浏览器显示的课选项列表中手动选择。还可以利用JavaScript脚本自动进行选择,例如按OS类型自动切换PC和手机版本的页面。
  • 透明协商:是服务器和客户端共同协商的一种。