Http02 - 报文中的HTTP信息

了解请求和响应是怎样运作的

  • HTTP报文
  • HTTP请求报文和响应报文的结构
  • 使用编码提升传输速率
  • 发送多种数据的多部分对象数据集合
  • 获取部分内容的请求范围
  • 内容协商返回最合适的内容

Http报文

用于Http协议交互的信息叫做Http的报文<是一种由多行数据构成的字符串文本>

  • 客户端发出的请求信息叫做请求报文
  • 服务单发出的响应信息叫做响应报文

Http报文的基本结构

  • 报文首部
  • 报文主体

注意:

  • 报文首部和报文主体由(CR(Carriage Return, 回车符:16进制 0x0d) + LF(Line Feed, 换行符:16进制 0x0a))划分开,
  • 报文主体可以没有。不是必须的

HTTP请求报文和响应报文的结构

  • 请求行:包含用于请求的方法,请求URI和HTTP版本
  • 状态行:包含表面响应结果的状态码,原因短句和HTTP版本
  • 首部字段:包含请求和响应的各种条件和属性的各类首部,有以下四种首部

    • 通用首部字段
    • 请求首部字段
    • 响应首部字段
    • 实体首部字段
  • 其他:可能包含HTTP的RFC里未定义的首部(比如: Cookie)

使用编码提升传输速率

  • 使用原数据进行传输,传输速率慢,但是不需要对数据进行处理。
  • 进行编码提升传输速率,但是对原数据进行编码操作耗损cpu资源
  • 常用的有两种编码方式,应用于不同的场景当中
    • 内容的编码方式
    • 分块的编码方式

报文主体和实体主体的差异

==报文主体,实体主体的区别==

  • 报文:相当于一个载体,
  • 实体:要传输的图片或者其他的资源

压缩传输的内容编码

HTTP协议当中有一种被称之为内容编码的功能,就是对实体进行打包压缩,内容编码指明应用在实体的内容之上的编码格式,并且保持实体信息原样压缩,内容编码后的实体由客户端进行解码。

HTTP协议常用的内容编码有以下几种
  • gzip(GUN zip)
  • compress(UNIX系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

分割发送的分块传输的编码

HTTP协议在传输大容量数据的时候,通过把数据进行分割成多块,能够在浏览器上面逐步显示,如果不能分割成为多块的话,浏览器就无法显示请求的页面

分块传输编码会把实体主体分成多个部分,每一块使用十六进制来标记快的大小,最后一块一般使用“0(CR+LF)”来进行标记。最终都会由接受到响应的客户端负责解码,恢复到编码前的实体主体


发送多种数据的多部分对象集合

我们在发送邮件的时候,我们可以在一份邮件里面,添加视频,图片,音乐,还有文本,为什么可以呢,因为邮件采用了MIME(多用途英特网邮件扩展)机制。

我们的HTTP也同样的有着一部分的功能,,可以发送一份报文内包含多个类型的实体,

  • multipart/from-data:在Web表单上传文件时使用
  • multipart/byteranges:状态码为206,响应报文包含了多个范围内容时使用,我们可以看下面的一则报文
1
2
3
4
5
6
7
8
9
10
11
12
13
Data: Fri, 13 Jur 2016 01:45:26 GMT
Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT
Content-Type :multipart/byteranges: boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range:bytes 500-999/8000

--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range:bytes 7000-7999/8000

--THIS_STRING_SEPARATES--

获取部分内容的范围请求

要实现一种可以恢复上次下载中断机制,我们就需要指定下载的实体范围,这种,指定范围发送的请求就叫做范围请求(Range Request)

对一份10 000字节大小的资源,如果使用范围请求,可以只请求一部分资源

  • 注意:执行范围请求的时候会使用到首部字段 Range来指定资源的byte范围,
  • Range:bytes=50001-10000
  • Range:bytes=50001-
  • Range:bytes=-50001, 5000-7000

如果是范围请求,则响应会返回状态码206的响应报文。另外,对于多重范围请求,响应会在首部字段Content-Type表明 multipart/byteranges后返回响应报文


内容协商返回最合适的内容

我们的电脑浏览器,在国外的时候看到英文的Google页面,在国内则看到中文的Google页面,这就是说明一套网站它两个版本么?答案则是不然,因为在HTTP协议内部有内容协商,通过内容协商则会返回最最适合的内容

  • 服务器驱动协商
  • 客户端驱动协商
  • 透明协商