揭开 gRPC、RPC 、TCP和UDP 的通信奥秘
差异点
特性 | TCP | UDP | RPC | gRPC | HTTP |
---|---|---|---|---|---|
工作层级 | 传输层 | 传输层 | 应用层 | 应用层 | 应用层 |
传输协议 | 面向连接的传输协议 | 无连接传输协议 | 使用 TCP、HTTP 等协议 | HTTP/2 | HTTP/1.1, HTTP/2 |
序列化格式 | 字节流 | 数据报文 | XML、JSON 或自定义 | Protocol Buffers | JSON 或 XML |
特点 | 可靠的连接传输 | 无连接、快速传输 | 远程调用封装 | 高效、双向流、多语言支持 | 无状态、请求-响应模式 |
使用场景 | 底层可靠数据传输 | 实时多播、视频流传输 | 分布式系统中的服务调用 | 现代微服务架构 | 信息传输 |
简而言之:
-
TCP 是用于低层数据传输的可靠协议,保证数据的完整性和顺序传输。
-
UDP 是一种无连接的传输协议,提供快速的数据传输但不保证可靠性,非常适用于实时通信的场景。
-
RPC 提供了应用层的远程调用封装,使得不同计算机之间的通信就像本地函数调用一样简单。
-
gRPC 是现代化的远程调用框架,结合了 HTTP/2 和 Protocol Buffers,具有高性能、低延迟等特点,非常适合微服务架构中的高效通信。
-
HTTP 是一种无状态的请求-响应协议,用于客户端和服务器之间传输数据,广泛应用于万维网信息交换。
一、TCP
TCP (Transmission Control Protocol) 是一种面向连接的、可靠的传输层协议,广泛用于需要高可靠性的数据传输场景。它工作在 OSI 模型的传输层,为应用程序之间提供可靠的数据流传输。
TCP 的特点
-
可靠性传输:TCP 通过确认和重传机制,确保数据在网络上传输的可靠性和顺序性。
-
三次握手建立连接:在通信开始前,TCP 通过三次握手建立可靠的连接,以确保双方准备就绪。
-
流量控制与拥塞控制:TCP 通过流量控制和拥塞控制,确保网络的稳定性,避免因网络拥堵导致数据丢失。
举个例子:TCP 就像你和朋友传纸条,必须确认对方收到后才能传下一张,而且每张纸条都按顺序编号,避免信息混乱。
TCP 的通信流程图
客户端──> 三次握手请求 ───> 服务器<── 三次握手响应 <─────> 发送数据 ──────><── 确认数据接收 ─────> 四次挥手请求 ──><── 四次挥手响应 <───
TCP 的实际使用场景
-
文件传输:如 FTP(文件传输协议)使用 TCP 来确保文件的完整性,避免数据丢失。
-
网页浏览:HTTP 基于 TCP,用于确保网页请求和响应能够可靠地到达用户。
-
电子邮件传输:SMTP(邮件传输协议)也依赖于 TCP 来确保电子邮件完整、顺序地传输到目的地。
二、UDP:速度至上,无连接的轻量级传输
UDP (User Datagram Protocol) 是一种无连接的传输层协议,它注重速度和效率,不提供数据传输的确认机制,因此不能保证数据的可靠性。UDP 常用于需要快速、实时传输但不需要可靠性的场景。
UDP 的特点
-
无连接传输:UDP 不需要建立连接,可以直接发送数据,因此减少了连接建立和释放的时间开销。
-
快速传输:由于没有重传机制和确认机制,UDP 的传输效率非常高,适用于对速度要求高、对可靠性要求不高的场景。
-
数据报传输:UDP 以数据报的形式发送数据,每个数据报是独立的,彼此之间没有任何依赖关系。
示例:UDP 就像一位快递员,不需要签收确认,直接将包裹丢到你家门口,然后就走了。如果包裹丢失,他也不会返回来补送。
UDP 的通信流程图
客户端──> 直接发送数据报 ───> 服务器
服务器<── 接收数据报(无确认响应) <───
UDP 的实际使用场景
-
视频流传输:如在线直播、视频会议等场景,UDP 被广泛用于音视频数据流的传输,保证了低延迟和流畅性,即使部分数据丢失也不影响整体体验。
-
在线游戏:实时在线游戏需要极低的延迟,UDP 可以提供快速的数据传输,适用于游戏中的实时位置更新和事件传递。
-
物联网(IoT):某些 IoT 设备需要发送简单的状态更新数据,UDP 可以满足轻量和快速的传输需求。
三、RPC:远程过程调用的桥梁
RPC (Remote Procedure Call) 是一种应用层协议,用于实现进程间的通信,使得程序可以调用远程服务器上的函数,就像调用本地函数一样简单。RPC 封装了底层的网络通信,以便开发人员无需关注底层数据传输的细节。
RPC 的特点
-
远程调用抽象:RPC 使得远程服务调用像本地函数调用一样,使得分布式系统中的服务通信更加简单和透明。
-
序列化:RPC 会把你要传给远程的方法的参数打包(序列化),然后通过 网络传输(TCP 或 HTTP) 传输到服务器。服务器处理后再把结果序列化返回。
-
协议独立性:RPC 可以使用 TCP、HTTP 等多种协议进行传输,灵活性较高。
示例:RPC 就像电话订餐,你只需告诉服务员订单信息,服务员会准备好并送到你家,你不需要关心厨房的操作过程。
RPC 的调用流程图
客户端──> 调用远程方法 ──────────> RPC 框架──> 序列化参数 ──────────> 传输到服务器(TCP/HTTP)
服务器<── 反序列化参数并处理逻辑 <───<── 序列化结果并返回 ───────
RPC 的实际使用场景
-
分布式服务调用:RPC 非常适合微服务架构中各个服务之间的调用,比如某个用户服务需要调用订单服务来获取用户订单信息。
-
传统企业系统集成:在企业中,不同的业务系统之间需要交互,可以使用 RPC 让这些系统像调用本地服务一样相互协作。
-
云服务平台:很多云服务提供的 API 是基于 RPC 的,可以简化开发者调用云服务的过程。
Dubbo:RPC 的增强实现
Dubbo 是阿里巴巴开源的一个高性能 RPC 框架,它对传统 RPC 进行了增强,特别适用于微服务架构。Dubbo 提供了服务治理、负载均衡和故障容错等功能,使得服务之间的调用更加可靠和高效。
-
多协议支持:Dubbo 支持多种协议,包括自定义的 Dubbo 协议,能够在不同场景下选择最合适的传输方式。
-
服务注册与发现:通过服务注册中心(如 Zookeeper),Dubbo 可以自动发现并管理服务,使得分布式服务的扩展和管理更加容易。
-
负载均衡:内置多种负载均衡策略(如随机、轮询、最少活跃调用等),有效地分配请求到各个服务实例。
示例:Dubbo 就像是升级版的电话订餐系统,它不仅能帮你订餐,还能在服务员繁忙时自动找到空闲的服务员来接单,保证服务高效且不中断。
Dubbo 的工作流程图
客户端──> 服务注册中心(Zookeeper)获取服务地址──> 调用远程服务(通过 Dubbo 协议)──> 序列化参数并传输到服务器
服务器<── 反序列化参数并处理逻辑<── 序列化结果并返回给客户端
Dubbo 的实际使用场景
-
企业级分布式系统:Dubbo 被广泛应用于大型企业的分布式架构中,适用于有大量服务交互需求的环境,特别是高并发场景。
-
高可用服务调用:利用服务注册中心和负载均衡机制,Dubbo 能确保系统在单个服务节点故障时的持续可用。
-
微服务治理:Dubbo 可以在微服务架构中实现良好的服务治理,包括版本控制、熔断、限流等。
四、gRPC:现代化的高效通信框架
gRPC 是 Google 开发的一种现代化高性能 RPC 框架,基于 HTTP/2 协议并使用 Protocol Buffers 作为序列化机制。gRPC 是为微服务架构设计的,提供了高效、可扩展的远程调用方式。
gRPC 的特点
-
基于 HTTP/2:gRPC 使用 HTTP/2 协议,支持双向流和多路复用,使得通信更加高效,减少了延迟和带宽消耗。
-
高效的序列化机制:gRPC 使用 Protocol Buffers(protobuf)进行数据序列化,比传统的 JSON 和 XML 更加高效,占用更少的网络带宽。
-
跨语言支持:gRPC 支持多种编程语言,适合构建跨平台的分布式系统,极大简化了不同技术栈之间的通信难题。
gRPC 的双向流通信流程图
客户端──> 调用 gRPC 方法 ───> gRPC 框架──> 使用 Protocol Buffers 序列化参数──> 通过 HTTP/2 传输数据包 ───> 服务器<── 服务器处理并返回序列化结果<── HTTP/2 双向流支持多次请求和响应
gRPC 的实际使用场景
-
微服务架构:gRPC 非常适合微服务之间的高效通信,特别是在需要低延迟和高吞吐量的场景中。比如,订单服务和支付服务可以通过 gRPC 高效通信。
-
实时通信:例如,实时视频流、聊天应用等需要双向通信的场景,gRPC 的 HTTP/2 支持双向流,是实现实时数据交换的理想选择。
-
多语言环境下的服务交互:gRPC 支持多种语言,非常适合不同语言实现的服务之间相互通信,比如前端用 JavaScript,而后端用 Go。
-
物联网(IoT):在 IoT 场景中,设备之间的高效通信至关重要,gRPC 可以用于设备和服务器之间高效的数据传输。
五、HTTP:万维网的基石
HTTP (Hypertext Transfer Protocol) 是一种应用层协议,广泛用于客户端和服务器之间的数据传输。HTTP 协议主要用于传输超文本、网页资源以及其他网络服务,通常与 TCP 一起使用,以保证数据传输的可靠性。
HTTP 的特点
-
请求-响应模型:HTTP 采用请求-响应的通信模式,客户端发起请求,服务器返回响应。每次请求和响应都是独立的。
-
无状态性:HTTP 协议是无状态的,服务器不会保留之前请求的状态信息,因此每个请求都是独立的。为了保持状态,需要使用 Cookies 或其他机制。
-
灵活性和扩展性:HTTP 可以传输各种类型的数据,不仅限于文本和网页,还可以传输图片、视频和文件等。
示例:HTTP 就像是向图书馆借书,你需要每次提供借书卡,图书馆不会记住你上一次借了什么书,需要通过你提供的信息来完成服务。
HTTP 的工作流程图
客户端──> 发起 HTTP 请求 ───> 服务器<── 服务器返回 HTTP 响应 <───
HTTP 的实际使用场景
-
网页浏览:HTTP 是万维网的核心协议,浏览器通过 HTTP 向服务器请求网页,服务器返回 HTML 页面给客户端展示。
-
API 调用:RESTful API 基于 HTTP,通过 GET、POST 等方法实现客户端与服务器之间的数据交互。
-
文件下载:HTTP 用于从服务器下载文件,客户端发送请求后,服务器会将文件作为响应返回。
HTTP/2:HTTP/2 是 HTTP 协议的改进版本,支持多路复用、请求优先级和头部压缩,大幅度提升了性能,减少了延迟和带宽使用,是现代化 Web 应用程序中广泛使用的协议。
相关文章:
揭开 gRPC、RPC 、TCP和UDP 的通信奥秘
差异点 特性TCPUDPRPCgRPCHTTP工作层级传输层传输层应用层应用层应用层传输协议面向连接的传输协议无连接传输协议使用 TCP、HTTP 等协议HTTP/2HTTP/1.1, HTTP/2序列化格式字节流数据报文XML、JSON 或自定义Protocol BuffersJSON 或 XML特点可靠的连接传输无连接、快速传输远程…...
使用Web Worker来处理多线程操作,以及如何避免主线程卡顿。
在JavaScript中处理大量数据时,由于JavaScript是单线程的,所有的操作都在主线程上运行,因此处理大量数据可能导致页面卡顿和响应迟缓。为了避免这些问题,可以使用Web Workers来实现多线程操作,允许在后台线程中处理复杂…...

