揭开 gRPC、RPC 、TCP和UDP 的通信奥秘

差异点

特性TCPUDPRPCgRPCHTTP
工作层级传输层传输层应用层应用层应用层
传输协议面向连接的传输协议无连接传输协议使用 TCP、HTTP 等协议HTTP/2HTTP/1.1, HTTP/2
序列化格式字节流数据报文XML、JSON 或自定义Protocol BuffersJSON 或 XML
特点可靠的连接传输无连接、快速传输远程调用封装高效、双向流、多语言支持无状态、请求-响应模式
使用场景底层可靠数据传输实时多播、视频流传输分布式系统中的服务调用现代微服务架构信息传输

简而言之:

  • TCP 是用于低层数据传输的可靠协议,保证数据的完整性和顺序传输。

  • UDP 是一种无连接的传输协议,提供快速的数据传输但不保证可靠性,非常适用于实时通信的场景。

  • RPC 提供了应用层的远程调用封装,使得不同计算机之间的通信就像本地函数调用一样简单。

  • gRPC 是现代化的远程调用框架,结合了 HTTP/2 和 Protocol Buffers,具有高性能、低延迟等特点,非常适合微服务架构中的高效通信。

  • HTTP 是一种无状态的请求-响应协议,用于客户端和服务器之间传输数据,广泛应用于万维网信息交换。

一、TCP

TCP (Transmission Control Protocol) 是一种面向连接的、可靠的传输层协议,广泛用于需要高可靠性的数据传输场景。它工作在 OSI 模型的传输层,为应用程序之间提供可靠的数据流传输。

TCP 的特点

  1. 可靠性传输:TCP 通过确认和重传机制,确保数据在网络上传输的可靠性和顺序性。

  2. 三次握手建立连接:在通信开始前,TCP 通过三次握手建立可靠的连接,以确保双方准备就绪。

  3. 流量控制与拥塞控制:TCP 通过流量控制和拥塞控制,确保网络的稳定性,避免因网络拥堵导致数据丢失。

举个例子:TCP 就像你和朋友传纸条,必须确认对方收到后才能传下一张,而且每张纸条都按顺序编号,避免信息混乱。

TCP 的通信流程图

客户端──> 三次握手请求 ───> 服务器<── 三次握手响应 <─────> 发送数据 ──────><── 确认数据接收 ─────> 四次挥手请求 ──><── 四次挥手响应 <───

TCP 的实际使用场景

  1. 文件传输:如 FTP(文件传输协议)使用 TCP 来确保文件的完整性,避免数据丢失。

  2. 网页浏览:HTTP 基于 TCP,用于确保网页请求和响应能够可靠地到达用户。

  3. 电子邮件传输:SMTP(邮件传输协议)也依赖于 TCP 来确保电子邮件完整、顺序地传输到目的地。

二、UDP:速度至上,无连接的轻量级传输

UDP (User Datagram Protocol) 是一种无连接的传输层协议,它注重速度和效率,不提供数据传输的确认机制,因此不能保证数据的可靠性。UDP 常用于需要快速、实时传输但不需要可靠性的场景。

UDP 的特点

  1. 无连接传输:UDP 不需要建立连接,可以直接发送数据,因此减少了连接建立和释放的时间开销。

  2. 快速传输:由于没有重传机制和确认机制,UDP 的传输效率非常高,适用于对速度要求高、对可靠性要求不高的场景。

  3. 数据报传输:UDP 以数据报的形式发送数据,每个数据报是独立的,彼此之间没有任何依赖关系。

示例:UDP 就像一位快递员,不需要签收确认,直接将包裹丢到你家门口,然后就走了。如果包裹丢失,他也不会返回来补送。

UDP 的通信流程图

客户端──> 直接发送数据报 ───> 服务器
服务器<── 接收数据报(无确认响应) <───

UDP 的实际使用场景

  1. 视频流传输:如在线直播、视频会议等场景,UDP 被广泛用于音视频数据流的传输,保证了低延迟和流畅性,即使部分数据丢失也不影响整体体验。

  2. 在线游戏:实时在线游戏需要极低的延迟,UDP 可以提供快速的数据传输,适用于游戏中的实时位置更新和事件传递。

  3. 物联网(IoT):某些 IoT 设备需要发送简单的状态更新数据,UDP 可以满足轻量和快速的传输需求。

三、RPC:远程过程调用的桥梁

RPC (Remote Procedure Call) 是一种应用层协议,用于实现进程间的通信,使得程序可以调用远程服务器上的函数,就像调用本地函数一样简单。RPC 封装了底层的网络通信,以便开发人员无需关注底层数据传输的细节。

