如何理解HTTP的无连接、短连接、长连接?
0. 前言
HTTP有个特点叫“无连接”,然而为了达到可靠的传输数据,HTTP肯定是依靠可靠连接的,那什么叫“无连接”呢?
1. 无连接?有连接?
无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
可见,HTTP不是字面意义上的没有连接,事实上,这个定义也符合HTTP短连接的定义,但无连接强调的是HTTP的特性,短连接可理解为一种实现。
无连接的含义也可以结合HTTP无状态的含义在应用层面上去理解:每一个请求都拥有自己的请求体,期望接收到唯一的对应的响应体,而每一次的请求都相互独立,与上一次或下一次的请求毫无关系,哪怕是在同一条连接中(后面说的长连接)。也正因为这个特性,我们在考虑业务代码实现的时候,无需考虑请求之间的关系,只需考虑业务是如何在当前请求完成的。
而HTTP真正的连接,根据计算机网络体系的协议栈可知,是通过运输层的TCP协议实现的,下层向上层提供了可靠的连接,上层屏蔽了下层的具体实现,所有的操作均在可靠的连接基础之上。HTTP使用TCP的目的是为了保证数据传输的可靠性和完整性。
简单来说就是:
- 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)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
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 它本身就规定了是正真的、双工的长连接,两边都必须要维持住连接的状态。
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的对比,如图:
SPDY是由Google推出的协议,HTTP工作组采用了SPDY v2草案作为制定HTTP 2.0标准的起点。HTTP/2标准于2015年5月以RFC 7540正式发表。至此,SPDY完成了历史的使命,退出历史的舞台。
5. 结语
该文参考了以下文章:
- HTTP长连接、短连接究竟是什么? - dai.sp - 博客园
- http中长连接和websocket的长连接的区别 - 艾亚495 - 博客园
- 怎么理解TCP是面向连接的,HTTP基于TCP却是无连接的? - 知乎
Copyright © 2018, CSCW back-end Kanarien, All Rights Reserved