服务器推送、在线游戏和电子邮件背后的网络协议

news2024/11/25 9:24:26

之前也聊了不少网络协议这块内容,现在我们将深入探讨关键的网络协议及其在不同应用中的作用。重点在于理解这些协议如何塑造我们在互联网上的通信和互动方式。我们将深入研究以下领域:

WebSocket

在之前的讨论中,我们研究了HTTP及其在客户端和服务器之间的典型请求-响应交互中的作用。HTTP在大多数情况下表现良好,特别是当响应是即时的时候。然而,在服务器需要主动向客户端推送更新的情况下,尤其是这些更新依赖于客户端无法预测的事件(比如其他用户的操作),HTTP可能不是最有效的方法。这是因为HTTP基本上是一种拉取(pull-based)协议,客户端必须发起所有请求。那么,在不需要客户端预测和请求每个更新的情况下,如何让服务器向客户端推送数据呢?通常有四种处理这种推送型通信的方法,如下图所示。

1. 短轮询(Short polling)

这是最基本的方法。在这种方法中,客户端,通常是运行在我们的浏览器中的Web应用程序,会不断向服务器发送HTTP请求。想象这样的场景:我们登录到一个Web应用程序,并被要求用智能手机扫描一个二维码。这个二维码通常用于某个特定的操作,比如认证或启动某个过程。Web应用程序不知道我们何时会扫描二维码。因此,它会每1-2秒向服务器发送一次请求,以检查二维码的状态。一旦我们用智能手机扫描了二维码,服务器会识别扫描,然后在Web应用程序的下一个检查请求中,将更新后的状态发送回来。这样,我们在扫描二维码后将在接下来的1-2秒内得到响应。由于这种频繁的检查,我们将这种方法称为“短轮询”。

这种方法有两个问题:

•它发送大量的HTTP请求,占用带宽并增加服务器负载。•在最坏的情况下,我们可能要等待长达2秒才能收到响应,导致明显的延迟。

2. 长轮询(Long polling)

长轮询通过设置较长的HTTP请求超时时间来解决短轮询的问题。可以这样理解:我们将超时时间调整为30秒。如果我们在这个时间段内扫描了二维码,服务器将立即发送响应。这种方法显著减少了HTTP请求的数量。

然而,长轮询并非没有挑战。即使长轮询减少了请求的数量,但每个开放的请求仍然需要与服务器保持连接。如果有许多客户端,这可能对服务器资源造成压力。

3. WebSocket

短轮询和长轮询适用于简单的任务,比如扫描二维码。但对于复杂、数据量大且需要实时交互的任务,比如在线游戏,需要一种更高效的解决方案 - 这就是WebSocket。

TCP本质上允许双向数据流,使客户端和服务器能够同时相互发送数据。然而,基于TCP的HTTP/1.1并未充分利用这种能力。在HTTP/1.1中,数据传输通常是按顺序进行的 - 一方发送数据,然后另一方回应。这种设计对于网页交互足够,但对于需要实时交互的在线游戏等应用而言显得不足。WebSocket是另一种基于TCP的协议,在单个连接上允许全双工通信,填补了这个空白。稍后我们将详细介绍。

4. SSE (Server-Sent Events)

SSE,即服务器推送事件,适用于特定的用例。当客户端建立SSE连接时,服务器保持此连接开放以持续发送更新。这种设置非常适用于服务器需要定期向客户端推送数据的情况,而客户端只需接收数据,无需向服务器发送信息。典型的例子是实时股票市场数据更新。使用SSE,服务器可以在每次有更新时向客户端推送实时数据,而无需每次更新都发送请求。值得注意的是,与WebSocket不同,SSE不支持双向通信,因此在需要双向交互的用例中不太适用。

如何建立WebSocket连接

要建立WebSocket连接,我们需要在HTTP头部包含特定字段,这些字段告诉浏览器切换到WebSocket协议。一个随机生成的Base64编码密钥(Sec-WebSocket-Key)被发送到服务器。

请求头:

Connection: Upgrade 
Upgrade: WebSocket
Sec-WebSocket-Key: T2a6wZlAwhgQNqruZ2YUyg==

服务器响应头:

HTTP/1.1 101 Switching Protocols


Sec-WebSocket-Accept: iBJKv/ALIW2DobfoA4dmr3JHBCY=


Upgrade: WebSocket


Connection: Upgrade

状态码101表示协议正在切换。经过这个额外的握手后,WebSocket连接建立完成,如下图所示:

dd8bbf42fa5316aba596ae686be16130.png
9f2ff945-1c60-4e43-9252-474e74dc4fe7_1600x1303.png

WebSocket消息

一旦HTTP升级为WebSocket,客户端和服务器将在帧中交换数据。我们来看一下数据是什么样子的:

80dc5781d71ec4385b1f7d6e7bd6bb7c.png

