2013-10-21 47 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