应用协议概述
- 在对外提供网络服务时,服务端和客户端需要遵循同一套数据 通讯协议
- 每个系统不一样,提供的服务也不一样,因此每个系统都要有 自己的应用协议
- 流式传输解决粘包和半包问题
一个协议设计案例
具体的代码
协议设计的种类
二进制协议
比如网络通信运输层中的tcp协议,rtsp,rtmp,rtp。
明文的文本协议
比如应用层的http、redis协议。
混合协议(二进制+明文)
很多企业产品都采用这个。
固定边界协议
能够明确得知一个协议报文的长度,这样的协议易于解析,比如tcp协议。
模糊边界协议
无法明确得知一个协议报文的长度,这样的协议解析较为复杂,通常需要通过某些 特定的字节来界定报文是否结束,比如http协议。
https://cloud.tencent.com/developer/article/1038381
redis协议
https://xargin.com/redis-protocal/
协议设计的注意事项
大小端
字节对齐
任何变量,不管是堆变量还是栈变量都对应着操作系统中的一块内存,由于内存对齐的要求程序中
的变量并不是紧凑存储的,例如一个c语言的结构体Test在内存中的布局可能如下图所示。
struct Test
{
char a; char b; int32_t c;
};
结构体操作的变量便宜
协议设计的优劣评判
Netyy中的实现
高效的
快速的打包解包减少对cpu的占用,高数据压缩率降低对网络带宽的占用。
简单的
易于人的理解、程序的解析。
易于扩展的
对可预知的变更,有足够的弹性用于扩展。
容易兼容的
• 向前兼容,对于旧协议发出的报文,能使用新协议进行解析,只是新协议支持的新功能不能使用。
• 向后兼容,对于新协议发出的报文,能使用旧协议进行解析,只是新协议支持的新功能不能使用。
架构师体系
本文摘自 :https://blog.51cto.com/u