HTTP长连接、短连接的区别

HTTP
  1. 早在 HTTP 建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的HTML页面将要放在我们的 web 服务器上,用户端通过浏览器访问url地址来获取网页的显示内容。
  2. 但是到了 WEB2.0 以来,我们的页面变得复杂,不仅仅单纯的是一些简单的文字和图片,同时我们的 HTML 页面有了 CSS,Javascript,来丰富我们的页面展示,当 ajax 的出现,我们又多了一种向服务器端获取数据的方法,这些其实都是基于 HTTP 协议的。
  3. 同样到了移动互联网时代,我们页面可以跑在手机端浏览器里面,但是和 PC 相比,手机端的网络情况更加复杂,这使得我们开始了不得不对 HTTP 进行深入理解并不断优化过程中。

影响一个 HTTP 网络请求的因素主要有两个:带宽和延迟

带宽:

  • 如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了。

延迟:

  • 浏览器阻塞(HOL blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有 4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。
  • DNS 查询(DNS Lookup):浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的。
  • 建立连接(Initial connection):HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。

HTTP在不断的优化,从HTTP1.0到HTTP1.1,主要有以下区别:

  1. 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  2. 带宽优化及网络连接的使用:HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者*的选择以便于充分利用带宽和连接。
  3. 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
  4. Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
  5. 长连接:HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

网络通信到达传输层,使用TCP协议时,在真正的读写操作之前,客户端与服务器端之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时可以释放这个连接。连接的建立依靠“三次握手”,而释放则需要“四次握手”,所以每个连接的建立都是需要资源消耗和时间消耗的。

三次握手示意图:
HTTP长连接、短连接的区别
四次挥手示意图:
HTTP长连接、短连接的区别


短连接:
  1. HTTP/1.0中默认使用短连接。
  2. 也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
  3. 当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

短连接的操作步骤:
建立连接 —— 数据传输 —— 关闭连接…建立连接 —— 数据传输 —— 关闭连接

模拟TCP短连接:

  1. Client向Server发起连接请求,Server接到请求,然后双方建立连接。
  2. Client向Server发送消息,Server回应Client,然后一次请求就完成了。
  3. 这时候双方任意都可以发起close操作,不过一般都是Client先发起close操作。

上述可知,短连接一般只会在 C/S 间传递一次请求操作。

短连接的特点

  1. 对于服务器来说管理较为简单。
  2. 存在的连接都是有用的连接。
  3. 不需要额外的控制手段。
  4. 但如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。

长连接:
  1. 从HTTP/1.1起,默认使用长连接,用以保持连接特性。
  2. 使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive
  3. 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
  4. Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

长连接的操作步骤:
建立连接 —— 数据传输…(保持连接)…数据传输 —— 关闭连接

模拟长连接的情况:

  1. Client向Server发起连接,Server接受client连接,双方建立连接.
  2. Client与Server完成一次请求后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。
  3. 如果一个给定的连接在两小时内没有任何动作(没有收到任何请求),服务器就向客户发送一个探测报文段,根据客户端主机响应探测4个客户端状态:
    (1)客户主机依然正常运行,且服务器可达。此时客户的TCP响应正常,服务器将保活定时器复位。
    (2)客户主机已经崩溃,并且关闭或者正在重新启动。上述情况下客户端都不能响应TCP。服务端将无法收到客户端对探测的响应。服务器总共发送10个这样的探测,每个间隔75秒。若服务器没有收到任何一个响应,它就认为客户端已经关闭并终止连接。
    (3)客户端崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
    (4)客户机正常运行,但是服务器不可达。这种情况与第二种状态类似。

TCP的保活功能主要为服务器应用提供。
如果客户端已经消失而连接未断开,则会使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,此时服务器将永远等待客户端的数据。保活功能就是试图在服务端器端检测到这种半开放的连接。

长连接的特点:

  1. 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。
  2. 对于频繁请求资源的客户来说,较适用长连接。
  3. 在长连接的应用场景下,Client端一般不会主动关闭它们之间的连接,Client与Server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致Server端服务受损。

短连接、长连接的应用场景

长连接和短连接的区别主要来自于 Client 和 Server 采取的关闭策略。不同的应用场景适合采用不同的策略。

长连接:

  1. 由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户端适合使用长连接。在长连接的应用场景下,Client端一般不会主动关闭连接,当 Client 与 Server 之间的连接一直不关闭,随着客户端连接越来越多,Server 会保持过多连接。这时候 Server 端需要采取一些策略,如关闭一些长时间没有请求发生的连接,这样可以避免一些恶意连接导致 Server 端服务受损;如果条件允许则可以限制每个客户端的最大长连接数,这样可以完全避免恶意的客户端拖垮整体后端服务。
  2. 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。 每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,再次处理时直接发送数据包就可以了,不用再次建立TCP连接。
    例如: 数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

短连接:

  1. 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费较多时间和带宽。
  2. 像WEB网站的HTTP服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,并发量会非常之大。
    例如: 在并发量大,但每个用户无需频繁操作情况选用短连接。