如何理解HTTP的无链接、短链接、长链接?

0. 前言

HTTP有个特色叫“无链接”,然而为了达到可靠的传输数据,HTTP确定是依靠可靠链接的,那什么叫“无链接”呢?html

1. 无链接?有链接?

无链接:限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。web

可见,HTTP不是字面意义上的没有链接,事实上,这个定义也符合HTTP短链接的定义,但无链接强调的是HTTP的特性,短链接可理解为一种实现浏览器

无链接的含义也能够结合HTTP无状态的含义在应用层面上去理解:每个请求都拥有本身的请求体,指望接收到惟一的对应的响应体,而每一次的请求都相互独立,与上一次或下一次的请求毫无关系,哪怕是在同一条链接中(后面说的长链接)。也正由于这个特性,咱们在考虑业务代码实现的时候,无需考虑请求之间的关系,只需考虑业务是如何在当前请求完成的。服务器

而HTTP真正的链接,根据计算机网络体系的协议栈可知,是经过运输层的TCP协议实现的,下层向上层提供了可靠的链接,上层屏蔽了下层的具体实现,全部的操做均在可靠的链接基础之上。HTTP使用TCP的目的是为了保证数据传输的可靠性和完整性。websocket

简单来讲就是:网络

  • TCP的面向链接是基于网络底层的数据传输。
  • HTTP的无链接是基于应用层面的沟通交互。

2. 从短链接到长链接

  • HTTP/0.9:最先发布的1991年0.9版,该时期的HTTP协议十分简单,只支持Get请求,采用短链接的方式,也就是说,客户端和服务器每进行一次HTTP操做,就创建一次链接,任务结束就中断链接。当客户端浏览器访问的某个HTML或其余类型的Web页中包含有其余的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会从新创建一个HTTP会话。
  • HTTP/1.0:1996年发布,默认使用短链接,提出长链接(也叫持久链接)的概念,但当时仅提供初步的支持。
  • HTTP/1.1:1999年发布,默认使用长链接,用以保持链接特性。使用长链接的HTTP协议,会在响应头加入这行代码:
    Connection:keep-alive

在使用长链接的状况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP链接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经创建的链接。Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间。实现长链接须要客户端和服务端都支持长链接。socket

HTTP协议的长链接和短链接,实质上是TCP协议的长链接和短链接。spa

TCP短链接长链接都由客户端发起,而TCP长链接的保活功能主要为服务器应用提供。若是客户端已经消失而链接未断开,则会使得服务器上保留一个半开放的链接,而服务器又在等待来自客户端的数据,此时服务器将永远等待客户端的数据。保活功能就是试图在服务端器端检测到这种半开放的链接。也由于短链接、长链接的实如今HTTP以外,与HTTP无关,从HTTP自身来看,HTTP依然是无链接的。计算机网络

3. HTTP的长链接和WebSocket的长链接

  • HTTP的长链接:HTTP/1.1经过使用Connection:keep-alive进行长链接。在一次 TCP 链接中能够完成多个 HTTP 请求,可是对每一个请求仍然要单独发 header,Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间。这种长链接是一种“伪连接”,并且只能由客户端发送请求,服务端响应。
  • WebSocket的长链接,是一个全双工的链接,可由服务端主动发起信息。长链接第一次TCP链路创建以后,后续数据能够双方都进行发送,不须要发送请求头。

HTTP/1.1中双方并无创建正真的链接会话,服务端能够在任何一次请求完成后关闭。WebSocket 它自己就规定了是正真的、双工的长链接,两边都必需要维持住链接的状态。code

4. 从HTTP/1.1到HTTP/2

HTTP/1.1:pipelining
HTTP/1.1时期,持久链接(长链接)的弊端被提出 —— HOLB(Head of Line Blocking)即持久链接下一个链接中的请求仍然是串行的,若是某个请求出现网络阻塞等问题,会致使同一条链接上的后续请求被阻塞。

所以,HTTP/1.1中提出了pipelining概念,即客户端能够在一个请求发送完成后不等待响应便直接发起第二个请求,服务端在返回响应时会按请求到达的顺序依次返回,这样就极大地下降了延迟。然而pipelining并无解决HOLB的问题,由于响应依然是串行返回的,pipelining也所以没有被普遍接受。

SPDY和HTTP/2:multiplexing
multiplexing即多路复用,链接共享,在SPDY中提出,同时也在HTTP/2中实现。multiplexing技术可以让多个请求和响应的传输彻底混杂在一块儿进行,经过streamId来互相区别。这完全解决了HOLB问题,同时还容许给每一个请求设置优先级,服务端会先响应优先级高的请求。

pipelining和multiplexing的对比,如图:
pipelining和multiplexing

SPDY是由Google推出的协议,HTTP工做组采用了SPDY v2草案做为制定HTTP 2.0标准的起点。HTTP/2标准于2015年5月以RFC 7540正式发表。至此,SPDY完成了历史的使命,退出历史的舞台。

5. 结语

该文参考了如下文章:


Copyright © 2018, CSCW back-end Kanarien, All Rights Reserved
相关文章
相关标签/搜索