文档章节

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

杭城小刘
?杭城小刘
发布于 前天 16:50
字数 1124
阅读 194
收藏 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
60
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
287
0
HTTP请求和响应格式详细解析

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

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

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

esmond
2013/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

HTTP请求工具类:HttpUtil.java

HTTP请求工具类: package util;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Out......

被毒打的程序猿_先瑞
今天
4
0
Mysql系列(四)—— InnoDB的行格式

写在前面 本文涉及知识主要学习自作者小孩子的掘金专栏: 一、InnoDb中的页 我们知道,要处理数据,必须先把数据放到内存中来,那么Mysql读写记录时,是怎么读写的勒?Mysql是将数据划分为若...

陈年之后是青葱
今天
9
0
漫谈 GOF 设计模式在 Spring 框架中的实现

原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」。一群同频者,一起成长,一起精进,打破认知的局限性。 漫谈 GOF 设计模式在 Spring 框架中的实现...

梁桂钊
今天
6
0
Spring Cloud Gateway 和 OAuth2 不兼容的问题

问题版本 Spring Cloud 版本 : Finchley.RELEASE Oauth2 版本 : 2.0.0.RELEASE Spring 版本 : 5.0.7.RELEASE 错误描述 在 Spring Cloud Gateway 与 OAuth2 的整合过程中遇到启动错误 如下: 2...

小贼贼子
今天
8
0
Spring 中使用 @Scheduled 创建定时任务

一、定时任务触发条件 1、在 Application 启动类上添加:@EnableScheduling 2、含定时方法的类上添加注解:@Component,该注解将定时任务类纳入 spring bean 管理。 3、在定时方法上写上:@...

CREATE_17
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部