- 1 -
CMPP 中单连接方式的分析
王凯
北京邮电大学计算机学院,北京 (100876)
摘 要:随着移动网络用户的增多,短信息已经成为手机用户最经常使用的业务之一。除了
大量使用的手机用户到手机用户的点对点短信业务之外,从信息平台到手机用户的短信信息
服务业务也在快速发展。短信网关(ISMG)的建设可以为 SP与短消息中心(SMSC)之间
数据交换提供一条安全、快捷的通道。其中,短信业务能力模块与短信网关(ISMG)之间
的连接方式是实现两者顺利通信的一个重要环节。本文作者根据短信网关连接的基本原理以
及 CMPP 协议研究探讨了短信业务能力模块与短信网关的连接方式中的一个重要问题,即
单连接多连接问题及由此产生的一些问题,并对单连接的实现进行了初步的设计与探讨,这
对建立一个良好的短信业务能力模块有很大的意义。
关键词:短信网关;短信业务能力模块;单连接方式
中图分类号:TP311
1. 引言
电信网络运营商通过提供增值业务,不但能创造新的收入增长点,而且能大大地提高基
础网络的使用率,从而获得更多的利润。实际上,增值业务已经成为运营商利润的主要来源
之一,并将逐渐成为其最大的收入来源。随着移动网络用户的增多,短信息已经成为手机用
户最经常使用的业务之一。除了大量使用的手机用户到手机用户的点对点短信业务之外,从
信息平台到手机用户的短信信息服务业务也在快速发展,该业务已经成为广大用户及时方便
地获取信息的一种手段。
短信网关(ISMG)的建设可以为 SP与短消息中心(SMSC)之间数据交换提供一条安
全、快捷的通道,以便手机用户采用短信方式与 SP 双向通信,接收 SP 提供的信息服务,
同时完成相应计费采集、业务管理、网络管理等功能。而短信业务能力模块位于 ISMG 与
SP 之间,实现与短信网关的连接。它处于底层协议部分,主要向上层业务部分提供传输能
力。模块主要提供两种业务操作:短信发送和短信接收。
其中短信业务能力模块与短信网关(ISMG)之间的单连接方式是经常采用的一项简单
有效的技术,是实现两者顺利通信的一个重要环节。
2. 短信网关通信的基本原理与协议
短信网关通信的基本原理
短信网关的作用是为 SP与短消息中心之间数据交换提供一条安全、快捷的通道,以便
手机用户利用短信方式与 SP 双向通信,接收 SP 提供的信息服务,同时完成相应计费采集
的功能。
短信网关包括与负责范围内 SP进行连接的通讯软件(中国移动采用 CMPP协议)。与
负责范围内 SMSC 相连的协议软件(采用 SMPP 协议)。与其他 ISMG 进行连接的通讯软
件(采用 CMPP 协议)、业务处理软件、网络管理软件、防火墙软件和为计费提供原始活
单的计费处理软件等。
提供业务的各 SP只需连接到互联网上,通过互联网就可以与短信网关连接。
- 2 -
CMPP协议
中国移动通信互联网短信网关接口协议中对 CMPP 协议介绍如下[1]。CMPP(China
Mobile Peer to Peer)协议是中国移动通信的互联网短信网关接口协议,描述了中国移动短信
业务中各网关之间的相关消息的类型和定义,其主要包括以下 3 方面的内容:(1)信息资
源站实体(SP)与互联网短信网关(ISMG)之间的接口协议;(2)互联网短信网关之间
的接口协议(3)互联网短信网关与汇接网关(GNS)之间的接口协议。CMPP适用于各 SP
和 ISMG 的开发厂商,作为实现短消息接入服务的统一消息系统也需要使用该项协议接口
来进行短消息的接受与发送。
CMPP 协议是一种应用层协议,与 HTTP、FTP 等协议一样都是以 TCP/IP 协议为底层
通信承载。CMPP 服务在 TCP 层必须有唯一对应的端口号,以保证 TCP 层向应用层的正
确提交。
CMPP协议以 TCP/IP作为底层通信承载,具体结构由图 1所示:
图 1 CMPP协议栈
各网元之间可以采用两种方式进行连接:长连接与短连接。长连接方式是指 SP 与 ISMG
只建立 TCP 连接,用于双方信息的相互提交,在工作过程中始终保持这个连接,如果信道
上没有数据传输时,客户端发送链路检测包以维持此连接(超过一定时间服务端没有收到客
户的链路信息则会断开该连接)。短连接是指通信双方建立 TCP 连接后,这个连接只用于
本次通信,当数据交互结束后,则断开此 TCP 连接,即每次 TCP 连接只完成一对 CMPP 消
息的接发。目前,ISMG间必须采用长连接的通信方式,在消息量比较大的 SP 与 ISMGP 之
间一般也采用长连接的通信方式。
3. CMPP中的单连接
单连接多连接问题
短信业务流程分为收、发两个流程。单连接,多连接是对这两个流程的不同处理方式。
对收发流程的处理,一般有以下三种情况:
z 收发在一个通道(连接)中;(单连接)
z 收发分离(在不同的连接),以不同的值来标志是只发送呢,还是只接收,或可以收发;
z 收发分离(在不同的端口),以不同的端口来区分是接收还是发送动作。
上面所说的收是指接收 MO 和 Report,发是指发送 MT。从业务方的角度,收业务流程
为(MO):用户归属地的短信中心会将短信转发给负责连接该短信中心的短信网关,由短
信网关根据服务代码和业务代码判别将请求转发给相应的 SP。 发业务流程(MT):对于
MT业务,短信网关根据接收用户手机号码判断其归属地短信中心,再由该短信网关发给归
CMPP
TCP
IP
底层承载
ISMG
CMPP
TCP
IP
底层承载
CMPP
TCP
IP
底层承载
CMPP
TCP
IP
底层承载
ISMG SP GNS
- 3 -
属地短信中心,继而发送给用户。
根据 Socket 连接的原理,结合模块实际需求,不同的连接方式及采用单连接会遇到以
下问题。
首要的问题是,不同的连接方式导致了现有 ISMG之间的差异。亚信网关采用双连接;
清华声讯采用双端口区分 MO、MT,MT是 7890,MO是 7910,遵循 CMPP;东软的协议
不是标准的,但也支持标准的;华为和思特奇则对与网关建立的连接数做了限制。
单连接的方式会引起收发模块的初始化与释放问题。因为采用单连接的实现方式,收发
共用通道,这直接导致MO的实施依赖于MT的实施。
单连接的方式还会引起短信收发协调问题。该问题是由单连接的实现方式引起的。因为
使用单连接,这就意味着短信收发线程要共享 Socket 连接,这是一个典型的线程间共享资
源的问题。而且该问题更复杂的地方在于,短信发送线程向 ISMG 发送完消息后,要等待
ISMG 的回复消息,也就是要从 Socket 读取数据;而接收线程也是要从 Socket 读取数据,
但两者所要读取的数据不同。如何协调它们不会读取到不属于自己的数据,即发送线程不会
读取应该接收线程处理的 Deliver消息,接收线程也不会读取到应该发送线程处理的回复消
息,是一个亟须解决的问题。
单连接方式的设计及相关问题的解决
根据 socket 编程原理[2],我针对单连接方式做出了以下分析。由于最初的模拟网关采
用的是单连接的方式,本模块适宜选用单连接的方式,收发共用一个通道。在与真实网关实
施联调中,可以向手机发送短信,也可以接收到手机发送到平台的短信,这说明单连接的实
现方式是正确的。单连接的实现方式在系统结构上较为简单,思路简洁,对于模块并非单一
大规模商用的情况是适宜的。
由于采用单连接,意味着收发流程将公用同一 Socket连接,因此对连接过程设计如下:
先由发送子模块建立并维持连接,然后启动收短信的流程进行监听,准备接收短信。具体的
流程如下:
短信发送子模块的主要功能是将业务层请求发送的短信提交给 ISMG,并将 ISMG的回
复返回给业务层。其中要实现的操作有:
(1)建立并维护与 ISMG的连接。要能够向 ISMG注册,并在链路空闲的时候进行链
路检测,以保持连接不被断开;
(2)启动短信接收线程。由于短信接收共用短信发送建立的连接,需要在新的短信发
送实例创建的时候创建启动对应的短信接收线程;
(3)多个短信发送实例的维护与管理。为了提高效率,实现负载分担,需要创建多了
短信发送实例,这便需要有一个管理对象来管理调度这些发送实例。
关键的是第二步,正是这一环节在现有连接上实现了接收流程。即解决了单连接实现收
发两个流程的问题。
相对应的,短信接收模块的主要功能是将 ISMG发向平台的用户的点播短信上报给业务
层,并负责与 ISMG的交互。采用单连接方式后,其中要实现的操作有:
(1)接收 ISMG 发送来的消息,将回复消息传递给相应的短信发送实例,将 Deliver
消息放入待处理队列;
(2)从队列中取出消息并将短信或状态报告上报给业务层;
(3)多个短信或状态报告处理线程的管理。为了提高上报短信的性能,实现负载分担,
- 4 -
需要创建多个处理实例,同时处理需要上报的短信或状态报告。
可见,采用单连接机制的情况下,接收流程并无创建连接并监听的操作,完全依靠于发
送流程启动的连接。
根据以上设计,我针对单连接的方式引起收发模块的初始化与释放问题做出如下分析。
最初设想的是,短信模块向业务层提供Web Service接口,只有业务层有发送短信的请求时,
才会触发建立与 ISMG的连接。如果在此之前有用户点播短信要发送到平台,平台也无法接
收(这一点与联通(SGIP)的不同,联通采用了完全的双连接,而且短信网关向平台发送
短信是会主动连接平台监听端口,这种方式可以实现收发的完全分离,减少相互间的影响)。
这样,便需要模块启动的时候便主动向 ISMG注册,建立连接。
另外,短信模块中会使用大量的线程,如将短信上报给业务的线程,短信上报线程的管
理线程等,这些线程也都需要在模块加载的时候启动。最后,在模块退出的时候,需要将很
多资源释放掉,如 Socket 连接、线程资源等。如果处理不好,将会产生大量的垃圾资源,
给系统带来很大的负担。
因此,可以增加一个 Servlet,在其 init()方法中完成初始化工作,在 destroy()方法中完
成资源(包括 Socket、处理线程等)的释放;并且在配置文件中要将该 Servlet 配置为加载
模块时就启动。这样便很好的解决了资源的初始化和释放问题。
结合参考文献 3中的介绍,我对于单连接的方式引起短信收发协调问题分析有两个解决
方法。两个方法都要使用互斥的方法,但又有所不同。而且两个方法都对接收线程的实现有
特殊要求,那就是如果 Socket没有数据可读,接收线程必须立即释放 Socket锁,并进入休
眠等待下一次查询。否则,将会导致短信发送线程无法发送短信[3]。
第一个解决方法更接近于双连接的实现方式。具体来讲,短信发送线程发送完消息后便
等待 ISMG 的回复,此处是线程本身等待 Socket 上到来的数据,要么 Socket 超时,要么从
Socket读取到回复。而接收线程则定时查询 Socket是否有数据可读,如果有则读取并处理。
上面所述都与双连接相同,不同之处在于短信发送线程发送消息前会锁定 Socket,接收到回
复后才会释放 Socket 锁;而短信接收线程查询前要锁定 Socket,读取完数据后才会释放。
这样便可以保证不会同时有两个线程操作共享的 Socket,而且短信接收线程不会误读取到给
短信发送线程的回复。但这个方法不能保证短信发送线程不会读取到 Deliver消息。
第二个解决方法则是实现了 Socket 数据的收发分离。也就是说,短信发送线程只负责
向 Socket写入数据(即向 ISMG发送消息),而接收线程则负责 Socket上的所有数据的读
取。短信接收线程发送消息前仍然会锁定 Socket,但发送完消息后,立即释放对 Socket 的
锁定,然后等待 ISMG的回复(此处是等待短信接收线程的通知);而接收线程则定时查询,
首先锁定 Socket,查看 Socket 是否有数据可读,如果有则读取,如果是回复消息,则通知
短线发送线程;否则是 Deliver消息,放入队列等待处理。
相比较而言,第一个方法并没有完全解决误读问题,而第二个方法完美的解决了这个问
题;而且从上面描述可知第一个方法中短信发送线程对 Socket 的锁定范围要比第二个方法
大,冲突的概率也大,性能可能会受到影响。但是从软件设计的角度来讲,第一个方法中短
信接收线程和短信发送线程的耦合性要小于第二个方法,更利于以后的代码维护。
4. 结论
本文针对当前短信业务模块与短信网关的连接方式中的单连接双连接问题,研究探讨了
- 5 -
关于单连接及由此产生的一些问题,并对单连接等问题进行了初步的设计与讨论。这对进一
步完善优化短信业务能力模块有很大的意义。
参考文献
[1] 中国移动通信互联网短信网关接口协议() .do
[2] Winsocket编程之套接字原理.
[3] 多线程同时写 socket是否需要加锁.
Analysis of Single connection in CMPP
Wang Kai
Beijing University of Posts and Communications, Beijing (100876)
Abstract
With the more and more the mobile network users,SMS has bean one of the most popular
for the short message service from user to user,the short message services from
service platform to users develops ISMG can offer a safe, fast channel between SP and
way of connection between short message capacity module and ISMG plays an important
part in communication of author research and discuss an important question in the
connection based on CMPP,that is single connection and two-way discuss the
achievement of single is important for a good short message capacity module.
Keywords: ISMG;SMS capacity moduld;single connection