乐趣区

长连接短连接长轮询短轮询WebSocket释疑

看到一篇不错的文章,特意转载过来,原文地址:长连接、短连接、长轮询、短轮询、WebSocket

一、短连接和长连接

短连接:每次 Http 请求都会建立 Tcp 连接,管理容易

长连接:只需要建立一次 Tcp 连接,以后 Http 请求重复使用同一个 Tcp 连接,管理难

HTTP1.1 规定了默认保持长连接(HTTP persistent connection,也有翻译为持久连接),数据传输完成了保持 TCP 连接不断开(不发 RST 包、不四次挥手),等待在同域名下继续用这个通道传输数据;相反的就是短连接
如果服务器没有告诉客户端超时时间也没关系,服务端可能主动发起四次挥手断开 TCP 连接,客户端能够知道该 TCP 连接已经无效;另外 TCP 还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。

在长连接的应用场景下,client 端一般不会主动关闭它们之间的连接,Client 与 server 之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server 早晚有扛不住的时候,这时候 server 端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致 server 端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

长连接和短连接的产生在于 client 和 server 采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择

应用场景区别:

一般长连接(追求实时性高的场景)用于少数 client-end to server-end 的频繁的通信,例如:数据库的连接用长连接,如果用短连接频繁的通信会造成 socket 错误,而且频繁的 socket 创建也是对资源的浪费。
而像 WEB 网站的 http 服务一般都用短链接(追求资源易回收场景),因为长连接对于服务端来说会耗费一定的资源,而像 WEB 网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源。

二、短轮询和长轮询

和短连接和长连接有本质区别。长、短连接是客户端与服务端建立和保持 TCP 连接的机制;而长、短轮询是指客户端请求服务端,服务端给予应答的方式

短轮询:重复发送 Http 请求,查询目标事件是否完成,优点:编写简单,缺点:浪费带宽和服务器资源

长轮询:在服务端 hold 住 Http 请求(死循环或者 sleep 等等方式),等到目标时间发生(保持这个请求等待数据到来或者恰当的超时),返回 Http 响应。优点:在无消息的情况下不会频繁的请求,缺点:编写复杂

三、WebSocket

WebSocket 和 HTTP 长连接区别

  • HTTP1.1 通过使用 Connection:keep-alive 进行长连接,HTTP 1.1 默认进行持久连接。在一次 TCP 连接中可以完成多个 HTTP 请求,但是对每个请求仍然要单独发 header,Keep-Alive 不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如 Apache)中设定这个时间。
  • websocket 的长连接,是一个 真的全双工 ,第一次 tcp 链路建立之后,后续数据可以双方都进行发送,不需要发送请求头,并且这个连接会持续存在直到客户端或者服务器端的某一方主动关闭连接, 与 HTTP 长连接不同,WebSocket 可以更灵活的控制连接关闭的时机,而不是 HTTP 协议的 Keep-Alive 一到,服务端立马就关闭(这样很不人性化)

WebSocket 连接建立

建立 WebSocket 连接时,需要通过客户端或者浏览器发出握手请求,请求消息示例如图:

服务端返回给客户端的应答消息如图:

为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,其中附加头信息“Upgrade: WebSocket”表明这是一个申请协议升级的 HTTP 请求。服务器端解析这些附加的头信息,然后生成应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方可以通过这个连接通道自由地传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动关闭连接。

请求消息中的“Sec-WebSocket-Key”是随机的,服务器端会用这些数据来构造出一个 SHA- 1 的信息摘要,把“Sec-WebSocket-Key”加上一个魔幻字符串“258EAFA5-E914- 47DA-95CA-C5AB0DC85B11”。使用 SHA- 1 加密,然后进行 BASE-64 编码,将结果做为“Sec-WebSocket-Accept”头的值,返回给客户端。


注:本文为转载,原文地址:长连接、短连接、长轮询、短轮询、WebSocket

退出移动版