关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)
關(guān)于聯(lián)通短信發(fā)送程序(SGIP協(xié)議)沒有收到返回狀態(tài)報(bào)告的報(bào)告(使用WireShark分析)
? ? 這是數(shù)年前給一個(gè)公司做的;使用WireShark抓包分析程序問題;是使用WireShark分析程序涉及到網(wǎng)絡(luò)相關(guān)問題的一個(gè)很好案例。
? ? 對(duì)于進(jìn)行短彩信開發(fā)的人可以詳細(xì)看一下;非短彩信開發(fā)人員可以了解一下WireShark的應(yīng)用。
? ? 短彩信群發(fā)業(yè)務(wù)(SGIP協(xié)議),簡單來說是這樣。是一種電信增值業(yè)務(wù)。要做短彩信群發(fā)的單位,先去當(dāng)?shù)芈?lián)通或移動(dòng),申請(qǐng)開通此項(xiàng)業(yè)務(wù);然后它會(huì)提供一根專線,連接到公司的服務(wù)器;公司的程序,把要發(fā)送短信的用戶號(hào)碼和短信內(nèi)容,包裝為SGIP協(xié)議的數(shù)據(jù)包,一條條的,提交到聯(lián)通或移動(dòng)的短信網(wǎng)關(guān),然后就不用管了;聯(lián)通或移動(dòng)的短信網(wǎng)關(guān)收到SGIP的協(xié)議數(shù)據(jù),它自己會(huì)把短信發(fā)給用戶手機(jī)。
? ? 短信發(fā)送程序本質(zhì)是一個(gè)TCP/IP套接字程序,不過要同時(shí)實(shí)現(xiàn)套接字的發(fā)送和接收;因?yàn)榘碨GIP協(xié)議要求,提交數(shù)據(jù)給短信網(wǎng)關(guān),同時(shí)也要接收短信網(wǎng)關(guān)返回的狀態(tài)。
? ? 這里SGIP協(xié)議是位于TCP/UDP之上的一個(gè)應(yīng)用層協(xié)議。SGIP協(xié)議,大約60、70頁文字,可以全部描述清楚其細(xì)節(jié)。如果對(duì)TCP/IP協(xié)議比較了解,對(duì)上述應(yīng)該不難理解。
? ? 短信發(fā)送程序可以用C#或Java開發(fā),可以直接用套接字,也可以用一些套接字的包裝類。網(wǎng)上有參考源碼。
? ? 涉及到SGIP協(xié)議術(shù)語就不解釋了,如需要可網(wǎng)上查閱SGIP資料。SP是指發(fā)送端,SMG是短信網(wǎng)關(guān)。
? ? 具體的IP之類的一些內(nèi)容,涉及商業(yè)信息的全部隱去,只討論純技術(shù)問題。
? ? 開發(fā)通常先使用模擬網(wǎng)關(guān),是一個(gè)程序,就是一個(gè)套接字的收發(fā)程序,不過它可以分析出SGIP協(xié)議數(shù)據(jù);短信發(fā)送程序?qū)δM網(wǎng)關(guān)進(jìn)行收發(fā),測(cè)試都通過,再對(duì)實(shí)際網(wǎng)關(guān)進(jìn)行發(fā)送。
? ? SGIP這一類型的短信協(xié)議,在WireShark中識(shí)別出來,很多時(shí)候顯示為SMPP協(xié)議。
一 開發(fā)過程中出現(xiàn)的現(xiàn)象
? ? 按照sgip協(xié)議的要求,SP對(duì)SMG發(fā)送時(shí),如果ReportFlag字段設(shè)置為1,不論該條消息成功與失敗,SMG都應(yīng)返回一個(gè)report。
? ? 在實(shí)際調(diào)試和測(cè)試中,不論用模擬網(wǎng)關(guān),還是真實(shí)聯(lián)通網(wǎng)關(guān),在發(fā)送程序界面上均未顯示有收到report。在SmsServer.cs中有添加代碼,當(dāng)收到report時(shí)在界面上添加提示。
? ? 需要分析是程序的問題,還是聯(lián)通方面的問題。
二 分析
? ? 由于聯(lián)通網(wǎng)關(guān)現(xiàn)在并不能deliver;SubmitResp是SP對(duì)SMG進(jìn)行提交短信時(shí),SMG被動(dòng)返回的;Report和Deliver都是SMG主動(dòng)發(fā)送的;所以可能是聯(lián)通關(guān)閉了主動(dòng)發(fā)送功能。
? ? 該問題應(yīng)該不影響短信發(fā)送。只要收到SubmitResp即可。
? ? 但為了程序可靠性,通過實(shí)際分析測(cè)試來證實(shí)。
三 程序界面
? ? 在TcpSocketServer.cs的AcceptCallBack函數(shù)內(nèi),收到一個(gè)Bind之后,添加:
? ? this.addText(">>>>>>接收到網(wǎng)關(guān)Bind請(qǐng)求!!!");//測(cè)試用
? ? 這樣如果收到網(wǎng)關(guān)主動(dòng)連接請(qǐng)求,就會(huì)在界面上提示;
? ? 在SmsServer.cs的ServerRecvEvent函數(shù)中的switch語句中,當(dāng)分支條件為5時(shí),即收到網(wǎng)關(guān)report時(shí),添加:
? ? this.AddTextEvent(string.Concat(new object[] { ">==接收到SGIP_REPORT ? ?手機(jī)號(hào)", report.UserNumber, ";狀態(tài):", report.ErrorCode }));
? ? 這樣如果收到網(wǎng)關(guān)Report,就會(huì)在界面上提示;
四 抓包工具WireShark的安裝配置使用
? ? 在WireShark官網(wǎng)下載WireShark,然后安裝,安裝過程中彈出提示安裝WinPcap, WireShark是用WinPcap開發(fā)的,要同時(shí)安裝上WinPcap;安裝結(jié)束即可使用。
? ? 抓包
? ? 啟動(dòng)WireShark,選定網(wǎng)卡,點(diǎn)擊開始,即開始包的捕獲。
? ? 如果網(wǎng)卡接口選擇列表為空,或者彈出相關(guān)提示,表明NPF服務(wù)沒有啟動(dòng),WireShark抓包需要該服務(wù)。以管理員身份運(yùn)行CMD,然后執(zhí)行net start npf命令,啟動(dòng)npf服務(wù)。
? ? 需要選定合適的網(wǎng)卡或接口,如選擇不對(duì)將不會(huì)捕獲到需要的包,或者只能捕獲一個(gè)方向(流進(jìn)或流出)的包。
? ? 網(wǎng)卡與連接選擇列表
?
五 對(duì)模擬網(wǎng)關(guān)的抓包分析
?
? ? 由短信發(fā)送程序?qū)W(wǎng)關(guān)進(jìn)行三次發(fā)送,每次25條。
? ? 首先啟動(dòng)WireShark,開始抓包。然后啟動(dòng)發(fā)送程序進(jìn)行發(fā)送。發(fā)送結(jié)束停止抓包。
? ? 所捕獲的包包含此時(shí)段內(nèi)所有在本機(jī)網(wǎng)卡上流進(jìn)流出的包。數(shù)量比較多,難以進(jìn)行分析,需要進(jìn)行過濾,過濾出網(wǎng)關(guān)對(duì)發(fā)送程序返回的包進(jìn)行分析。
? ? 編寫過濾表達(dá)式如下:
? ? ip.dst==192.168.1.29 and ip.src==192.168.1.37 and !udp
? ? 即只需要目的地址為本機(jī)(192.168.1.29)、源地址(模擬網(wǎng)關(guān)部署地址)為192.168.1.37的包,并濾除所有UDP包。
? ? 過濾后的包數(shù)量較少,可進(jìn)行分析。
? ? 以第三次發(fā)送捕獲后過濾后的包進(jìn)行示例,如下圖。
? ? 由模擬網(wǎng)關(guān)對(duì)短信發(fā)送程序返回的包可見,返回的包的類型主要有TCP的ACK包(即模擬網(wǎng)關(guān)對(duì)發(fā)送程序請(qǐng)求建立連接的確認(rèn)包)、
? ? SMPP Query_sm - resp包(WireShark把SGIP協(xié)議認(rèn)為SMPP協(xié)議)。
? ? 在所有返回的包中并未發(fā)現(xiàn)有report類型的包。
?
六 對(duì)真實(shí)的聯(lián)通網(wǎng)關(guān)進(jìn)行抓包分析
?
? ? 由短信發(fā)送程序進(jìn)行四次發(fā)送,10條三次,20條一次。分別捕獲每次發(fā)送時(shí)的包。
? ? 然后用WireShark打開所捕獲的包,鍵入過濾表達(dá)式:
? ? ip.dst==xxx.x.xxx.xxx and ip.src==xxx.xx.xxx.xxx and !udp
? ? 即由聯(lián)通網(wǎng)關(guān)對(duì)短信發(fā)送程序部署機(jī)器返回的包,并濾除所有UDP包;
? ? 過濾后進(jìn)行分析。
? ? 以10條第二次、20條第一次為例,如下圖所示。
? ? 由聯(lián)通網(wǎng)關(guān)對(duì)短信發(fā)送程序返回的包中主要包含三類包:聯(lián)通網(wǎng)關(guān)對(duì)短信發(fā)送程序請(qǐng)求建立連接的包(TCP的SYN包)、聯(lián)通網(wǎng)關(guān)對(duì)短信發(fā)送程序建立連接請(qǐng)求返回的確認(rèn)包(TCP的ACK包)、聯(lián)通網(wǎng)關(guān)對(duì)發(fā)送程序提交的短信返回的響應(yīng)(SMPP Query_sm - resp,
WireShark把SGIP協(xié)議認(rèn)為SMPP協(xié)議)。
? ? 在所有返回的包中并未發(fā)現(xiàn)有report類型的包。
七 結(jié)論、電話聯(lián)系
? ? 由以上可知,聯(lián)通網(wǎng)關(guān)收到短信后并未返回Report。程序本身沒有問題。
? ? 電話聯(lián)系聯(lián)通陳工,陳工表示“狀態(tài)報(bào)告是通過上行接口返回的”,聯(lián)通的上行接口沒有開放,不能收到返回的Report是正常的,與分析情況相符,和報(bào)告中 二 的意思是一致的。
總結(jié)
以上是生活随笔為你收集整理的关于联通短信发送程序(SGIP协议)没有收到返回状态报告的报告(使用WireShark分析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DOTNET防止反编译
- 下一篇: Kinect 动作识别组件概要设计