关于联通短信发送程序(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服务。
需要选定合适的网卡或接口,如选择不对将不会捕获到需要的包,或者只能捕获一个方向(流进或流出)的包。
网卡与连接选择列表
五 对模拟网关的抓包分析
由短信发送程序对网关进行三次发送,每次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包。
过滤后的包数量较少,可进行分析。
以第三次发送捕获后过滤后的包进行示例,如下图。
由模拟网关对短信发送程序返回的包可见,返回的包的类型主要有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条第一次为例,如下图所示。
由联通网关对短信发送程序返回的包中主要包含三类包:联通网关对短信发送程序请求建立连接的包(TCP的SYN包)、联通网关对短信发送程序建立连接请求返回的确认包(TCP的ACK包)、联通网关对发送程序提交的短信返回的响应(SMPP Query_sm - resp,
WireShark把SGIP协议认为SMPP协议)。
在所有返回的包中并未发现有report类型的包。
七 结论、电话联系
由以上可知,联通网关收到短信后并未返回Report。程序本身没有问题。
电话联系联通陈工,陈工表示“状态报告是通过上行接口返回的”,联通的上行接口没有开放,不能收到返回的Report是正常的,与分析情况相符,和报告中 二 的意思是一致的。