写点什么

极光笔记|基于 CMPP 协议集成短信测试桩全流程实践分享

作者:极光开发者
  • 2021 年 12 月 10 日
  • 本文字数:1934 字

    阅读完需:约 6 分钟

极光笔记|基于CMPP协议集成短信测试桩全流程实践分享

前言:

极光短信属于极光推送的一块业务,极光短信最大的优势是针对推送消息未送达的用户进行补发短信,既保证消息触达又节省成本,以及认证短信或者其他业务场景都需要用到短信功能。

极光短信业务最底层是真实对对接运营商,使用的 cmpp 协议发送短信,而在测试环境中, 不可能对真实环境来验证短信功能,原因:

1.测试需要发送大量的短信,费用会很高

2.需要模拟各种异常的消息 ,真实运营商有很多规则才能触发异常

3.需要对运营商快速返回各种错误,真实运营商可能会延迟,不利于测试

4.还需要针对大量数据时进行限速设置等各种场景

所以针对以上 4 点的考虑,最终我们选择自己“创建”一个运营商来处理数据客户端发来的数据,满足日常的短信业务测试

在模拟之前,我们需要对运营商使用的底层协议,交互方式,数据处理方式进行确认,才能更好的建立一个自己的“运营商”。

 

术语解释


1.认识 cmpp 协议

1.1 网络结构


如图 1 所示,互联网短信网关(ISMG)是外部信息资源站实体(SP)与移动网内短信中心之间的中介实体,互联网短信网关一方面负责接收 SP 发送给移动用户的信息和提交给短信中心。另一方面,移动用户点播 SP 业务的信息将由短信中心通过互联网短信网关发给 SP。

 

1.2 CMPP 功能概述

以下内容来自 cmpp2.0 文档的的介绍

短信接收(Short Message Mobile Terminated,SM MT) 典型的业务操作举例如图 3 所示:


图 3 需要前转的 MT 示意图

 

1.SP 发出数据请求(可能是短信通知或手机铃声等),被源 ISMG 接收;

2.源 ISMG 对接收到的信息返回响应;

3.源 ISMG 在本地数据库中找不到手机号段所对应网关代码,向 GNS(汇接网关)发路由请求信息;

4.汇接网关将路由信息返回;

5.源 ISMG 根据路由信息将请求转给目的 ISMG;

6.目的 ISMG 对接收到的信息返回响应;

7.目的 ISMG 将请求信息发送至 SMC;

8.SMC 向目的 ISMG 返回响应;

 

2.协议栈

CMPP 协议以 TCP/IP 作为底层通信承载,具体结构由图 2 所示:


图 2.1CMPP 协议栈

ICP 与 ISMG 以 Clientmdash;Server 方式建立 TCP 连接,用于双方信息的相互提交。TCP/IP 连接建立后,由 Client 发起建立应用层的连接,这时如果 ICP 或 ISMG 认为需要建立 TLS 连接,则在传输的数据包中置 TLS 字段,从而在双方建立 TLS 连接。

在应用层连接建立后的数据传输过程中,如果 ICP 或 ISMG 需要向对端发送加密信息,也可建立 TLS 连接,这时只需要置相应的消息体中 Tls_available(是否使用 TLS 层)属性字段, 本条消息的消息体中的其他属性不发送。

消息采用并发方式发送,加以滑动窗口流量控制,即接收方在应答前一次收到的消息多于窗口大小条将予以拒绝。流程图如图 3 所示:


2.1.消息定义

消息定义是客户端与服务端之间“沟通的方式” 以下是 cmpp 协议内容的定义 (其中的一个鉴权协议)

基本数据类型



消息结构


消息头格式(Message Header)


CMPP_CONNECT 消息定义(SPàISMG)


CMPP_CONNECT 消息定义



CMPP_CONNECT_RESP 消息定义(ISMG à SP)


3.构建服务端

3.1 短信测试桩架构分析


业务处理流程。如图 3.2 所示


图 3.2

处理流程说明

1.服务端收到一条为 39 个字节的长度的请求数据,由于头部固定为 12 字节,剩余为 27 个字节

2.根据以上的协议 27 个字节长度判断是需要建立连接

3.获取客户端的连接的用户名与密码,解析 AuthenticatorISMG 字段验证是否鉴权成功

4.成功进行下一步操作 (需要回应 鉴权成功),在根据建立的连接后,对获取的数据进行处理,返回内容

我们以鉴权部分提取它的主要代码:取出头部数据包


获取主体内容,鉴权内容


日志展示


3.2 效果展示

短信测试桩目前已在测试环境中运行了 2 年多,帮助公司节省了一大笔测试费用,以下是它展示的效果内容

 

在 iportal 上展示,发送成功状态。


在 iportal 上展示,发送失败状态。


在 iportal 上展示,已发送的状态。


Iportal 上展示,余额不足的状态


3.3 短信模拟桩遇到的问题

1.发送的请求数据量已经超过窗口大小

当客户端发送的数量超过了大小处理大小,服务端进行限流,让任务进行排队处理并对它返回响应的 code,以减轻服务端压力

2.代码建立无效的链接,浪费资源

 建立一个连接,就存储一个连接,当无效链接时,需要删除连接,如何判定无效,心跳连接不在建立,或建立连接后,20 分钟内都没有发送消息(测试环境),服务端对断链进行处理

3.语言的选项,以及方案设计

可选择 java 以及 Python 语言都可以,考虑 Python 在公司的使用程度较高,选择 Python

选择 Python 的类有 struct 模块,用户解析字节数据,使用 gevent 来解决协程,或者是 Python 提供的多进程

4.消息粘包

读取数据时,根据头部的长度信息,按序读取 ioArgs 缓冲区中的数据,若没有达到长度要求,继续读下一个 ioArgs 解决粘包、半包问题。

我们逐步完善测试桩,它不仅具有解析数据的功能,发送报告,保持心跳、处理不同错误 code,我们也提升了处理速度,以前是 1 分钟处理 10 个,现在 1 分钟能处理 300 个,满足我们大批量数据速度的一个提升,完善了我们各种场景的测试。

 

发布于: 2 小时前阅读数: 5
用户头像

还未添加个人签名 2021.04.23 加入

还未添加个人简介

评论

发布
暂无评论
极光笔记|基于CMPP协议集成短信测试桩全流程实践分享