通常,Invite请求中的Contact头字段无用。例如,UAC和UAS位于不同的LAN中。联系人字段可能是:
INVITE sip:bob@sipprovider SIP/2.0
Contact: Alice<alice@192.168.1.10>
.....
我们仍然可以构建对话框时没有使用“联系人”字段。那么,为什么Contact头字段是必需的?
答案 0 :(得分:9)
“联系人”标题表示您的位置(或者更确切地说,是您的用户代理所在的位置),而“起始”标题表示 。
您可能有多个SIP设备都注册到同一个记录地址(您在From标头中输入的URI)。
此外,REGISTER请求使用Contact头来维护SIP的位置服务:它们让用户代理更新注册商的位置信息。
(顺便说一句,如果Alice调用Bob,则Contact头需要处于2xx响应中,以便Alice可以将2xx的ACK路由到Bob。这指向DarkDust关于某些SIP代理的评论错误联系头:如果没有但是,你发现自己处于一个只有一半建立的呼叫的不舒服的位置:Alice认为呼叫的设置是因为她发送了她的ACK,但Bob从未接收过它。联系人修改代理的另一种选择是使用B2BUA作为网络网关;它不需要破坏Contact头,因为头部将指向B2BUA本身。)
回应Phoenix Luo的评论,由于在Contact头中使用LAN IP的缺点,RFC 5627描述了一种解决方案 - 使用全局可路由的用户代理URI 联系标题中的(GRUUs)。
答案 1 :(得分:7)
联系人字段包含被叫方可以在未来请求时到达呼叫者的地址。例如,有必要让被叫方可以向呼叫者发送BYE或re-INVITE。