从ChatGPT聊天服务上深挖Http、WebScoket和SSE推送技术的区别

简介: 从ChatGPT聊天服务上深挖Http、WebScoket和SSE推送技术的区别

简述 —— 三种方式进行通讯

回忆TCP/IP协议

其中,三次握手过程的步骤为:

  1. 客户端向服务端发送 SYN 报文,其中 seq 表示客户端的初始序列号。
  2. 服务端收到 SYN 报文后,向客户端发送 SYN+ACK 报文,其中 ack 表示服务端收到了客户端的序列号,seq 表示服务端的初始序列号。
  3. 客户端收到 SYN+ACK 报文后,向服务端发送 ACK 报文,其中 ack 表示客户端收到了服务端的序列号,seq 表示客户端的下一个序列号。

四次挥手过程的步骤为:

  1. 客户端向服务端发送 FIN 报文,其中 seq 表示客户端最后一次发送数据的序列号。
  2. 服务端收到 FIN 报文后,向客户端发送 ACK 报文,其中 ack 表示服务端收到了客户端的序列号。
  3. 服务端完成数据传输后,向客户端发送 FIN 报文,其中 seq 表示服务端最后一次发送数据的序列号,ack 表示服务端收到了客户端的序列号。
  4. 客户端收到 FIN 报文后,向服务端发送 ACK 报文,其中 ack 表示客户端收到了服务端的序列号。

从ChatGPT项目中引发的思考

项目地址:Grt1228/chatgpt-steam-output: Open AI ChatGPT流式输出。Open AI Stream output. ChatGPT Stream output.GPT-3.5 (github.com)

有感兴趣的朋友可以去拉取下来跑一跑,但是需要过河,这里就不做过多的教程,百度就有:dog2:

下面我直接发测试图

基于SSE

image-20230505115552583

image-20230505115630534

image-20230505115810329

可以看出,SSE是每次客户端都会创建链接,然后服务端返回请求。

但是这个项目又是如何保存会话的?

挖掘源码发现,是在JVM内存中保存了Message上下文

image-20230505120131876

image-20230505120925545

sdk内部采用okHttp进行事件和远程调用的绑定,也就是说每次有请求响应的时候拼装返回前端

image-20230505121842848

image-20230505122005437

image-20230505122151787

基于WebSocket

image-20230505125742757

我们可以看到,这两次会话都是在一次请求里面的

分析

HTTP协议

HTTP/1.0 和 HTTP/1.1 是 HTTP 协议的两个版本,它们之间存在以下几点区别:默认是否开启长连接:HTTP/1.0 默认不支持长连接,需要在请求头中显式地设置 Connection: Keep-Alive 来启用,而 HTTP/1.1 默认支持长连接,无需额外设置。请求方式是否有区别:HTTP/1.1 引入了新的请求方式(如 PUT、DELETE、OPTIONS、TRACE、CONNECT 等),以及增加了对请求方式的扩展性。缓存机制是否有变化:HTTP/1.1 引入了缓存控制机制,可以通过设置 Cache-Control、ETag、If-None-Match 等头部信息来控制缓存的行为,从而提高网站性能。分块传输编码是否有支持:HTTP/1.1 引入了分块传输编码(chunked transfer encoding),可以更高效地传输大型数据。Host 头部是否必须:HTTP/1.0 中没有 Host 头部,而在 HTTP/1.1 中,所有的请求头都必须包含 Host 头部,以便服务器能够处理多个域名和虚拟主机的请求。综上所述,HTTP/1.1 是 HTTP/1.0 的升级版本,引入了许多新特性和改进,提高了网络性能和可扩展性。HTTP/2 是支持多路复用(Multiplexing)的协议,这意味着可以同时发送多个请求,而不需要等待前一个请求的响应。因此,HTTP/2 不是完全的异步操作,而是支持同时处理多个请求和响应的协议。使用 HTTP/2 可以显著提高网站性能和加载速度,因为可以更有效地利用网络资源。

WebSocket协议

img

HTTP长连接是指在一个TCP连接上可以发送多个HTTP请求,而不是每个HTTP请求都需要新建一个TCP连接。HTTP1.1使用了HTTP长连接的机制,可以在一个TCP连接上发送多个HTTP请求和响应,从而避免了重复建立和断开TCP连接的开销。而WebSocket协议是在一个已建立的TCP连接上实现全双工通信,不需要重复建立TCP连接。

SSE推送送技术

SSE(Server-Sent Events)也是一种基于HTTP协议的服务器推送技术,用于实现服务器向客户端推送数据的功能。与WebSocket不同的是,SSE采用的是“单向通信”的方式,即只有服务器向客户端推送数据,客户端不能像WebSocket一样主动向服务器发送数据。

