假设有一个SIP客户端在100.0.0.100:5059收听。
它接收来自10.0.0.101:5060的UDP数据包,内部有INVITE,带有某些标头。例如:
Contact: <sip:100.0.0.102:5060>
Record-Route: <sip:100.0.0.103:5060>
(此类标题中的第一个)Route: <sip:100.0.0.104:5060>
Via: <sip:100.0.0.105:5060>
(第一个标题)它应该在哪里发送“ACK”,“Tryinng”,“Dialog Establishment”,“BYE”等内容? 100.0.0.what?
(背景:尝试编写“单个TCP连接中的整个SIP”包装器,将SIP中看到的所有地址转换为自身,但获取“请求超时”,“检测到循环”,“转发frobidden”错误使对话持续只有15秒......可能是因为封装器出错了...为什么在header和application / sdp中有这么多令人困惑的IP地址?..)。
答案 0 :(得分:0)
RFC 3261 section 18.2.2告诉你该怎么做。算法的第三步是适用的步骤:
o Otherwise (for unreliable unicast transports), if the top Via
has a "received" parameter, the response MUST be sent to the
address in the "received" parameter, using the port indicated
in the "sent-by" value, or using port 5060 if none is specified
explicitly. If this fails, for example, elicits an ICMP "port
unreachable" response, the procedures of Section 5 of [4]
SHOULD be used to determine where to send the response.
o Otherwise, if it is not receiver-tagged, the response MUST be
sent to the address indicated by the "sent-by" value, using the
procedures in Section 5 of [4].
[4]
指的是here。
通过TCP接收请求是一种更简单的情况:如果可以,您可以通过打开的连接发送请求。否则,您打开与最顶层received
的{{1}}参数中的IP地址的TCP连接(如果存在),或者如果不存在,则打开该标头的Via
令牌。如果尝试失败,则必须回到上面提到的RFC 3263中的算法。