大家好,欢迎来到IT知识分享网。
一、紧凑模式
本文例子是A和B通信,获取或设置基本资料,一般开发人员第一步就是定义一个协议结构:
struct userbase { unsigned short cmd;//1-get, 2-set, 定义一个short,为了扩展更多命令(理想那么丰满) unsigned char gender; //1 – man , 2-woman, 3 - ?? char name[8]; //当然这里可以定义为 string name;或len + value 组合,为了叙述方便,就使用简单定长数据 }
struct userbase { unsigned short cmd; unsigned char gender; unsigned int birthday;//new char name[8]; }
这是B就犯愁了,收到A的数据包,不知道第3个字段到底是旧协议中的name字段,还是新协议中birthday。这是后A,和B终于从教训中认识到一个协议重要特性——兼容性和可扩展性。
于是乎,A和B决定废掉旧的协议,从新开始,制定一个以后每个版本兼容的协议。方法很简单,就是加一个version字段。
struct userbase { unsigned short version;//new unsigned short cmd; unsigned char gender; unsigned int birthday; char name[8]; }
这样,A和B就松一口气,以后就可以很方便的扩展。增加字段也很方便。这种方法即使在现在,应该还有不少人使用。
三、更好的可扩展性
struct userbase { unsigned short version; unsigned short cmd; unsigned char gender; unsigned int birthday; char name[8]; }
制定完这些协议后,A和B很得意,觉得这个协议不错,可以自由的增加和减少字段。随便扩展。
现实总是很残酷的,不久就有新的需求,name使用8个字节不够,最大长度可能会达到100个字节,A和B就愁怀了,总不能即使叫“steven”的人,每次都按照100个字节打包,虽然不差钱,也不能这样浪费。
于是A和B寻找各方资料,找到了ANS.1编码规范,好东西啊… ASN.1是一种ISO/ITU-T 标准。其中一种编码BER(Basic Encoding Rules)简单好用,它使用三元组编码,简称TLV编码。
每个字段编码后内存组织如下:
字段可以是结构,即可以嵌套
A和B使用TLV打包协议后,数据内存组织大概如下:
TLV具备了很好可扩展性,很简单易学。同时也具备了缺点,因为其增加了2个额外的冗余信息,tag 和len,特别是如果协议大部分是基本数据类型int ,short, byte. 会浪费几倍存储空间。另外Value具体是什么含义,需要通信双方事先得到描述文档,即TLV不具备结构化和自解释特性。
四、自解释性
当A和B采用TLV协议后,似乎问题都解决了。但是还是觉得不是很完美,决定增加自解释特性,这样抓包就能知道各个字段类型,不用看协议描述文档。这种改进的类型就是 TT[L]V(tag,type,length,value),其中L在type是定长的基本数据类型如int,short, long, byte时候,因为其长度是已知的,所以L不需要。
原文链接:https://www.jianshu.com/p/fbf14d
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/117815.html