杂谈:业务说的场景金融是什么?
引言:市场格局的转变 在供应短缺的年代,是典型的卖方市场。为了保证稳定供货,买方会提前一段时间下单,也几乎没什么议价能力。卖方只需等着接单就行。 现在很多领域的供应商数量越来越多,而且随着互联网的普及&#…...

在vscode实现用和Chrome开发者工具中相同的快捷键进行面板切换
在Chrome开发者工具中,我们可以用 Ctrl [ 和 Ctrl ] 快捷键来切换面板,用起来很方便。 vscode中默认没有这两个快捷键,我们可以通过配置自定义快捷键来实现相同的功能。 配置方法: 1. 按 Ctrl K, Ctrl S 调出快捷键配置面板。…...
【ESP32+MicroPython】硬件控制基础
ESP32是一款功能强大的微控制器,具有多种硬件接口。本文以“ESP32硬件控制”为主题,逐步介绍GPIO(通用输入输出)、PWM(脉宽调制)、ADC(模数转换)等功能的原理与实现,并结…...

Python学习从0到1 day26 第三阶段 Spark ① 数据输入
要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义: Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据…...
kafka消费者的消费分区策略有哪些,默认是哪个?
Kafka消费者的分区分配策略主要有以下几种,分别决定了如何将多个分区分配给消费者: 1. Range(范围分配) 描述:将分区连续地分配给消费者。每个消费者负责一段连续的分区。如果有多个消费者,那么消费者会按…...
前端常用时间操作汇总
(1)获取中国标准时间: let now new Date(); // Thu Nov 14 2024 17:13:49 GMT0800 (中国标准时间) (2)获取年份: let year now.getFullYear(); // 2024 (3)获取月份&…...

