网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

WebSockets协议与长连接机制

更新时间:2026年03月27日   作者:spoto   标签(Tag):

作为网络发展的一个方面,实时访问消费者与服务器之间的联系,现在已成为创建互动式网页程序的重要步骤,同时也为人们带来了极大的便利。 尽管请求-响应机制非常灵活且强大,但在需要快速数据传输或低延迟的场景中,它可能并不适用。 幸运的是,有两种著名的技术能够很好地满足这些需求:WebSockets和Long Polling。 在本文中,我们将详细探讨每一种协议的细节,并分析它们在各种应用场景中的优缺点,从而确定哪种协议最为适合。

WebSockets协议

WebSockets是一种全双工的通信方式,其通信过程是通过一个长期存在的连接来完成的。 这些交换过程是通过普通文本来进行的,没有使用任何额外的协议或封装层(因为那样只会增加不必要的开销)。 与传统的HTTP协议不同,后者会不断地发送各种请求和响应。就像在《丛林之书》中那样,每次有人发送请求时,都会有一些响应随之而来。这种机制在《丛林之书》中被反复使用,每当有人想要获取某个信息时,就会进行这样的操作。 WebSockets 可以同时进行双向通信。 信息在服务器和客户端之间不断流动,这一过程是通过建立持久连接来实现的。这些连接是在进行握手操作时建立的,握手过程中会包含协议版本号以及相关规则信息。

WebSocket协议
  • 握手请求
    • 客户端向服务器发送了一个HTTP请求,该请求的“Upgrade”头部字段的值为“$websocket$”,目的是为了实现双向文本消息的交换。
  • 握手回应
    • 如果服务器确实支持 WebSocket,那么它会返回一个 HTTP 101 状态码,以表明升级请求已被接受,同时也会建立连接。
  • Sec-WebSocket-Key
    • 除了接受由数字标识的客户端发出的连接请求之外,还需要实现另一个回调机制。当服务器收到包含自己独特的认证密钥的请求时(“Sec-WebSocket-Key”),服务器会返回一个由算法生成的、由服务器自行选择的认证密钥(“Sec-WebSocket-Key”)。
  • 稳定的关系/联系
    • 连接已经建立。现在,客户端和服务器之间实现了持续的、全双工的连接——这一切都是通过一条TCP连接来实现的。
  • WebSocket帧格式t
    • WebSocket帧:双方之间传输的数据都遵循某种特定的格式。这些数据可以是二进制数据,也可以是文本数据。
  • 断开连接
    • 当这种连接需要在某个周期结束之前被终止时,客户端或服务器都可以通过发送一个特殊的帧来发起终止操作。这样,WebSocket连接就可以优雅地关闭了。

特征/特点

  • 全双工通信:WebSockets支持双向通信,能够同时实现数据的双向传输。也就是说,WebSockets可以使得数据在双向方向上都能被传输。
  • 实时更新:由于该协议是为实时应用而设计的,因此它非常适合那些需要即时更新的应用场景。比如在线聊天场景,在这里,收益会在某一时刻发生,也可能在某一时刻被损失掉。
  • 低延迟:WebSockets的工作原理是建立持久性的连接,以此来减少延迟。一旦连接被建立后,就不会再重复创建该连接了。这样一来,每次数据交换时所需的通信开销就大大减少了。这与HTTP/1或HTML 5中的“服务器发送事件”功能相比,后者在等待浏览器发送最后请求时会导致网站进入休眠状态。而WebSockets则避免了这种情况的发生。
  • 二进制数据及文本数据的支持:WebSockets可以处理二进制数据以及文本数据,因此它能够满足各种不同类型应用程序的需求。
  • 跨源通信:WebSockets的另一个优点在于,由于它们支持跨源通信,因此可以在不同域名之间发送数据。

优点/好处

  • 效率:降低了运营成本。这种新的WebSockets技术减少了反复建立连接以及重新关闭连接的次数,因此其效率比传统的HTTP轮询方式要高得多。
  • 降低服务器负载:WebSockets的一个优点在于,一旦连接被建立之后,它就会一直保持开放状态。只有一台服务器负责处理请求,而不像长轮询方式那样,每隔几秒或几分钟就需要重新建立一次连接。
  • 低延迟:WebSockets中的这种直接且持续的连接方式,能够有效降低延迟。因此,它非常适合那些对实时性要求极高的应用程序。
  • 双向沟通:双向通信是WebSockets的特点。客户端和服务器都可以进行数据传输。
  • 多功能性:WebSockets可以处理多种类型的数据,因此非常适合各种应用场景。

缺点/不利因素

  • 防火墙问题:有一些网络配置和防火墙可能会阻碍WebSockets的传输,尤其是在那些资源限制较大的情况下。
  • 复杂性:WebSockets的实现方式比传统的基于HTTP的实现要复杂得多,这一点是毋庸置疑的。例如,从一种技术范式转换到另一种技术范式,对于那些不熟悉WebSocket技术的开发者来说,确实是一件困难的事情。
  • 资源消耗:不过,随着连接数量的增加,这些连接会持续不断地占用资源。与无状态连接相比,有状态的连接会消耗更多的资源。
  • 浏览器支持情况:虽然得到了广泛的支持,但像微软的Internet Explorer 10这样的旧版浏览器,以及一些更早的版本,对WebSockets的支持有限或根本不支持。因此,需要一些备用机制来应对这种情况。
  • 连接终止的挑战:优雅地处理断开连接的过程可能会有些困难,甚至有时客户端或服务器会突然中断连接。

