2013-10-21 42 views
11

我有一個由我的移動網絡提供商製作的Windows桌面應用程序,它可以完成SIP的各種操作:調用,發送消息等。此應用程序如何成功發送屏幕截圖MESSAGE(最後4行): Wireshark如何通過SIP發送即時消息

MESSAGE請求,從桌面應用程序,被作爲從後面(第四行):

MESSAGE sip:[email protected] SIP/2.0 
Via: SIP/2.0/UDP LOCALIP:2112;branch=z9hG4bK-d8754z-905183245f478c76-1---d8754z-;rport 
Max-Forwards: 70 
To: "TO"<sip:[email protected]> 
From: "FROM"<sip:[email protected]>;tag=63088d09 
Call-ID: NGVhMDJhYzQwNmExOTQyNThmNjc5OGNmOTViNDUyYWM. 
CSeq: 2 MESSAGE 
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO 
Content-Type: text/plain 
Content-Length: 4 

test 

和該全成響應爲:

SIP/2.0 407 Proxy Authentication Required 
Via: SIP/2.0/UDP LOCALIP:2112;received=EXTERNALIP;branch=z9hG4bK-d8754z-905183245f478c76-1---d8754z-;rport=2112 
To: "TO"<sip:[email protected]>;tag=c005f0e30133ec730add76fc91f4bea 
From: "FROM"<sip:[email protected]>;tag=63088d09 
Call-ID: NGVhMDJhYzQwNmExOTQyNThmNjc5OGNmOTViNDUyYWM. 
CSeq: 2 MESSAGE 
Content-Length: 0 
Proxy-Authenticate: Digest nonce="3F178051B97E1F5200A3C53D4B",realm="DOMAIN",algorithm=MD5,qop="auth" 

然後我嘗試從PHP發送相同的(和正的變化)的要求,但我總是收到SIP/2.0 403 Forbidden代替SIP/2.0 407 Proxy Authentication Required

SIP/2.0 403 Forbidden 
Via: SIP/2.0/UDP LOCALIP;received=EXTERNALIP 
To: "TO"<sip:[email protected]>;tag=aprqngfrt-f7ccjj0000020 
From: "FROM"<sip:[email protected]>;tag=8f7be81d 
Call-ID: [email protected] 
CSeq: 1 MESSAGE 
Reason: Q.850;cause=55;text="Call Terminated" 
Content-Length: 0 

有趣的是,如果我發送REGISTER要求它的工作原理,併成功收到SIP/2.0 401 Unauthorized標頭WWW-Authenticate。我重新計算授權,並重新發送。然後我收到SIP/2.0 200 OK。這應該如何與MESSAGE配合使用。

什麼可能是錯的?我錯過了什麼?請問MESSAGE之前需要其他一些要求(我以前已經試過REGISTER)?
我已經讀了RFC 3428上下,嘗試了所有可能的例子,但沒有成功。

+0

我不是'SIP'專家,看起來你知道你在做什麼。我只能說,如果你確信自己做的和其他軟件完全相同(沒有任何鎖定),我會說爲你做的事情可能會有所不同。也許控制字符不匹配可能是一個好的開始,比如'\ n' vs'\ n \ r'。 – Mehran

+0

