为什么豆包对话选择 SSE 协议而非 websocket?实时通信的关键差异解析

945 阅读13分钟

一、背景

在我们平时使用豆包的过程中,不知道大家有没有发现,界面上的内容不是一次性显示出来的,而是像是以一种实时的方式打印出来的,这种方式我们把他称之为流式打印。这种效果感觉互动性更强,更加真实,那么这种技术是如何实现的呢?其实传统的请求-响应模型(如HTTP/HTTPS)并不能很好地满足这种实时流式输出。为此,目前主流的web实时通信技术主要是以以WebSocket和Server-Sent Events (SSE)为主,下面我们就一起介绍一下这两者之间的差异,以及为什么豆包选择使用SSE而不是Websocket?

image.png

二、一些网络协议相关的知识补充

1. OSI网络协议模型

OSI(Open System Interconnection)参考模型即开放式系统互联通信参考模型,是一种概念模型,由国际标准化组织(ISO)提出,目的是为了使各种计算机在世界范围内互连为网络。OSI 模型将计算机网络体系结构划分为七层,从下到上分别是:

image.png

物理层

  1. 定义:物理层主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为 1、0,也就是我们常说的数模转换与模数转换)。

数据链路层

  1. 定义:数据链路层主要将从物理层接收的数据进行 MAC 地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输时,会根据数据中包含的 MAC 地址信息进行转发,实现不同设备之间的通信。以太网协议、PPP 协议等。以太网协议是最常见的数据链路层协议之一,它规定了如何在局域网中传输数据帧。PPP 协议则常用于广域网连接中,实现数据的可靠传输。

网络层

  1. 定义:网络层主要将从下层接收到的数据进行 IP 地址的封装与解封装。在这一层工作的设备是路由器,它根据 IP 地址将数据包从一个网络转发到另一个网络,实现不同网络之间的通信。IP 协议、ICMP 协议等。IP 协议是网络层的核心协议,它规定了如何给网络中的设备分配 IP 地址,以及如何将数据包从源地址传输到目的地址。ICMP 协议用于在 IP 网络中发送控制消息,例如报告错误或进行网络诊断。

传输层

  1. 定义:传输层定义了一些传输数据的协议和端口号,如 TCP 和 UDP。它主要是将从下层接收的数据进行分段和重组,为应用层提供端到端的可靠数据传输服务。例如,当你在浏览器中访问一个网页时,浏览器和服务器之间的通信就是通过传输层的协议来实现的。TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的传输层协议。它通过三次握手建立连接,在数据传输过程中进行流量控制和拥塞控制,确保数据的准确无误传输。UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议。它不保证数据的可靠传输,但具有传输速度快、开销小的优点,适用于一些对实时性要求较高的应用,如视频会议、在线游戏等。

会话层

  1. 定义:会话层主要负责建立、管理和终止表示层实体之间的通信会话。它通过在通信双方之间建立、维护和管理会话,确保数据的有序传输。例如,在进行远程登录时,会话层负责建立和管理用户与远程服务器之间的会话,确保用户的输入和服务器的响应能够正确地交互。会话层的主要功能包括会话建立、会话管理和会话终止。在会话建立阶段,通信双方通过协商确定会话的参数,如会话标识符、加密方式等。在会话管理阶段,会话层负责维护会话的状态,确保数据的正确传输和接收。在会话终止阶段,会话层负责安全地终止会话,释放资源。

表示层

  1. 定义:表示层主要负责数据的表示、加密和压缩等功能。它将应用层的数据转换为适合网络传输的格式,并进行加密和压缩等处理,以提高数据的安全性和传输效率。例如,当你在网上购物时,你的信用卡信息需要进行加密处理,以确保信息的安全传输。表示层就是负责这种加密和转换的工作。表示层的主要功能包括数据格式转换、数据加密和数据压缩。在数据格式转换方面,它可以将不同格式的数据转换为统一的网络标准格式,以便在不同的系统之间进行通信。在数据加密方面,它可以使用各种加密算法对数据进行加密,保护数据的安全性。在数据压缩方面,它可以对数据进行压缩,减少数据的传输量,提高传输效率。