长连接/持久性查询

另一种方法是长轮询。这种方法特别适用于那些需要实时消息传递的场景,而此时,由于浏览器不支持WebSockets技术,因此长轮询就变得非常有用。在长轮询模式下,客户端会向服务器端发送请求。服务器会一直等待,直到收到新的数据或达到超时时间为止。当收到新数据或超时时间到时,服务器才会向客户端返回响应。这个过程会不断重复下去。

长轮询
  • 客户请求
    • 客户向服务器发送一个标准的HTTP请求。通常,这种请求只是为了获取信息或更新数据而已,不会涉及到长时间的下载等操作。
  • 服务器正在处理该请求。
    • 不过,为了实现这一点,服务器并不会立即做出响应。请求会被暂时搁置;之后,它会等待新的数据到来,然后再继续处理该请求。
  • 长轮询周期
    • 这种连接可以持续更长时间,从而让服务器有足够的时间来获取或生成所需的数据。
  • 数据已准备好使用。
    • 每当有新的数据可用时,服务器就会向该无限制请求发送相应的响应,同时附上那些信息。
  • 客户端处理数据
    • 接收到的数据由客户端进行处理,他们会立即生成一个新的请求,以持续更新信息流。
  • 重复循环
    • 同时,只有当双方的通信过程持续进行下去时,才能确保新数据的传输。而这一过程会不断重复,只要客户端应用程序继续发出新的请求。

特点/特征

  • 模拟的实时通信:长连接使用HTTP来建立连接,并持续保持该连接开放状态,直到有新数据到达为止。这样就能营造出实时通信的假象。
  • 兼容性:由于这是通过标准的HTTP服务器来实现的,因此它可以与现有的基础设施进行集成。
  • 兼容防火墙和代理服务器:实际上,Long Polling对防火墙和代理服务器来说应该是友好的:它使用的是标准的HTTP请求方式。
  • 服务器负载增加:由于始终采用较长的轮询时间,因此连接数会非常多,这可能会给服务器带来额外的负担。
  • 由客户端发起的请求:在长轮询模式下,一切取决于客户端是否主动发起更新请求。这实际上是一种“拉取机制”。

优点/优势

  • 兼容性:长轮询方式利用了现有的各种基础设施,因为它使用的是众所周知的HTTP请求方式。
  • 简单性:与WebSockets相比,实现长连接的方式要简单得多。尤其是在那些不支持WebSockets的情况下,使用长连接更为合适。
  • 防火墙与代理服务器的兼容性:长轮询方式可以跳过与WebSockets相关的防火墙和代理问题。
  • 粒度控制:长轮询方式能够更精细地控制更新时机,从而降低数据传输的频率。
  • 备用机制:在那些无法使用原生WebSocket功能或需要复杂处理机制的环境中,长轮询可以作为一种备选方案来使用。

缺点/不利因素

  • 延迟:长轮询方式会导致延迟,因为客户端需要等待更新信息的到来。因此,最佳的做法是在服务器拥有最新信息时立即发送数据。
  • 服务器负载增加:需要处理和管理大量开放连接的情况,这可能会导致服务器负载的增加。
  • 连接限制:一些服务器和基础设施还可能设定连接限制,这会影响长连接技术的可扩展性。
  • 并非真正的双向性:长轮询模拟了双向通信,但它缺乏WebSockets那种真正的双向特性。
  • 资源消耗:如果长时间保持一些连接处于开放状态,就会消耗服务器的资源,从而可能影响整体的性能。

WebScokets与长轮询之间的区别

特点/特征

WebSockets

长连接/长时间轮询

通信类型

全双工双向通信

模拟双向传输

连接建立

持久连接

反复地打开和关闭

延迟

低(实时更新)

变量值(取决于轮询频率)

服务器负载

由于持续的连接,导致延迟降低。

由于连接处于开放状态,因此可能会出现更高的可能性。

兼容性

需要原生支持才能实现。

与标准HTTP协议兼容

防火墙与代理支持

May可能会面临一些挑战。

适合防火墙和代理服务器的使用

结论

无论是 WebSockets 还是 Long Polling,它们都能解决在 Web 应用程序中实现实时通信的问题。 前者在带来更优的优势的同时,也伴随着不同程度的权衡;而后者则能实现最佳的效率,但会面临内存被过早释放的问题,同时还能提供即时的响应时间。不过,这两种方式都会给开发者带来较高的成本。 在协议之间进行仲裁显然需要考虑诸如应用程序的特性、网络环境以及您的WebSocket服务支持情况等因素。 试图在两种方式之间找到最佳结合点。随着技术的不断发展,开发者们必须仔细评估自己的项目,以确定如何将面对面的交流方式转化为实时交流方式。

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料