@Mehran:我不認爲不同類型的「新行」會有所作爲,因爲'REGISTER'方法正在工作。例如,如果我從請求中刪除'CSeq'頭,SIP服務器將返回'SIP/2.0 400 Missing CSeq Header' ...這告訴我,通信是可以的。我認爲'MESSAGE'方法發送正確,它必須是別的;( –

回答

5

如果您查看收到的403響應,您會注意到原因標題。開頭的Q.850字符串表示這將是由ITU-T推薦標準定義的原因代碼。

具體來說,提供的原因碼55與ISDN有關,文字方式「在封閉用戶組內禁止來電」(你可以在RFC 3398中查到),並且通常意味着在一組成員內,呼叫接收是限制。

另一方面,原因55也表示請求內的問題,特別是與用戶(發送者或接收者)有關的問題。下圖顯示SIP用戶之間的正常消息交換:

 A    Server    B 
     | REGISTER |    | 
     |--------------->|    | 
     |  200 OK  |    | 
     |<---------------|    | 
     |    | REGISTER | 
     |    |<--------------|   
     |    |  200 OK | 
     |    |-------------->| 
     | MESSAGE  |    | 
     |--------------->| MESSAGE | 
     |    |-------------->| 
     |    |  200 OK | 
     |    |<--------------| 
     |  200 OK  |    | 
     |<---------------|    | 

其實,經過嚴格的,從註冊不需要用戶A,但大多數系統(如IMS)使用它作爲身份驗證機制。然後,在註冊請求,特殊的標題是:

Contact: <sip:[email protected]_IP:LOCAL_PORT> 
Expires: REGISTRATION_DURATION 

記住,200個OK答案寄存器,可以包含Expires:頁眉或內部Contact:頭,表示接受到期時間expires參數。例如:

SIP/2.0 200 OK 
... 
Contact: <sip:[email protected]_IP:LOCAL_PORT>; expires=60 
... 

在這種情況下,您應該在此過期時間(示例中爲60秒)之前重新註冊。

請記住,您正嘗試將短信發送至手機,接收點由您的網絡提供商的MGCF直接管理,因此會留下發件人的註冊或MESSAGE請求。

關於您的原始郵件的建議,請求URI(郵件的第一行),應該是:

MESSAGE sip:[email protected] SIP/2.0 

因爲它指的是消息接收實體。

希望這會有所幫助。

+0

@Glavić你可以在[RFC 3398](https:// www.ietf.org/rfc/rfc3398.txt)關於MESSAGE請求URI,你不應該提供關於你的用戶的信息(my_phone_num或username),而是關於_destination_,這是'TO'值。大多數代理服務器只檢查這個請求消息轉發的URI,實際上,它會匹配你的問題,你正嘗試向你自己發送一條消息。 – jcm

+0

@Glavić如果您嘗試發送短信,您是否嘗試了Tel URI格式:tel:+ 而不是sip:TO @ DOMAIN? – jcm

+0

@Glavić原因代碼55最初意味着在提供的工作組(管理單位)中對該用戶進行某種限制,但也可以引用用戶不兼容的請求<-->。從以前的消息中,我假設您在發送MESSAGE消息之前已經註冊了主叫方和被叫方用戶,我錯了嗎? – jcm

2

正如我在評論中告訴你的,我不是SIP專家,但我的一位朋友是。我問過你的情況,這是他告訴我的:

SIP協議是一種對話協議,意思是每個通信都是一個對話,具有唯一的對話ID(類似於HTTP中的會話ID)。 SIP和HTTP的區別在於會話ID在不同的TPC/IP連接(HTTP請求)之間使用,而對話ID在相同的TPC/IP連接內但在不同的消息中使用。

在我看來,你在這裏嘗試做什麼有點像HTTP中的會話劫持。儘管可以在HTTP中劫持會話ID並從另一個客戶端發送會話ID,但SIP不能。據我的朋友說,SIP服務器有一個內部存儲器,其中的對話ID屬於哪個連接,並且只有知道他們的對話ID,你才能將你的消息轉移到別人的對話中。

你的問題並沒有說如果這是你真正想做的事情,但如果是這樣,那麼我必須說你不能。您可以發送REGISTER命令的事實顯示您與SIP服務器的通信已完成。你所需要做的就是開始你自己的對話並從那裏開始。

+0

)如果您試圖在PHP中實現一個SIP棧,爲什麼不使用可用的庫?以下是一個:https://code.google.com/p/php-sip /。我確定你可以在互聯網上找到很多這樣的項目。 – Mehran

+0

不幸的是,如果你已經測試過幾個與SIP服務器通信但沒有成功的庫,那麼我必須說你需要以確保你的服務器不是奇怪的,我的意思不是所有的庫都可能出現故障 – Mehran