SSE的通信过程也是基于HTTP协议进行的,客户端通过发送一个HTTP请求与服务器建立连接,服务器保持连接处于打开状态,随时可以向客户端推送数据。与WebSocket类似,SSE也可以支持长连接,避免了频繁地建立和关闭连接的开销。但与WebSocket不同的是,SSE的通信过程中,服务器只能向客户端推送文本类型的数据,而不能推送二进制数据。

下面是SSE的通信过程示意图:

其中,Client发送SSE Request建立连接请求,Server返回HTTP Response并设置Content-Type为text/event-stream,表示服务器将向客户端推送SSE数据。服务器可以在任意时刻向客户端发送一条SSE消息,格式为event: \ndata: \n\n,其中event表示事件名称,data表示要推送的数据。注意,每条消息以两个换行符结尾。

需要注意的是,与WebSocket不同,SSE的通信是基于HTTP协议的,每次请求-响应的过程中都会经过三次握手和四次挥手的过程。因此,SSE并不是真正意义上的实时通信,而是通过保持长连接的方式,实现了一种近似于实时的服务器推送机制。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2天前
|
网络协议 JavaScript 安全
第十一篇 前沿趋势与展望:深入探索GraphQL、RESTful API、WebSocket、SSE及QUIC与HTTP/3
第十一篇 前沿趋势与展望:深入探索GraphQL、RESTful API、WebSocket、SSE及QUIC与HTTP/3
|
4天前
|
网络协议 安全 数据安全/隐私保护
Socks5代理和HTTP代理的区别在哪里?
Socks5和HTTP代理是两种IP代理方式,分别基于Socks5及HTTP协议。Socks5支持TCP/UDP,适合P2P、游戏和流媒体,提供传输层身份验证。HTTP代理仅支持HTTP,适用于Web浏览控制和内容过滤。选择代理应根据实际需求,如需高速低延迟选Socks5,需访问控制选HTTP。
|
4天前
|
前端开发 网络协议 Go
为什么ChatGPT选择了SSE,而不是WebSocket?
为什么ChatGPT选择了SSE,而不是WebSocket?
9 2
|
4天前
|
网络协议 网络安全 程序员
socket,tcp,http三者之间的原理和区别
socket,tcp,http三者之间的原理和区别
socket,tcp,http三者之间的原理和区别
|
4天前
|
安全 网络协议 网络安全
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
HTTP和HTTPS是互联网主要的两大协议,HTTP是基础的简单请求-响应协议,常用于TCP上,但数据传输不安全。HTTPS是HTTP的安全版本,添加了SSL层进行加密和身份验证,提供更高的安全性,用于保护数据和验证网站真实性。HTTPS需CA证书,可能产生费用,并使用443端口而非HTTP的80端口。
|
4天前
|
网络协议 安全 数据安全/隐私保护
干货|代理IP协议有何区别?深入了解 SOCKS5、HTTP 代理
SOCKS5和HTTP是两种代理协议,前者是通用型,支持多种网络流量,提供身份验证、IPv6支持及UDP兼容性,更适合实时数据传输。HTTP代理专用于HTTP协议,适用于Web资源请求。SOCKS5在传输方式、功能、兼容性和安全性上更胜一筹,而HTTP代理则在处理HTTP请求时更专业。选择代理协议应根据需求和应用场景,考虑服务的稳定性和安全性。付费代理如kookeey全球代理,支持双协议,速度快且可扩展性强,是可靠的选择。
|
4天前
|
前端开发 API UED
AngularJS的$http服务:深入解析与进行HTTP请求的技术实践
【4月更文挑战第28天】AngularJS的$http服务是核心组件,用于发起HTTP请求与服务器通信。$http服务简化了通信过程,通过深入理解和实践,能构建高效、可靠的前端应用。
|
4天前
|
安全 网络协议 网络安全
Socks5代理与HTTP代理的区别与优劣
在互联网时代,隐私和安全至关重要,代理服务器如socks5和HTTP代理成为保护个人信息的工具。socks5代理支持多种网络流量和UDP协议,更具灵活性和通用性,但设置复杂;HTTP代理则更常见、易用,适合仅处理HTTP流量的场景,但限制较多。选择哪种代理取决于具体需求和应用场景。
|
4天前
|
网络协议 网络安全 数据安全/隐私保护
http和https的区别!
http和https的区别!
|
4天前
|
网络协议 Linux Windows
TCP/IP、Http、Socket之间的区别
TCP/IP、Http、Socket之间的区别