106. UE5 GAS RPG 使用MVVM
MVVM 是 Model-View-ViewModel的缩写,个人理解它和MVC很相似,有区别的地方在于,在MVC里,Controller会服务多个View,而MVVM里,每个View都拥有一个单独的ViewModel,所以ViewModel相当于精简版的Co…...

Elasticsearch中什么是倒排索引?
倒排索引(Inverted Index)是一种索引数据结构,它在信息检索系统中被广泛使用,特别是在全文搜索引擎中。倒排索引允许系统快速检索包含给定单词的文档列表。它是文档内容(如文本)与其存储位置之间的映射&…...
深度学习:AT Decoder 详解
AT Decoder 详解 在序列到序列的模型架构中,自回归解码器(Autoregressive Translator, AT Decoder)是一种核心组件,其设计目标是确保生成的序列在语义和语法上的连贯性与准确性。自回归解码器通过逐步、依赖前一输出来生成新的输…...
pythons工具——图像的随机增强变换(只是变换了图像,可用于分类训练数据的增强)
从文件夹中随机选择一定数量的图像,然后对每个选定的图像进行一次随机的数据增强变换。 import os import random import cv2 import numpy as np from PIL import Image, ImageEnhance, ImageOps# 定义各种数据增强方法 def random_rotate(image, angle_range(-30…...
C++中volatile限定符详解
volatile是 C 和 C 中的一个类型限定符,它用于告诉编译器被修饰的变量具有特殊的属性,编译器在对该变量进行优化时需要特殊对待。以下是volatile限定符的主要作用: 1. 防止优化 内存访问顺序:在多线程环境或者与硬件交互的程序中…...