操作码(Opcode)是一个4位字段,表示帧数据的类型。

•“1”表示文本帧。•“2”表示二进制帧。•“8”表示关闭连接的信号。

有效负载长度可以是一个7位字段,也可以扩展为包含扩展的有效负载长度。如果这两个长度字段都被充分利用,有效负载长度可以表示几个TB的数据。

WebSocket适用于在线游戏、聊天室和协作编辑应用等需要客户端和服务器频繁交互的场景。

RPC

RPC允许在不同服务上执行函数。从调用程序的角度来看,它似乎是在本地执行函数。下图展示了本地过程调用和远程过程调用之间的区别。我们可以将订单管理和支付等模块部署在同一进程或不同服务器上。当部署在同一进程时,这是本地函数调用。当部署在不同服务器上时,这是远程过程调用。

c235628d5025604b28c34713363168e7.png
 

为什么我们需要RPC?难道我们不能使用HTTP在服务之间进行通信吗?让我们在下表中比较RPC和HTTP。

8b3dedc8a3a1257508a9a038497f24a5.png
 

RPC相对于HTTP的主要优势在于它轻量级的消息格式和卓越的性能。例如,gRPC就是一个例子,它在HTTP/2上运行,由于这一点,它具有更好的性能。

接下来,我们将探讨另一个重要的应用层协议 - RPC(远程过程调用)。

让我们逐步了解gRPC的运作流程:

第一步:客户端发起一个REST调用。请求体通常以JSON格式表示。

第二至四步:订单服务(充当gRPC客户端)接收到REST调用后,将其转换成适当的格式,并且发起一个RPC调用给支付服务。gRPC将客户端存根编码成二进制格式,并将其发送到底层传输层。

第五步:gRPC通过HTTP2将数据包发送到网络。二进制编码和网络优化使得gRPC比JSON快上多达五倍。

第六至八步:支付服务(充当gRPC服务器)接收到数据包后,对其进行解码,并调用服务器应用程序。

第九至十一步:服务器应用程序返回的结果被编码并发送回传输层。

第十二至十四步:订单服务接收到数据包后,对其进行解码,并将结果发送给客户端应用程序。

e67b3fbf3550fa93ad84779b9ac1a3b7.png
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

帮助中心客户服务中的作用与应用

随着互联网的快速发展,越来越多的企业开始寻求更加高效、便捷的客户服务方式,帮助中心的自助服务作为一种新型的客户服务模式,受到了广泛关注。本文将针对帮助中心的自助服务在客户服务中的作用与应用进行深入探讨。 帮助中心在客户服务中的…

scrcpy2.0+实时将手机画面显示在屏幕上并用鼠标模拟点击2023.7.26

想要用AI代打手游,除了模拟器登录,也可以直接使用第三方工具Scrcpy,来自github,它是一个开源的屏幕镜像工具,可以在电脑上显示Android设备的画面,并支持使用鼠标进行交互。 目录 1. 下载安装2. scrcpy的高级…

文本预处理——文本数据分析

目录 文本数据分析中文酒店评价语料获得训练集和验证集的标签数量分布获取训练集和验证集的句子长度分布获取训练集和验证集的正负样本长度散点分布获得训练集和验证集不同词汇总数统计获得训练集上正负的样本的高频形容词词云获得验证集上正负的样本的形容词词云 文本数据分析…

Golang指针详解

要搞明白Go语言中的指针需要先知道3个概念:指针地址、指针类型和指针取值。 指针介绍 我们知道变量是用来存储数据的,变量的本质是给存储数据的内存地址起了一个好记的别名。比如我们定义了一个变量 a : 10 ,这个时候可以直接通过 a 这个变量来读取内存…

IPv6 over IPv4

IPv6 over IPv4隧道简介 IPv6 over IPv4隧道可实现IPv6网络孤岛之间通过IPv4网络互连。由于IPv4地址的枯竭和IPv6的先进性,IPv4过渡为IPv6势在必行。因为IPv6与IPv4的不兼容性,所以需要对原有的IPv4设备进行替换。但是如果贸然将IPv4设备大量替换所需成…

明晚直播:可重构计算芯片的AI创新应用分享!

大模型技术的不断升级及应用落地,正在推动人工智能技术发展进入新的阶段,而智能化快速增长和发展的市场对芯片提出了更高的要求:高算力、高性能、灵活性、安全性。可重构计算区别于传统CPU、GPU,以指令驱动的串行执行方式&#xf…

SpringBoot 集成 Elasticsearch

一、版本 spring-boot版本:2.3.7.RELEASEElasticsearch7.8.0版本说明详见 二、Elasticsearch 下载和安装 Elasticsearch 下载 kibana下载 ik分词器下载 配置IK分词器 2.1 解压,在elasticsearch-7.8.0\plugins 路径下新建ik目录 2.2 将ik分词器解压放…

