天天看点

关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)

关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)

    这是数年前给一个公司做的;使用WireShark抓包分析程序问题;是使用WireShark分析程序涉及到网络相关问题的一个很好案例。

    对于进行短彩信开发的人可以详细看一下;非短彩信开发人员可以了解一下WireShark的应用。

    短彩信群发业务(SGIP协议),简单来说是这样。是一种电信增值业务。要做短彩信群发的单位,先去当地联通或移动,申请开通此项业务;然后它会提供一根专线,连接到公司的服务器;公司的程序,把要发送短信的用户号码和短信内容,包装为SGIP协议的数据包,一条条的,提交到联通或移动的短信网关,然后就不用管了;联通或移动的短信网关收到SGIP的协议数据,它自己会把短信发给用户手机。

    短信发送程序本质是一个TCP/IP套接字程序,不过要同时实现套接字的发送和接收;因为按SGIP协议要求,提交数据给短信网关,同时也要接收短信网关返回的状态。

    这里SGIP协议是位于TCP/UDP之上的一个应用层协议。SGIP协议,大约60、70页文字,可以全部描述清楚其细节。如果对TCP/IP协议比较了解,对上述应该不难理解。

    短信发送程序可以用C#或Java开发,可以直接用套接字,也可以用一些套接字的包装类。网上有参考源码。

    涉及到SGIP协议术语就不解释了,如需要可网上查阅SGIP资料。SP是指发送端,SMG是短信网关。

    具体的IP之类的一些内容,涉及商业信息的全部隐去,只讨论纯技术问题。

    开发通常先使用模拟网关,是一个程序,就是一个套接字的收发程序,不过它可以分析出SGIP协议数据;短信发送程序对模拟网关进行收发,测试都通过,再对实际网关进行发送。

    SGIP这一类型的短信协议,在WireShark中识别出来,很多时候显示为SMPP协议。

一 开发过程中出现的现象

    按照sgip协议的要求,SP对SMG发送时,如果ReportFlag字段设置为1,不论该条消息成功与失败,SMG都应返回一个report。

    在实际调试和测试中,不论用模拟网关,还是真实联通网关,在发送程序界面上均未显示有收到report。在SmsServer.cs中有添加代码,当收到report时在界面上添加提示。

    需要分析是程序的问题,还是联通方面的问题。

二 分析

    由于联通网关现在并不能deliver;SubmitResp是SP对SMG进行提交短信时,SMG被动返回的;Report和Deliver都是SMG主动发送的;所以可能是联通关闭了主动发送功能。

    该问题应该不影响短信发送。只要收到SubmitResp即可。

    但为了程序可靠性,通过实际分析测试来证实。

三 程序界面

    在TcpSocketServer.cs的AcceptCallBack函数内,收到一个Bind之后,添加:

    this.addText(">>>>>>接收到网关Bind请求!!!");//测试用

    这样如果收到网关主动连接请求,就会在界面上提示;

    在SmsServer.cs的ServerRecvEvent函数中的switch语句中,当分支条件为5时,即收到网关report时,添加:

    this.AddTextEvent(string.Concat(new object[] { ">==接收到SGIP_REPORT    手机号", report.UserNumber, ";状态:", report.ErrorCode }));

    这样如果收到网关Report,就会在界面上提示;

四 抓包工具WireShark的安装配置使用

    在WireShark官网下载WireShark,然后安装,安装过程中弹出提示安装WinPcap, WireShark是用WinPcap开发的,要同时安装上WinPcap;安装结束即可使用。

    抓包

    启动WireShark,选定网卡,点击开始,即开始包的捕获。

    如果网卡接口选择列表为空,或者弹出相关提示,表明NPF服务没有启动,WireShark抓包需要该服务。以管理员身份运行CMD,然后执行net start npf命令,启动npf服务。

    需要选定合适的网卡或接口,如选择不对将不会捕获到需要的包,或者只能捕获一个方向(流进或流出)的包。

    网卡与连接选择列表

关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)

五 对模拟网关的抓包分析

    由短信发送程序对网关进行三次发送,每次25条。

    首先启动WireShark,开始抓包。然后启动发送程序进行发送。发送结束停止抓包。

    所捕获的包包含此时段内所有在本机网卡上流进流出的包。数量比较多,难以进行分析,需要进行过滤,过滤出网关对发送程序返回的包进行分析。

    编写过滤表达式如下:

    ip.dst==192.168.1.29 and ip.src==192.168.1.37 and !udp

    即只需要目的地址为本机(192.168.1.29)、源地址(模拟网关部署地址)为192.168.1.37的包,并滤除所有UDP包。

    过滤后的包数量较少,可进行分析。

    以第三次发送捕获后过滤后的包进行示例,如下图。

关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)

    由模拟网关对短信发送程序返回的包可见,返回的包的类型主要有TCP的ACK包(即模拟网关对发送程序请求建立连接的确认包)、

    SMPP Query_sm - resp包(WireShark把SGIP协议认为SMPP协议)。

    在所有返回的包中并未发现有report类型的包。

六 对真实的联通网关进行抓包分析

    由短信发送程序进行四次发送,10条三次,20条一次。分别捕获每次发送时的包。

    然后用WireShark打开所捕获的包,键入过滤表达式:

    ip.dst==xxx.x.xxx.xxx and ip.src==xxx.xx.xxx.xxx and !udp

    即由联通网关对短信发送程序部署机器返回的包,并滤除所有UDP包;

    过滤后进行分析。

    以10条第二次、20条第一次为例,如下图所示。

关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)
关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)

    由联通网关对短信发送程序返回的包中主要包含三类包:联通网关对短信发送程序请求建立连接的包(TCP的SYN包)、联通网关对短信发送程序建立连接请求返回的确认包(TCP的ACK包)、联通网关对发送程序提交的短信返回的响应(SMPP Query_sm - resp,

WireShark把SGIP协议认为SMPP协议)。

    在所有返回的包中并未发现有report类型的包。

七 结论、电话联系

    由以上可知,联通网关收到短信后并未返回Report。程序本身没有问题。

    电话联系联通陈工,陈工表示“状态报告是通过上行接口返回的”,联通的上行接口没有开放,不能收到返回的Report是正常的,与分析情况相符,和报告中 二 的意思是一致的。