如何关闭Python解释器
方法1:采用sys.exit(0)正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTART Shell&…...

《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项 《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项套接字可选项和 I/O 缓冲大小套接字多种可选项getsockopt & setsockoptSO_SNDBUF & SO_RCVBUF SO_REUSEADDR发生地址绑定…...
渗透测试---网络基础之HTTP协议与内外网划分
声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人一律不承担一切后果 目录 一、HTTP协议各版本介绍 二、HTTP请求的方…...
15分钟学 Go 第 45 天 : 使用Docker容器
第45天:使用Docker容器 目标 在本节中,我们将深入了解Docker及其基本用法,掌握如何使用Docker容器来简化开发和部署流程。 背景知识 Docker是一个开源平台,用于开发、运输和运行应用程序。它使我们能够使用容器技术将应用程序…...

DriveLM 论文学习
论文链接:https://arxiv.org/pdf/2312.14150 代码链接:https://github.com/OpenDriveLab/DriveLM 解决了什么问题? 当前,自动驾驶方案的性能仍然不足。一个必要条件就是泛化能力,需要模型能处理未经训练的场景或不熟…...

YoloV10改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码
论文介绍 CARAFE模块概述:本文介绍了一种名为CARAFE(Content-Aware ReAssembly of FEatures)的模块,它是一种用于特征上采样的新方法。应用场景:CARAFE模块旨在改进图像处理和计算机视觉任务中的上采样过程࿰…...

