【重复造轮子系列】手撸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数据。

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

相关推荐
sone121384 分钟前
计算机网络(第8版)第四章 网络层(4.7.1~4.7.3)
服务器·网络·计算机网络
m0_748238271 小时前
WebClient HTTP 请求问题处理模板(泛型响应、忽略 SSL 证书等)
网络协议·http·ssl
0zxm1 小时前
06 - Django 视图view
网络·后端·python·django
轩辰~2 小时前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
燕雀安知鸿鹄之志哉.2 小时前
攻防世界 web ics-06
网络·经验分享·安全·web安全·网络安全
ProcessOn官方账号3 小时前
如何绘制网络拓扑图?附详细分类解说和用户案例!
网络·职场和发展·流程图·拓扑学
Ven%3 小时前
如何在防火墙上指定ip访问服务器上任何端口呢
linux·服务器·网络·深度学习·tcp/ip
神的孩子都在歌唱4 小时前
TCP/IP 模型中,网络层对 IP 地址的分配与路由选择
网络·tcp/ip·智能路由器
阿雄不会写代码4 小时前
ubuntu安装nginx
linux·服务器·网络
starstarzz4 小时前
计算机网络实验四:Cisco交换机配置VLAN
网络·计算机网络·智能路由器·vlan·虚拟局域网