应用层

  1. 定义:应用层是 OSI 模型的最高层,它直接面向用户,为用户提供各种网络应用服务。例如,电子邮件、文件传输、网页浏览等都是应用层的服务。应用层通过调用下层的服务,实现各种具体的网络应用功能。HTTP(HyperText Transfer Protocol,超文本传输协议)是用于在 Web 上传输超文本的协议。SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)用于发送电子邮件。FTP(File Transfer Protocol,文件传输协议)用于在网络上传输文件等。 总之,OSI 七层网络协议模型为计算机网络的通信提供了一个标准化的框架,使得不同的计算机系统和网络设备能够相互通信和协作。每一层都有其特定的功能和协议,它们共同构成了一个完整的网络通信体系。

2. WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得客户端和服务器之间可以实现实时、双向的数据传输。

image.png

2.1 工作原理

WebSocket是一种独立的协议,用于在单个TCP连接上提供全双工通信。它通过HTTP/HTTPS协议完成初始握手,然后升级到WebSocket协议。

握手过程

  • • 客户端发送一个HTTP请求给服务器,包含特殊的WebSocket头信息,用于请求协议升级(从HTTP/HTTPS升级到WebSocket协议)。
  • • 服务器接收到这个请求后,检查头信息并确认是否同意升级。如果同意,它会返回一个带有101状态码的HTTP响应,表示协议切换(Switching Protocols)。

通信过程

  • • 在握手成功后,客户端和服务器通过WebSocket协议持久连接进行通信。此连接将保持打开状态,双向数据流可以在任一端发起,而不需要每次发消息都重新建立连接。WebSocket的消息是帧格式的,分为数据帧和控制帧。

2.2 特点

  • • 双向通信:支持客户端和服务器之间的全双工通信。
  • • 低延迟:适合要求低延迟的实时应用,如在线聊天、多人游戏。
  • • 数据帧格式:WebSocket协议规定了消息的帧格式,包括控制帧和数据帧。

2.3 适用场景

  1. 实时聊天应用:WebSocket 非常适合实时聊天应用,用户可以即时发送和接收消息,无需不断刷新页面。聊天消息可以实时推送给所有在线用户,提供良好的交互体验。
  2. 在线游戏:在在线游戏中,需要实时传输玩家的操作和游戏状态。WebSocket 可以实现低延迟的通信,确保玩家能够及时响应游戏中的变化。
  3. 股票行情和金融数据:对于股票行情和金融数据的实时更新,WebSocket 可以提供快速的数据传输,使投资者能够及时了解市场动态。
  4. 协作工具:如在线文档编辑、实时绘图等协作工具需要实时同步用户的操作。WebSocket 可以实现多个用户之间的实时协作,提高工作效率。
  5. 物联网(IoT):在物联网应用中,设备需要实时向服务器发送数据并接收指令。WebSocket 可以为物联网设备提供可靠的通信渠道,实现远程监控和控制。

3. Server-Sent Events (SSE)

3.1 工作原理

Server-Sent Events (SSE) 是一种在客户端和服务器之间传递事件的机制,主要用于服务器向客户端推送实时数据SSE并不是一种协议而是一种机制,这也是区别于WebSocket的地方之一。

虽然SSE并没有像WebSocket那样定义出一个独立的协议,但它却通过标准的HTTP协议实现了类似长连接的功能。SSE规定了特定的MIME类型和数据格式,来让服务器持续发送数据流。

image.png

3.2 特点

1. 使用标准HTTP协议

SSE在现有的HTTP/HTTPS协议之上构建,不需要额外的协议或端口。客户端向服务器发送一个普通HTTP请求,服务器响应该请求,并持续发送数据。 如下图所示:

