SIP重要头域
From:
<span style="font-family:'楷体';font-size:17px">如果一个SIP消息中没有Contact或者Record-Route头域,那么callee就会根据From头域产生后续的Request。</span>
也就是这里Record-Route、Contact、From是有优先级的,如果Record-Route存在,会先选择Record-Route,没的话再去看Contact有没有,如果连Contact都没有的话,最后才会根据From头域里面的地址残剩后续的Request。
<span style="font-family:'楷体';font-size:17px">from里的URI是可变的,因为中间可能经过层层proxy代理,但是To的地址是唯一的。</span>
Contact:
<span style="font-family:'楷体';font-size:17px">后续Request将根据Contact头域的地址内容决定目的地的地址,同时将Contact头域的内容放到Request-URI中。</span>
看个栗子(alice发起通话,最后bob结束通话):
这里alice(2006)向bob(2008)主动发起INVITE,这里的Request-URI和Contact是这样的: 消息的初始Request-URI应该设置为 To字段中URI 的值。
image.png现在要说的话都说完了,bob想要挂断电话并发起请求,这里的Request-URI和Contact是这样的:
image.png这里也就是说,一开始是alice(2006)向bob(2008)发起call请求,最后却是bob发起挂断电话的请求,这时,bob从接收者变成了发起者,而相应的请求行的Request-URI就变成了alice的地址,contact里面也变成了发起者bob的地址。
<span style="font-family:'楷体';font-size:17px">请求者的身份和接收者的身份根据请求是可以相互转换。</span>
Record-Route/Route:
Record-Route头域一般是被proxies插入到request中的,这样后续的Request如何有着和前面一样的call-id就会被路由 到这些proxies。它也会被User Agent作为发送后续request的依据。这套机制很像source-route,Record-Route头域的信息被复制到Route头域中。并 且Request-URI头域会被设置为第一个Route头域的内容。
Via:
Via头域是被服务器插入request中,用来检查路由环的,并且可以使response根据via找到返回的路。它不会对未来的request 或者是response造成影响。 响应消息就依靠via来完成。
<span style="font-family:'楷体';font-size:17px">总的来说,如果有Route,request就应该根据Route发送,如果没有就根据Contact头域发送,如果连Contact都没有,就根据From头域发送。</span>
<span style="font-family:'楷体';font-size:17px">Loop:环路。当请求抵达一个代理服务器,代理服务器转发这个请求,当这个请求再次来到同一个
代理服务器,就称之为环路。</span>
To
To头字段首先指定了请求的所需“逻辑”收件人,或者是此请求的目标用户或资源的记录地址。这可能是也可能不是请求的最终接收者。To头域可以包含SIP或SIPS URI,但也可以使用其他URI方案