天天看點

關于聯通短信發送程式(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是正常的,與分析情況相符,和報告中 二 的意思是一緻的。