image.png

2. 特定的MIME类型

在SSE中,服务器的响应内容类型必须是 text/event-stream,这告诉浏览器或者客户端这是一个SSE数据流。 如下图所示:

image.png

3. 单向通信

SSE是一种单向通信方式,即服务器推送数据到客户端,客户端通常只是接收和处理数据,不向服务器发送响应的数据流。需要额外进行双向通信时,可以通过Ajax等其他技术辅助手段实现。

4. 自动重连和事件流ID(Last-Event-ID)

SSE具有自动重连功能。如果连接中断,浏览器会自动重新连接,并且可以通过 Last-Event-ID 头来继续从断开点接收数据。

image.png

3.3 适用场景

  1. 实时通知:SSE 可以用于实现实时通知,如邮件通知、系统警报等。当有新的通知时,服务器可以立即将通知推送给客户端,用户无需手动刷新页面即可获取最新的通知。
  2. 股票行情和金融数据:与 WebSocket 类似,SSE 也可以用于实时更新股票行情和金融数据。服务器可以将最新的股票价格、指数等数据推送给客户端,让用户能够及时了解市场动态。
  3. 日志监控:在服务器端进行日志监控时,可以使用 SSE 将日志信息实时推送给客户端。这样,管理员可以在浏览器中实时查看服务器的日志,及时发现和解决问题。
  4. 社交网络更新:社交网络应用可以使用 SSE 来实时推送新的动态、消息和通知。用户可以在不刷新页面的情况下获取最新的社交网络更新。

三、 豆包为什么选择SSE而不是websocket的呢?

SSE建立在已有的HTTP协议之上,这是Web开发中最常用和最成熟的协议之一。以下是这两者各个维度的比较

比较类别Server-Sent Events(SSE)WebSocket
通信模式单向,服务器向客户端发送数据双向,客户端和服务器可互相发送数据
连接建立基于 HTTP 协议,客户端发起特殊请求,服务器响应通过握手协议建立全双工连接
适用场景适用于单向的服务器推送场景,如实时通知、股票行情等适用于双向通信的实时应用,如在线游戏、实时协作等
重连机制如果连接中断,客户端自动尝试重新连接如果连接中断,客户端可尝试重新连接
数据传输格式事件流格式,每个事件由事件类型和数据组成可以是文本数据或二进制数据
复杂性相对简单,基于 HTTP 协议,无需处理复杂的双向通信状态相对复杂,需要处理更多协议细节和状态管理
浏览器支持广泛支持广泛支持
协议开销通常较小,因为基于 HTTP 协议且单向通信相对较大一些,由于要建立全双工连接和处理更多状态
服务器资源占用一般情况下相对较低,因为主要是单向推送可能较高,因为需要处理双向通信和更多的连接状态变化
安全性依赖于底层 HTTP 的安全机制可以使用加密等安全措施,与 HTTP 类似但需额外配置
开发难度对于简单的服务器推送场景较容易开发双向通信场景下开发难度相对较高,需要处理更多复杂情况
与代理服务器兼容性通常较好,因为基于 HTTP 协议,与常见代理服务器兼容性高可能会遇到一些代理服务器不兼容的情况,需要进行额外配置

综上所述,豆包选择了SSE而不是Websocket。

四、 总结

WebSocket和Server-Sent Events (SSE) 都是实现长连接、实时通信的有效技术,各有优劣。WebSocket适合需要低延迟、双向通信的应用场景,如聊天应用、在线游戏和实时协作工具。SSE则更适用于单向数据推送场景,是一种简单而有效的服务器推送技术,非常适用于各种需要实时更新的应用场景,如网页对话、新闻实时更新、股票行情和实时投票结果展示,它基于 HTTP 协议,具有自动重连和事件流格式等特点,使得客户端能够轻松地接收服务器推送的信息。