持久连接
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:
内容协商的技术有:
- 服务器驱动协商(以请求的首部字段作参考,服务器端自动处理)
- 客户端驱动协商 (用户从浏览器显示的可选列表中手动选择)
- 透明协商 (以上两种方法的结合)