光模块基础知识
1. 光模块的封装 光模块是光收发模块的简称,主要根据不同的外型来区分,而在同一外型中,又有着多种规格;在数据通信领域,最常见的光模块(根据外型区分)分别是SFF、GBIC、SFP、和XFP、QSFP 、XEN…...

【网络安全】fastjson原生链分析
fastjson 原生链 前言 说起 fastjson 反序列化,大部分的利用都是从 type 把 json 串解析为 java 对象,在构造方法和 setter、getter 方法中,做一些文件或者命令执行的操作。当然,在 fastjson 的依赖包中,也存在着像 …...
青少年编程与数学 01-011 系统软件简介 08 Windows操作系统
青少年编程与数学 01-011 系统软件简介 08 Windows操作系统 1. Windows操作系统的起源与发展1.1 早期版本(1985-1995)1.2 Windows 9x系列(1995-2000)1.3 Windows NT系列(1993-2001)1.4 Windows XP及以后版…...
学习英语。
1. 先自己翻译一遍(葫芦背书法) 结构 补充修饰 最核心的记忆 然后再修饰 2.意群之间翻译: 1.意群 对于两个意群合起来翻译 方法1就是着重某一 6.或者意群之间 核心词一个介词 于 对于 介词化修饰 3.句子之间关系 主句1 after句子2 那么句…...
Linux 如何移动目录 (文件夹) (内含 Linux 重命名方法)
1-移动单个文件夹(类似于自动剪切和粘贴) 看看以下的例子: (base) schen744mgmt-4:~/code/sparseocc/data/nuScenes-Occupancy$ ls nuScenes-Occupancy-v0.1 nuScenes-Occupancy-v0.1.7z (base) schen744mgmt-4:~/code/sparseocc/data/nuS…...
《视觉SLAM十四讲》自用笔记 第三讲:三维空间刚体运动
第三讲 三维空间刚体运动 3.0 目标 1.理解三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数和欧拉角。 2.掌握 Eigen 库的矩阵、几何模块使用方法。 3.1 旋转矩阵 3.1.1 点和向量,坐标系 三维空间中,刚体的运动可以用两个概念来…...

WEB3全栈开发——面试专业技能点P1Node.js / Web3.js / Ethers.js
一、Node.js 事件循环 Node.js 的事件循环(Event Loop)是其异步编程的核心机制,它使得 Node.js 可以在单线程中实现非阻塞 I/O 操作。 🔁 简要原理 Node.js 是基于 libuv 实现的,它使用事件循环来处理非阻塞操作。事件…...
mybatis的if判断==‘1‘不生效,改成‘1‘.toString()才生效的原因
mybatis的xml文件中的if判断‘1’不生效,改成’1’.toString()才生效 Mapper接口传入的参数 List<Table> queryList(Param("state") String state);xml内容 <where><if test"state ! null and state 1">AND EXISTS(select…...

技巧小结:根据寄存器手册写常用外设的驱动程序
需求:根据STM32F103寄存器手册写DMA模块的驱动程序 一、分析标准库函数的写法: 各个外设的寄存器地址定义在stm32f10x.h文件中:此文件由芯片厂家提供;内核的有关定义则定义在core_cm3.h文件中:ARM提供; 1、查看外设区域多级划分…...
前端(vue)学习笔记(CLASS 7):vuex
vuex概述 vuex是一个vue的状态管理工具,状态就是数据 大白话:vuex是一个插件,可以帮我们管理vue通用的数据(多组件共享的数据) 场景 1、某个状态在很多个组件来使用(个人信息) 2、多个组件…...

分享两个日常办公软件:uTools、PixPin
1. uTools 网址:https://u.tools/ 这是一个高效智能的在线工具平台。 特点: 专为提升用户的工作效率跟生活便利性设计。 优点: 1:由国内团队开发。 2:通过插件化的方式为用户提供多样化的功能支持。 3…...