HTTP知识笔记
总字数1.1K
阅读时长 ≈4 分钟
HTTP知识笔记
HTTP版本版本变迁:
HTTP/0.9,1991年,只能使用GET,请求不涉及数据包传输, 没有作为正式的标准;HTTP/1.0,1996年,传输内容格式不限制,增加PUT、PATCH、HEAD、OPTIONS、DELETE命令,正式作为标准;HTTP/1.11997年,持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码,2015年前使用最广泛;HTTP/2,2015年,多路复用、服务器推送、头信息压缩、二进制协议等,逐渐覆盖市场。
HTTP位于计算机网络模型的应用层,是基于TCP的一个应用层协议。
虽然TCP是面向连接的,但是HTTP却是无连接的。
在Akamai公司的演示页面上可以看到HTTP1.1和HTTP2的图片加载速度区别。
HTTP/1.0 🔗
- 使用
If-Modified-Since,Expires头部来控制缓存; - 不支持部分传输,某些时候我们只需传输文件整个的一段而已,传整个过来浪费了带宽,也容易造成长时间的占用一个连接;
- 每次传输数据都需要简历新的一个连接,当数据传输完成,连接就会关闭,无法复用已经传输完成的连接;
- 一个服务器绑定唯一一个
IP地址; - 队头阻塞,即下一个请求必须在上一个请求完成才能进行传输,否则处于挂起状态。
HTTP/1.1 🔗
- 使用更多的头部来增强缓存控制策略,
Entity tag,If-Unmodified-Since,If-Match,If-None-Match; - 支持部分返回,新增
206(Partial Content)返回码来表示这是一个部分请求,通过Range头部来指定文件的范围; - 由于虚拟主机的发展,现在一台服务器可以存在多个虚拟主机,它们共享一个
IP地址,所以请求和响应头域必须附带Host头域(指定主机名),不然直接返回400错误; - 支持长连接,现在可以复用同一条
TCP连接,无需重新建立TCP连接来进行HTTP请求,在头部增加Connection: keep-alive默认开启该特性; - 支持请求流水线,由于支持长连接,现在可以复用同一条
TCP连接,流水线,通俗点讲,就是可以在等待上一个资源还未返回结果的时候,进行新的资源请求,不过,资源的接收必须按照发送的顺利; - 细化错误的响应码,如
409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
HTTP/2 🔗
相关RFC为RFC7540。
- 二进制分帧,
HTTP/2通过在应用层和传输层之间增加一个二进制分帧层,使用二进制而非HTTP/1.1的文本格式来传输数据,将请求报文或者响应报文分割成帧来传送;
- 流标识,存在于连接中的一个虚拟通道,流可以承载双向消息,每个流都有一个唯一的整数
ID,这样可以和其他流区分开; - 多路复用,
HTTP/1.1虽然可以复用TCP连接,但是必须顺序的响应请求结果,如果想要并发多个请求,则必须使用多个TCP连接,浏览器对一个域名的TCP连接数有限制,一般为6 - 8个,超出限制的连接就会被挂起等待,等待前面的连接完成后才能进行发送,HTTP/2由于使用了二进制分帧和流标识,使得全部的数据都可以在一条TCP连接上完成,减少了创建多条TCP连接带来的延时以及减少内存消耗;
- 服务器推送,在发送
HTML页面时,服务器可以主动的HTML附带的CSS和JS一并推送给用户,减少请求次数;
- 头部压缩,随着网络的发展,
HTTP的请求大小越来越大,每次需要发送的冗余请求头非常多,HTTP/2通过在客服端和服务端各自维护一个“首部表”(类似一个Map)来减少重复数据的传送,具体算法为HPACK,具体可以查看相关的RFC文档:HPACK: Header Compression for HTTP/2,这里涉及到哈夫曼编码,通过编码来减少请求头部过大带来的网络消耗。
很多大型应用已经开始转到HTTP/2了,比如:
哦呐该,如果没有评论的话,瓦达西...



