|
我是老温,一名热爱学习的嵌入式工程师3 P# |# D) w$ ?- a
关注我,一起变得更加优秀!通信协议可以理解两个节点之间为了协同工作实现信息交换,协商一定的规则和约定,例如规定字节序,各个字段类型,使用什么压缩算法或加密算法等。
( {: v. \9 I3 \0 l! |7 Q% V常见的有tcp,udo,http,sip等常见协议。协议有流程规范和编码规范。流程如呼叫流程等信令流程,编码规范规定所有信令和数据如何打包/解包。* J ]$ L' W. \
编码规范就是我们通常所说的编解码,序列化。不光是用在通信工作上,在存储工作上我们也经常用到。
9 ~9 e4 S* n$ x# M如我们经常想把内存中对象存放到磁盘上,就需要对对象进行数据序列化工作。( Q( b& Q9 A" U0 m B
本文采用先循序渐进,先举一个例子,然后不断提出问题-解决完善,这样一个迭代进化的方式,介绍一个协议逐步进化和完善,最后总结。4 W% h" T( i9 ]1 b
看完之后,大家以后在工作就很容易制定和选择自己的编码协议。( l# {3 ?6 I. n8 v0 m
一、紧凑模式本文例子是A和B通信,获取或设置基本资料,一般开发人员第一步就是定义一个协议结构:" l _0 b8 E( C
struct userbase# Q# I; Q, ^" Z* g2 G
{
7 S: @- B4 a' I1 N unsigned short cmd;//1-get, 2-set, 定义一个short,为了扩展更多命令(理想那么丰满)4 v% a: @$ C2 A) z
unsigned char gender; //1 – man , 2-woman, 3 - ??: [) q, G# e7 D. M- K$ Y
char name[8]; //当然这里可以定义为 string name;或len + value 组合,为了叙述方便,就使用简单定长数据
* s9 g' S, W$ Q6 s' Z2 P; E}1 p0 O" g8 n% f F
在这种方式下,A基本不用编码,直接从内存copy出来,再把cmd做一下网络字节序变换,发送给B。B也能解析,一切都很和谐愉快。7 L1 ^6 q4 R7 L5 `7 m
这时候编码结果可以用图表示为(1格一个字节) |
|