RPC 的特点

  1. 远程调用抽象:RPC 使得远程服务调用像本地函数调用一样,使得分布式系统中的服务通信更加简单和透明。

  2. 序列化:RPC 会把你要传给远程的方法的参数打包(序列化),然后通过 网络传输(TCP 或 HTTP) 传输到服务器。服务器处理后再把结果序列化返回。

  3. 协议独立性:RPC 可以使用 TCP、HTTP 等多种协议进行传输,灵活性较高。

示例:RPC 就像电话订餐,你只需告诉服务员订单信息,服务员会准备好并送到你家,你不需要关心厨房的操作过程。

RPC 的调用流程图

客户端──> 调用远程方法 ──────────> RPC 框架──> 序列化参数 ──────────> 传输到服务器(TCP/HTTP)
服务器<── 反序列化参数并处理逻辑 <───<── 序列化结果并返回 ───────

RPC 的实际使用场景

  1. 分布式服务调用:RPC 非常适合微服务架构中各个服务之间的调用,比如某个用户服务需要调用订单服务来获取用户订单信息。

  2. 传统企业系统集成:在企业中,不同的业务系统之间需要交互,可以使用 RPC 让这些系统像调用本地服务一样相互协作。

  3. 云服务平台:很多云服务提供的 API 是基于 RPC 的,可以简化开发者调用云服务的过程。

Dubbo:RPC 的增强实现

Dubbo 是阿里巴巴开源的一个高性能 RPC 框架,它对传统 RPC 进行了增强,特别适用于微服务架构。Dubbo 提供了服务治理、负载均衡和故障容错等功能,使得服务之间的调用更加可靠和高效。

  • 多协议支持:Dubbo 支持多种协议,包括自定义的 Dubbo 协议,能够在不同场景下选择最合适的传输方式。

  • 服务注册与发现:通过服务注册中心(如 Zookeeper),Dubbo 可以自动发现并管理服务,使得分布式服务的扩展和管理更加容易。

  • 负载均衡:内置多种负载均衡策略(如随机、轮询、最少活跃调用等),有效地分配请求到各个服务实例。

示例:Dubbo 就像是升级版的电话订餐系统,它不仅能帮你订餐,还能在服务员繁忙时自动找到空闲的服务员来接单,保证服务高效且不中断。

Dubbo 的工作流程图

客户端──> 服务注册中心(Zookeeper)获取服务地址──> 调用远程服务(通过 Dubbo 协议)──> 序列化参数并传输到服务器
服务器<── 反序列化参数并处理逻辑<── 序列化结果并返回给客户端

Dubbo 的实际使用场景

  1. 企业级分布式系统:Dubbo 被广泛应用于大型企业的分布式架构中,适用于有大量服务交互需求的环境,特别是高并发场景。

  2. 高可用服务调用:利用服务注册中心和负载均衡机制,Dubbo 能确保系统在单个服务节点故障时的持续可用。

  3. 微服务治理:Dubbo 可以在微服务架构中实现良好的服务治理,包括版本控制、熔断、限流等。

四、gRPC:现代化的高效通信框架

gRPC 是 Google 开发的一种现代化高性能 RPC 框架,基于 HTTP/2 协议并使用 Protocol Buffers 作为序列化机制。gRPC 是为微服务架构设计的,提供了高效、可扩展的远程调用方式。

gRPC 的特点

  1. 基于 HTTP/2:gRPC 使用 HTTP/2 协议,支持双向流和多路复用,使得通信更加高效,减少了延迟和带宽消耗。

  2. 高效的序列化机制:gRPC 使用 Protocol Buffers(protobuf)进行数据序列化,比传统的 JSON 和 XML 更加高效,占用更少的网络带宽。

  3. 跨语言支持:gRPC 支持多种编程语言,适合构建跨平台的分布式系统,极大简化了不同技术栈之间的通信难题。

gRPC 的双向流通信流程图

客户端──> 调用 gRPC 方法 ───> gRPC 框架──> 使用 Protocol Buffers 序列化参数──> 通过 HTTP/2 传输数据包 ───> 服务器<── 服务器处理并返回序列化结果<── HTTP/2 双向流支持多次请求和响应

gRPC 的实际使用场景

  1. 微服务架构:gRPC 非常适合微服务之间的高效通信,特别是在需要低延迟和高吞吐量的场景中。比如,订单服务和支付服务可以通过 gRPC 高效通信。

  2. 实时通信:例如,实时视频流、聊天应用等需要双向通信的场景,gRPC 的 HTTP/2 支持双向流,是实现实时数据交换的理想选择。

  3. 多语言环境下的服务交互:gRPC 支持多种语言,非常适合不同语言实现的服务之间相互通信,比如前端用 JavaScript,而后端用 Go。

  4. 物联网(IoT):在 IoT 场景中,设备之间的高效通信至关重要,gRPC 可以用于设备和服务器之间高效的数据传输。

