【词汇详解】Http协议详解(一)发展历程

来源:互联网 发布:ubuntu root中文 编辑:程序博客网 时间:2024/05/30 19:32

web开发中,,对于http协议的使用可以说是无处不在,,http协议本身也包含了大量的内容。

有个问题很绕人:
http协议是应用层的协议,传输层使用的是TCP协议,TCP协议是有连接协议,那么Http协议也是有连接协议??

【个人理解】:网络分层的目的就是为了使各个层之间没有直接关系(这里指的是:服务与使用服务的关系,内部具体实现没有关系。)
再回头看看传输层的TCP是有连接协议,目的是为应用层的Http协议提供可靠的传输,Http协议只需要使用可靠传输就可以了,,具体有无链接与TCP协议无关。



一,http连接方式进化史

HTTP/0.9时代:【短链接】
每个HTTP请求都要经历一次DNS解析、三次握手、传输和四次挥手。反复创建和断开TCP连接的开销巨大,在现在看来,这种传输方式简直很糟糕。


HTTP/1.0时代:【持久连接】

人们认识到短连接的弊端,提出了持久连接的概念,在HTTP/1.0中得到了初步的支持。持久连接,即一个TCP连接服务多次请求:客户端在请求header中携带Connection:Keep-Alive,即是在向服务端请求持久连接。如果服务端接受持久连接,则会在响应header中同样携带Connection:Keep-Alive,这样客户端便会继续使用同一个TCP连接发送接下来的若干请求。(Keep-Alive的默认参数是[timout=5,max=100],即一个TCP连接可以服务至多5秒内的100次请求)当服务端主动切断一个持久连接时(或服务端不支持持久连接),则会在header中携带Connection:Close,要求客户端停止使用这一连接。
这里写图片描述

相对于HTTP 0.9 增加了如下主要特性:

  • 请求与响应支持头域
  • 响应对象以一个响应状态行开始
  • 响应对象不只限于超文本
  • 开始支持客户端通过POST方法向Web服务器提交数据,支持GET、HEAD、POST方法
  • 支持长连接(但默认还是使用短连接),缓存机制,以及身份认证



HTTP/1.1时代:【持久连接成为默认的连接方式;提出pipelining概念】

HTTP/1.1开始,即使请求header中没有携带Connection:
Keep-Alive,传输也会默认以持久连接的方式进行。目前所有的浏览器都默认请求持久连接,几乎所有的HTTP服务端也都默认开启对持久连接的支持,短连接正式成为过去式。(HTTP/1.1的发布时间是1997年,最后一次对协议的补充是在1999年,我们可以夸张地说:HTTP短连接这个概念已经过时了近20年了。

同时,持久连接的弊端被提出 —— HOLB(Head of Line Blocking)即持久连接下一个连接中的请求仍然是串行的,如果某个请求出现网络阻塞等问题,会导致同一条连接上的后续请求被阻塞。所以HTTP/1.1中提出了pipelining概念,即客户端可以在一个请求发送完成后不等待响应便直接发起第二个请求,服务端在返回响应时会按请求到达的顺序依次返回,这样就极大地降低了延迟。

然而pipelining并没有彻底解决HOLB,为了让同一个连接中的多个响应能够和多个请求匹配上,响应仍然是按请求的顺序串行返回的。所以pipelining并没有被广泛接受,几乎所有代理服务都不支持pipelining,部分浏览器不支持pipelining,支持的大部分也会将其默认关闭。
这里写图片描述



HTTP 1.1还新增了如下特性:

  • 请求消息和响应消息都应支持Host头域
    在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed
    Web Servers),并且它们共享一个IP地址。因此,Host头的引入就很有必要了。
  • 新增了一批Request method
    HTTP1.1增加了OPTIONS,PUT, DELETE, TRACE, CONNECT方法
  • 缓存处理
    HTTP/1.1在1.0的基础上加入了一些cache的新特性,引入了实体标签,一般被称为e-tags,新增更为强大的Cache-Control头。



SPDY和HTTP/2.0:【Multiplexing】

multiplexing即多路复用,在SPDY中提出,同时也在HTTP/2中实现。multiplexing技术能够让多个请求和响应的传输完全混杂在一起进行,通过streamId来互相区别。这彻底解决了holb问题,同时还允许给每个请求设置优先级,服务端会先响应优先级高的请求。
这里写图片描述

现在Chrome、FireFox、Opera、IE、Safari的最新版本都支持SPDY,Nginx/Apache HTTPD/Jetty/Tomcat等服务端也都提供了对SPDY的支持。另外,谷歌已经关闭SPDY项目,正式为HTTP/2让路。可以认为SPDY是HTTP/2的前身和探路者。



二,http2.0

HTTP 2.0是下一代HTTP协议,目前应用还非常少。主要特点有:

多路复用(二进制分帧)

HTTP 2.0最大的特点: 不会改动HTTP 的语义,HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫2.0,是在于新增的二进制分帧层。在二进制分帧层上, HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。
这里写图片描述

HTTP 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。

头部压缩

当一个客户端向相同服务器请求许多资源时,像来自同一个网页的图像,将会有大量的请求看上去几乎同样的,这就需要压缩技术对付这种几乎相同的信息。

随时复位

HTTP1.1一个缺点是当HTTP信息有一定长度大小数据传输时,你不能方便地随时停止它,中断TCP连接的代价是昂贵的。使用HTTP2的RST_STREAM将能方便停止一个信息传输,启动新的信息,在不中断连接的情况下提高带宽

利用效率

服务器端推流: Server Push
客户端请求一个资源X,服务器端判断也许客户端还需要资源Z,在无需事先询问客户端情况下将资源Z推送到客户端,客户端接受到后,可以缓存起来以备后用。

优先权和依赖

每个流都有自己的优先级别,会表明哪个流是最重要的,客户端会指定哪个流是最重要的,有一些依赖参数,这样一个流可以依赖另外一个流。优先级别可以在运行时动态改变,当用户滚动页面时,可以告诉浏览器哪个图像是最重要的,你也可以在一组流中进行优先筛选,能够突然抓住重点流。



参考链接:
作者:二大王 来源:知乎链接
HTTP协议的前世今生——各版本HTTP协议对比博客园链接

原创粉丝点击