在网络应用的快速发展中,新型的通信协议不断涌现,而 WebSocket、gRPC 和 QUIC 都是现代网络通信技术中的重要协议和技术,在不同的应用场景中,它们之间存在着一定的相同和差异。接下来我们就以这三种技术的特点、差异和应用场景进行分析说明。
什么是WebSocket?
WebSocket 是一种基于 HTTP 的协议,是HTML5研究小组在2011年提出的一个协议规范,主要用于实现双向通信。在WebSocket中,客户端和服务器可以建立一条持久化的连接,通过这条连接可以实现双向通信。
WebSocket 是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。也就是说WebSocket 分为握手和数据传输阶段(HTTP握手 + 双工的TCP连接),还有最后关闭连接阶段,如下图:
有以下特点
● 建立在 TCP 协议之上
(它需要通过握手连接之后才能通信,服务器端的实现比较容易)
● 双向通信
(当建立通信连接,可以做到持久性的连接,服务器可以主动给客户端推送消息)
● 与 HTTP 协议有着良好的兼容性
(默认端口也是80或443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种代理服务器)
● 性能开销小,通信高效
(数据格式比较轻量,可以发送文本,也可以发送二进制数据)
● 没有同源限制
(客户端可以与任意服务器通信)
应用场景
● 聊天应用
● 在线游戏
● 协作编辑应用
● 股票交易应用
● 实时活动/数据流展示等
什么是gRPC?
gRPC是Google在2016推出的一个高性能轻量级RPC框架,它使用Protobuf作为接口描述语言,支持多种编程语言,如 C++, Java, Python 等。
gRPC是建立在TCP之上,工作模式有四种:
■ 简单 RPC
(一般的rpc调用,client请求一次,server返回一次)
■ 服务端流式 RPC
(client请求一次,server返回多次)
■ 客户端流式 RPC
(client请求多次,server返回一次)
■ 双向流式 RPC
(结合客户端流式和服务端流式,即双方可以流式互相通信)
对比传统的RPC,在响应返回之前时是不能继续发送请求的,而gRPC双向流模式可以同时互相通信,默认使用protobuf协议,比xml和json传输效率高10-20倍.
有以下特点
● 支持多种语言(跨语言编程)
● 性能高
(protobuf性能高过json, http2.0性能高过http1.1)
● 基于标准的 HTTP/2 设计
(支持双向流、消息头压缩、单TCP的多路复用、服务端推送等特性)
● 默认采用protobuf作为IDL
(接口描述语言)
● 序列化支持 protobuf
(protobuf是一种语言无关的高性能序列化框架,保障了RPC调用的高性能,传输效率高)
● 流式处理
(基于http2.0支持客户端流式,服务端流式,双向流式)
应用场景
● 微服务架构
可以用于构建微服务架构中的各个服务之间的通信,实现高效的服务调用。
● 多语言项目
其跨语言特性使得不同语言的项目可以通过gRPC进行通信,特别是当项目涉及多个不同语言的服务的时候。
● 云原生应用
可以与Kubernetes、Istio等云原生技术结合使用,实现服务的发现、负载均衡、容错等功能,从而更好地支持云原生应用的开发和部署。
什么是QUIC?
QUIC是谷歌在2016年制定的一种基于UDP的低时延的互联网传输层协议,旨在解决 TCP 协议存在的问题。QUIC 支持多路复用和快速握手,可以提高数据传输的效率和可靠性。
有以下特点
● 快速启动和快速恢复
QUIC可以在连接建立时立即启动数据传输,不需要等待握手完成,因此可以更快地建立连接和传输数据。
● 多路复用
可以在一个连接上同时传输多个数据流,提高网络利用率和数据传输效率。
● 安全性
内置TLS协议,支持端到端的加密传输,可以保护数据的机密性和完整性,防止网络中间人攻击和数据泄露。
● 连接保持
当客户端 IP 或者端口发生变化时,可以快速恢复连接,也就是从WiFi 切换到流量时用户无感知。
● 适应性
依据自适应算法并结合网络状况调整传输参数。例如调整窗口大小、重传超时等,以适应不同的网络环境和带宽情况。
有以下特点
● 实时通信和游戏
其快速启动和快速恢复的特点,使得它更适用于实时通信和游戏场景。
● 流媒体和视频服务
其多路复用和流量控制,适合用于流媒体和视频服务,提高数据传输效率和网络利用率。
● 网络安全
内置TLS协议,支持端到端的加密传输,可以保护数据的机密性和完整性,适合用于网络安全场景。
三者之间的差异对比
综 合 对 比
如何使用呢?
何时使用 WebSocket?
实时更新的功能及服务,其中通信是单向的,由服务器将最新更新的信息推送到客户端。如:警报和通知。
双向通信的功能及服务,客户端和服务器互相实时发送和接收消息。如:在线聊天、在线协作编辑文档。
一次向多个终端广播相同的消息,通常说法为发布/订阅消息传递方式。
何时使用 gRPC?
在微服务风格的系统框架中使用gRPC连接多语言服务。针对流式请求和流式响应的点对点实时服务。
何时使用QUIC?
短视频:提升首屏秒开率,降低卡顿率。
图片文件下载:降低文件下载总耗时。
直播:降低播放卡顿率,提升推流稳定性。
总 结
你要选择使用哪种协议将取决于你的特定需求。你的应用程序的应用场景和目标决定了你应该使用哪种协议。比如:双向通信的实时应用程序就最适合使用WebSocket,但它不太适合需要发送大量数据的应用程序。若应用服务间需要发送大量数据进行通信,那gRPC无疑是最好的选择。基本上,你需要确定您的应用程序开发目标是什么,侧重点是什么。
你可以尝试对自己问以下问题:
● 应用程序的目标是什么:安全还是质量?
● 应用程序开发目标是什么?
● 未来的目标是什么?
关注以上的几个问题的同时,然后决定为要研发的应用程序选择一个适合的通信技术。