五、HTTP:万维网的基石

HTTP (Hypertext Transfer Protocol) 是一种应用层协议,广泛用于客户端和服务器之间的数据传输。HTTP 协议主要用于传输超文本、网页资源以及其他网络服务,通常与 TCP 一起使用,以保证数据传输的可靠性。

HTTP 的特点

  1. 请求-响应模型:HTTP 采用请求-响应的通信模式,客户端发起请求,服务器返回响应。每次请求和响应都是独立的。

  2. 无状态性:HTTP 协议是无状态的,服务器不会保留之前请求的状态信息,因此每个请求都是独立的。为了保持状态,需要使用 Cookies 或其他机制。

  3. 灵活性和扩展性:HTTP 可以传输各种类型的数据,不仅限于文本和网页,还可以传输图片、视频和文件等。

示例:HTTP 就像是向图书馆借书,你需要每次提供借书卡,图书馆不会记住你上一次借了什么书,需要通过你提供的信息来完成服务。

HTTP 的工作流程图

客户端──> 发起 HTTP 请求 ───> 服务器<── 服务器返回 HTTP 响应 <───

HTTP 的实际使用场景

  1. 网页浏览:HTTP 是万维网的核心协议,浏览器通过 HTTP 向服务器请求网页,服务器返回 HTML 页面给客户端展示。

  2. API 调用:RESTful API 基于 HTTP,通过 GET、POST 等方法实现客户端与服务器之间的数据交互。

  3. 文件下载:HTTP 用于从服务器下载文件,客户端发送请求后,服务器会将文件作为响应返回。

HTTP/2:HTTP/2 是 HTTP 协议的改进版本,支持多路复用、请求优先级和头部压缩,大幅度提升了性能,减少了延迟和带宽使用,是现代化 Web 应用程序中广泛使用的协议。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文了解 Tableau 2024.3 如何展现已发布数据源的数据模型

通过减少数据源的重复建设&#xff0c;提高数据透明度&#xff0c;可组合数据源将为企业带来更高的数据利用效率 在 TC24 用户大会上&#xff0c;Tableau 产品团队提出了一个非常重要的功能概念——可组合的数据源。这意味着你将很快能够对 Tableau 已发布的数据源进行连接、关…

Unity 网格模型及优化

一个模型中可以包含很多网格&#xff0c;一个模型可以由多个网格组成。在Unity3D中一个网格可以由多个子网格&#xff08;Sub-Mesh)组成。 在渲染引擎的时候&#xff0c;每个子网格都要匹配一个材质球来做渲染&#xff0c;实际上一个子网格本身就是一个个普通的模型&#xff0…

第四十三章 Vue之mapMutations简化mutations操作

目录 一、引言 二、完整代码 2.1. App.vue 2.2. main.js 2.3. Son1.vue 2.4. Son2.vue 2.5. index.js 一、引言 本章节我们通过掌握辅助函数mapMutations&#xff0c;来简化前面章节中调用mutations函数的繁琐方式。mapMutations 和 mapState很像&#xff0c;它是把位于…

【论文复现】ChatGPT多模态命名实体识别

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ChatGPT ChatGPT辅助细化知识增强&#xff01;1. 研究背景2. 模型结构和代码3. 任务流程第一阶段&#xff1a;辅助精炼知识启发式生成第二阶段…

echarts-gl 3D柱状图配置

