文档章节

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

杭城小刘
?杭城小刘
发布于 昨天 16:50
字数 1124
阅读 184
收藏 2

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

1. 协议

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

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 字符串

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

  • 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 的数据

? 着作权归作者所有

杭城小刘

杭城小刘

粉丝 36
博文 122
码字总数 104409
作品 0
杭州
iOS工程师
私信 提问
有http 请求,为什么还要用rpc调用?

链接:https://www.zhihu.com/question/41609070/answer/191965937 来源:知乎 着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Content-Type: text/plainContent-Le...

u010325193
2018/05/06
0
0
HTTPS, SPDY和 HTTP/2性能的简单对比

中文原文:HTTPS, SPDY和 HTTP/2性能的简单对比 整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 请尊重版权,转载请注明来源,谢谢! Firefox 35这周发布了,成为第一个...

天马行空的鱼
2016/03/21
59
0
HTTPS、SPDY、HTTP/2 对比

整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 Firefox 35,成为第一个默认开启支持HTTP/2协议的浏览器。Chrome也支持了,只是以SPDY 4的名义,并且要自己在里面手动开...

Candy_Desire
2015/12/30
286
0
HTTP请求和响应格式详细解析

引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTT...

lightUp
2015/09/08
525
0
HTTP协议详解 (转)

引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTT...

esmond
2013/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

快速排序例子

package helloclean.basetest;import java.util.Scanner;public class QuickSortTest { int[] a = new int[101]; int n; public void quickSort(int left, int righ......

clean123
30分钟前
6
0
小程序的一个tab切换

tab-hd01

前端老手
38分钟前
7
0

十二句你应该掌握的英语口语表达,让你不再和老外尬聊,建议收藏

英语中的"俚语"就如同我们日常生活中常用的"非正式口语"一样,虽然光看单词你可以了解他的字面意思,但是如果套用到日常用语中,就很难让人理解。所以要想和老外流畅的交流,你必须要掌握这些...

翻译君
今天
6
0
Android 自定义scheme及多端唤起使用方法

前言 DeepLink,深度链接技术,类似于web开发领域不仅仅是通过链接打开一个界面,而是打开界面的某个具体内容。常用于web端唤起app时,传递参数直接打开确定的界面,如通过京东的分享出去的商...

所谓向日葵族
今天
5
0
云南如今的人证核验访客多用在商业,为什么?

如今的人证核验多用于商业,这是为何?因为它的场合应用不可思议—— 伴随技术的发展,又一个新的名词与人脸识别在了一起,那就是“检测”,随着人脸识别技术的广泛商用,逐渐形成了自动识别...

非思丸智能
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部