自定义报头协议可能没那么难

在学习过计算机网络的课程,咱们知道刚开始计算机都是单独脱机工做的,没有联网的状况下计算机的信息共享能力、运算能力都很是有限,后来诞生了计算机网络.有了就是那几网络,计算机 A 的信息和数据能够经过网络传递到计算机 B,一样计算机 A 能够获取到来自计算机 B 的数据. 可是不一样计算机之间交换数据的时候就要经过网络来传输了.传输的过程当中须要不一样的计算机都遵循必定的规则来组装数据、传递信息,那么这样的规则就叫作协议.git

1. 协议

计算机网络中有很是多协议,这些协议位于 OSI 的不一样层中,好比 TCP/IP、UDP、SMTP、FTP 等. 协议之因此称为协议,是由于它具备约束效应,信息在端到端的传输过程当中,同等层次之间经过使用一样的协议规则,这样发送方在该层次按照协议约定处理数据,接收方在该层次按照协议约定解析数据.成对存在.github

OSI七层模型 TCP协议

2. 自定义协议

在平常开发的时候处于某些缘由可能须要自定义报文协议.这个协议是创建在 TCP 链接的基础上,好比,移动端在作 APM 的时候将功能拆分为2个模块,一个是 APM 监控模块、一个为了方即可拓展单独作了一个数据上报组件,具备动态下发上报策略的配置.网络

因此上报组件这里涉及到和服务端高效通讯,因此客户端和服务端约定了一套自定义的报文协议,以下所示.学习

  • PACKET 总体结构 | HEAD | META | BATCH_PAYLOAD |编码

  • PACKET::HEAD 结构加密

    | META_SIZE (2bytes unsigned int) | BATCH_COUNT (1 bytes unsigned int) | PAYLOAD_SIZE (4bytes unsigned int) | PAYLOAD_SIZE (4bytes unsigned int) | ... |计算机网络

  • PACKET::META 结构设计

    换行符分割的 JSON 字符串3d

    crypto(deflate(JSON\nJSON...))code

  • PACKET::BATCH_PAYLOAD 结构

    JSON 体里每一个字段的值都是 BASE64 编码的

    crypto(deflate(JSON) | crypto(deflate(JSON) | ...

其实计算机网络过程当中传输的就是二进制数据,因此拿 iOS 举例来讲,咱们自定义报文协议的目的就是按照协议的约定,自定义组装好一个 NSData 的数据,报文里面的头规定了各类信息的组装格式.

  • HEAD 里面须要携带3个信息. 信息1:meta 的 size 信息,并且协议规定了必须使用 2byte 的 unsigned int 数据类型. 信息2: payload 报文的个数,必须使用 1byte 的 unsigned int 数据类型. 信息3:每一个报文的大小,必须使用 4byte 的 unsigned int 数据类型.
  • META 里面须要携带1个信息. 将多条元数据用 "\n" 换行符拼接,另外拼接完的总体数据先压缩再加密
  • PAYLOAD 里面将每条数据先压缩,而后总体再加密

因此核心就上面的3点,一点都不难,只不过第一次作的时候可能会踩坑.列觉以下

  • 协议明确规定了该采用什么样的数据类型,另外数据大小作了明确限制,若是你不这么作,服务端按照字节长度去解析数据就会出错,相应的客户端接口的返回结果就是失败.自讨苦吃
  • 设计到数据的处理,就应该注意字节序的问题,好比 iOS 采用的小端序,网络规定数据传输使用大端序,假如你不知道这个问题,那么你极可能接口调用失败,因此你须要将你的数据转换为大端序的数据,关于大小端序的问题能够查看个人这篇文章

Objective-C 语言中处理 unsigned int 的数据,因此你须要直接操做 unsign short 到 NSData, NSData 的接口很方便, [NSData dataWithBytes:&metaLength length:sizeof(metaLength)]] 就能够处理成 2byte 的 unsigned int 的数据

相关文章
相关标签/搜索