1. 源码 此demo可以直接在echarts的编辑器中运行 option {title: {text: 产量图,textStyle: {color: rgba(255, 255, 255, 1),fontSize: 17},left: center},tooltip: {},legend: {show: false,orient: vertical,x: left,top: 0,right: 20,textStyle: {fontSize: 12}},visualM…

c语言数据结构与算法--简单实现栈和队列的出栈与入栈

&#xff08;一&#xff09;栈的基本概念 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表&#xff0c;如铁路调度。如下 图&#xff1a; &#xff08;二&#xff09;栈的的表现形式 栈有两种表示形式&#xff1a;栈的表示和实现、栈的 链式表示。 1&#xff0e;栈的表示…

人工智能(AI)和机器学习(ML)技术学习流程

目录 人工智能(AI)和机器学习(ML)技术 自然语言处理(NLP): Word2Vec: Seq2Seq(Sequence-to-Sequence): Transformer: 范式、架构和自注意力: 多头注意力: 预训练、微调、提示工程和模型压缩: 上下文学习、思维链、全量微调、量化、剪枝: 思维树、思维…

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器&#xff0c;就像数组一样&#xff0c;vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效&#xff0c;但是它的大小是动态可变的&#xff0c;并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验

PC作为人们学习、办公、娱乐的重要工具&#xff0c;已经深度融入我们的工作和生活。随着物联网技术的快速发展&#xff0c;以及人们对PC性能要求的逐步提高&#xff0c;AI PC成为了行业发展的重要趋势。 11月7-8日&#xff0c;骁龙AI PC生态科技日在深圳举办。作为高通骁龙的重…

AIGC专栏17——EasyAnimate V5版本详解 应用MMDIT结构,拓展模型规模到12B 支持不同控制输入的控制模型

AIGC专栏17——EasyAnimate V5版本详解 应用MMDIT结构&#xff0c;拓展模型规模到12B 支持不同控制输入的控制模型 学习前言相关地址汇总源码下载地址HF测试链接 测试效果Image to VideoText to Video EasyAnimate详解技术储备Diffusion Transformer (DiT)Stable Diffusion 3Co…

Android Studio | 最新版本配置要求高,JDK运行环境不适配,导致无法启动App

Android Studio 的最新版本配置要求比较高&#xff0c;这时候需要降低插件的版本&#xff0c;才能正常启动项目 build.gradle 文件的 dependencies 部分中&#xff0c;使用 libs 作为一些常用库的别名。这些别名在项目的 gradle.properties 文件或者某个特定的 versions.prope…

ssm093基于Java Web的毕业生就业状况管理系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;毕业生就业状况管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业生就业…

el-dialog 设置 水平垂直居中 高度不固定

小记一下&#xff1a; 希望实现不管内容高度多少 el-dialog都能水平垂直居中 效果&#xff1a; css: .form-view-dialog{display: flex;align-items: center;justify-content: center;.el-dialog{margin: 0 auto; }.el-dialog__body{max-height: 75vh; // 可选择 设置一个最…

当AI遇上时尚:未来的衣橱会由机器人来打理吗?

内容概要 在当今这个快速发展的时代&#xff0c;人工智能与时尚的结合正在逐渐改写我们对衣橱管理的认知。传统的衣橱管理常常面临着空间不足、穿搭单调及库存过多等挑战&#xff0c;许多人在挑选服饰时难以做出决策。然而&#xff0c;随着技术的进步&#xff0c;智能推荐和自…

Ubuntu 20.04安装CUDA 11.0、cuDNN 8.0.5

不知道咋弄的ubuntu20.04电脑的cuda驱动丢了&#xff0c;无奈需装PyTorch环境&#xff0c;只有CUDA11.0以上版本才支持Ubuntu20.04&#xff0c;所以安装了CUDA11.0、cuDNN8.0.5 为防止频繁在浏览器检索对应的贴子&#xff0c;今天记录一下。 一. 驱动安装 为防止驱动安装后没…

高德地图通过经纬度查找位置和轨迹回放

1、完整代码自己高德申请key,其他文章有写的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title><…

C++常用的特性-->day05

友元的拓展语法 声明一个类为另外一个类的友元时&#xff0c;不再需要使用class关键字&#xff0c;并且还可以使用类的别名&#xff08;使用 typedef 或者 using 定义&#xff09;。 #include <iostream> using namespace std;// 类声明 class Tom; // 定义别名 using …

使用docker形式部署jumpserver

文章目录 前言一、背景二、使用步骤1.基础环境准备2.拉取镜像3.进行部署4.备份记录启动命令 前言 记录一下使用docker形式部署jumpserver服务的 一、背景 搭建一个jumpserver的堡垒机&#xff0c;但是发现之前是二进制文件部署的&#xff0c;会在物理机上部署污染环境&#x…

产品经理如何使用项目管理软件推进复杂项目按时上线

前言 相信很多产品同学或多或少都有过这样的经历&#xff1a;平时没有听到任何项目延期风险&#xff0c;但到了计划时间却迟迟无法提测……评审时没有任何argue&#xff0c;提测后发现开发的功能不是自己想要的……费劲九牛二虎之力终于让项目上线了&#xff0c;然而发现成果达…

贪心算法-汽车加油

这道题目描述了一个汽车旅行场景&#xff0c;需要设计一个有效的算法来决定在哪几个加油站停车加油&#xff0c;以便最小化加油次数。题目给出了汽车加满油后的行驶距离n公里&#xff0c;以及沿途若干个加油站的位置。我们需要找出一个方案&#xff0c;使得汽车能够完成整个旅程…