【重复造轮子系列】手撸RPC(四):通信协议

一、前文回顾

在上一篇文章中我们简单完成了服务的注册,成功的将服务端暴露的接口添加到注册中心上了,而且也客户端和服务端已经可以进行最基本的通信,接下来要做的就是要定义好通信协议。

二、通信协议

通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。

简单的来说通信协议就是通信双方约定的一种形式,例如我发送0001表示Hello,则对方收到0001的时候就知道我发送的Hello。我们的RPC当然也需要通信协议(当然直接使用Http也是可以的)

在网络通信中,服务端和客户端之间是通过发送数据包来进行通信,所以协议就是规定要发送的数据包是什么样子的。参考Http请求,Http请求就大体分为请求头和请求体两部分,那我们自定义的协议也可以这么做。那么接下来要讨论的就是如何设计这个数据包了。

1、请求头

通常我们会把一些描述信息放在请求头里(例如Http请求头中会记录application-content),所以我们也这么做,同时也参考一下Dubbo的实现。

1、魔术值:前4个字节我们放魔术值,。

2、版本号:我们再拿1个字节来标记协议的版本。

3、头部长度:2个字节来表示头部长度

4、总长度:4个字节来表示总长度(头部长度+请求体长度)

5、请求类型、序列化方式、压缩方式:各1个字节

6、请求ID:8个字节

说明:所谓魔术值就是一段自定义的数据用于标记当前协议。客户端和服务端之间通过对比魔术值来判断是否为相同的协议;版本号就是用来标记版本的(协议版本);请求类型:用于区分是否为心跳请求(这里先按下不表,之后的文章再细讲);这里比较重要的是头部长度 和总长度 ,为什么需要这几个字段呢?这就涉及到TCP的粘包/拆包问题了,具体可以参考这里https://zhuanlan.zhihu.com/p/609934467,所以我们需要把包的长度提前定义好,这样就可以避免上述问题。

2、请求体

请求体就比较简单了,就是一大段byte数据。

综上我们自定义的协议如上图所示,下一篇文章我们会整理一下代码,然后开始实际的开发,希望对你有所帮助。

相关推荐
网络小江3 小时前
组网第十课:编码、速率与排障——从比特到信号的最后一公里
网络协议
网络小江3 小时前
上网第四十三课:路由原理——数据包是怎么找到路的
网络协议
盟接之桥6 小时前
当大模型遇见线束制造:不是通用AI,而是行业AI
大数据·网络·人工智能·安全·制造
91刘仁德7 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
硅基手札8 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
可乐鸡翅yeah_8 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
酣大智10 小时前
H3C MSR3600 交换机配置 SSH
网络·ssh·智能路由器
沐浴露z10 小时前
Agent 响应延迟过高?从工具治理角度提供两条思路
前端·网络
马六六i11 小时前
市面上正规的IP驱动产业新场景新工具有哪些
大数据·网络·python·tcp/ip
网络小江12 小时前
上网第四十二课:第六周复盘——协议篇快问快答
网络协议