首页 > 技术文章 > 图解http笔记-2

linkcode 2017-12-21 09:00 原文

持久连接

http的初始版本中,没进行一次http通信就要断开连接。
以前传输的内容都是很小的,但是现在,当一个浏览器请求一个有很图片的html网页时,要请求html文档,也要请求图片等资源,就要进行很多次TCP的断开和连接,增加通信的开销。
所以就有了HTTP keep-alive的方法:
只要一端没有明确提出断开连接,就保持TCP的连接。

'Connection': 'keep-alive'

http报文内的http信息:

对于http报文来说,分为:

  • 请求报文 (请求端/客户端)
  • 响应报文 (响应端/服务端)

报文的结构:

结构

首部内容有以下部分组成:

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

传输中的编码

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

HTTP报文的主体用于传输请求或者响应的实体主体。
通常,他们是一样的,但是当传输过程中进行编码操作时,导致实体主体的内容发生变化,就会和报文主体产生差异。

压缩传输内容的编码

比如发送邮件附件时,可以使用编码使邮件的容量变小。
常用的内容编码有:

  • gzip (GNU zip)
  • compress (UNIX系统的标准压缩)
  • deflate (zlib)
  • identity (不进行编码)

这些信息会写在HTTP报文的首部里,例如这里是我截取下来的请求某个网站时的头部:

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'
'Accept-Encoding': 'gzip, deflate, br'
'Accept-Language': 'zh-CN,zh;q=0.9'

该内容的解码是由客户端负责压缩

分块传输编码

请求的编码的实体还未传输完之前,浏览器无法显示请求的页面。对于较大的数据,通过把数据分割为很多块,能让浏览器逐步显示页面。
分块传输编码会将实体分成很多部分,每个部分都会用16进制来标记数据的大小,最后一块会使用"0(CR+LF)"来标记

多部分对象集合

当我们发送邮件时,可能会包含图片,文件,视频等,采用MIME(多用途因特网扩展)机制。而在MIME中 采用了多部分对象集合的方法
当在HTTP报文中使用多部分对象集合时,回来首部字段中添加content-type,例:

'Content-Type': 'application/x-www-form-urlencoded'

获取部分内容的范围请求

范围请求:指定范围发送的请求
用于传输一个很大的文件的断开后继续传输。例如10000字节的资源,可以只请求5001~10000字节内的资源
如果服务器无法响应范围请求,则返回状态码200 OK和完整的实体内容

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

包含在请求报文中的某些首部字段就是判断的基准:

Accpet:
Accept-Charset:
Accept-Encoding:
Accept-Language:
Content-Language:

内容协商的技术有:

  • 服务器驱动协商(以请求的首部字段作参考,服务器端自动处理)
  • 客户端驱动协商 (用户从浏览器显示的可选列表中手动选择)
  • 透明协商 (以上两种方法的结合)

推荐阅读