【VB6|第21期】检查SqlServer数据库置疑损坏的小工具(含源码)

日期:2023年7月25日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xf…

Java反射类private私有变量Map并赋值

Java反射类private私有变量Map并赋值 import java.util.LinkedHashMap; import java.util.Map;public class MyObj {private String KEY "NAME";//目标是通过反射在外部访问cacheprivate Map<String, String> cache new LinkedHashMap<>();public MyOb…

mac 删除自带的ABC输入法保留一个搜狗输入法,搜狗配置一下可以减少很多的敲击键盘和鼠标点击次数

0. 背景 对于开发者来说&#xff0c;经常被中英文切换输入法所困扰&#xff0c;我这边有一个方法&#xff0c;删除mac默认的ABC输入法 仅仅保留搜狗一个输入法&#xff0c;配置一下搜狗输入&#xff1a;哪些指定为英文输入&#xff0c;哪些指定为中文输入&#xff08;符号也可…

七、Kafka源码分析之网络通信

1、生产者网络设计 架构设计图 2、生产者消息缓存机制 1、RecordAccumulator 将消息缓存到RecordAccumulator收集器中, 最后判断是否要发送。这个加入消息收集器&#xff0c;首先得从 Deque 里找到自己的目标分区&#xff0c;如果没有就新建一个批量消息 Deque 加进入 2、消…

限幅器(信捷PLC C语言FC功能函数)

关于限幅器的算法介绍,请参考下面博客文章,这里不再赘述,受水平和能力所限文中难免出现错误和不足之处,欢迎大家批评指正。 限幅器算法介绍 PLC信号处理系列之限幅器(Saturation)_RXXW_Dor的博客-CSDN博客TITLE=限幅器VAR_INPUTrX:REAL;// 输出值// 上限到达 FALSE: Up…

RT thread 之 Nand flash 读写过程分析

文章目录 前言&#xff1a;什么是Nand Flash&#xff1f;1、Nand Flash 读取步骤2、从主存读到Cache2.1 在标准spi接口下读取过程2.2 测试时序&#xff08;SPI频率30MHz&#xff09; 3.从Cache读取数据3.1在标准spi接口读取过程测试时序 前言&#xff1a;什么是Nand Flash&…

服务器数据恢复-误操作导致存储VDisk丢失的数据恢复案例

服务器数据恢复环境&#xff1a; IBM某型号存储&#xff1b; Solaris操作系统&#xff0c;部署Oracle数据库。 服务器故障&#xff1a; 重建MDisk导致对应的存储池中的VDisk丢失&#xff0c;导致Solaris操作系统中的Oracle数据库无法使用。 服务器数据恢复过程&#xff1a; 1、…

【如何训练一个中英翻译模型】LSTM机器翻译模型部署之ncnn(python)(五)

系列文章 【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训练…

MTK系统启动流程

MTK系统启动流程 boot rom -> preloader ->lk ->kernel ->Native -> Android 1、Boot rom:系统开机&#xff0c;最先执行的是固化在芯片内部的bootrom&#xff0c;其作用主要有 a.初始化ISRAM和EMMC b.当系统全擦后 &#xff0c;也会配置USB&#xff0c;用来仿…

Android:RecyclerView封装,打造列表极简加载

前言 mBinding.recycler.linear().divider().set<OrdinaryListBean> {addLayout(R.layout.layout_ordinary_item)}.setList(getList()) 如果我要说&#xff0c;除了数据和布局之外&#xff0c;以上的几行代码&#xff0c;就实现了一个列表加载&#xff0c;有老铁会相信…

T形积木(T puzzle)

目录 积木绘制 积木拼接 练习 1. 停止标志 2. 跳跃旋转 3. 小步平移 积木绘制 &#xff08;1&#xff09;复数欧拉公式&#xff1a; &#xff08;2&#xff09;复数的极坐标形式&#xff1a; 其中 &#xff08;3&#xff09;T形积木问题利用了复数乘以将该复数值旋转b角的…

Spring源码解析(五):循环依赖

Spring源码系列文章 Spring源码解析(一)&#xff1a;环境搭建 Spring源码解析(二)&#xff1a;bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三)&#xff1a;bean容器的刷新 Spring源码解析(四)&#xff1a;单例bean的创建流程 Spring源码解析(五)&…

Ubuntu 20.04.4 LTS安装Terminator终端(Linux系统推荐)

Terminator终端可以在一个窗口中创建多个终端&#xff0c;并且可以水平、垂直分割&#xff0c;运行ROS时很方便。 sudo apt install terminator这样安装完成后&#xff0c;使用快捷键Ctrl Alt T打开的就是新安装的terminator终端&#xff0c;可以使用以下方法仍然打开ubuntu默…