前言
OpenSIPS基本上只是一个基于事务的有状态代理,没有任何内置的对话支持。有许多特性、服务实际上需要感知对话的,例如在对话创建阶段存储信息,在整个对话存在期间将使用这些信息。
最迫切的例子是在处理对话的INVITE请求(re-INVITE)时的NAT遍历。在处理初始INVITE时,代理会检测主叫或被叫是否在某些NAT网络背后,并修复信令和媒体部分。因为不是所有的检测机制都可用于对话请求(如usrloc),所以为了能够相应地修复顺序请求,代理必须记住原始请求是NAT处理的。还有许多其他应用场景的情况,感知对话可以修复问题或帮助处理。
解决方案是在路由集合中存储额外的与对话相关的信息(Record-Route/Route headers),headers在相继的所有请求中展示。因此,添加到Record-Route头部的任何信息都将在Route头部(对应于代理地址)中找到(没有方向依赖性)。
函数:loose_route()
该函数对包含路由集的SIP请求执行路由。
这个函数的名称有一点迷惑人,因为这个函数还会对“strict router” 格式的请求进行路由。
此函数通常用于处理在对话中(in-dialog)的请求,如ACK、BYE、reINVITE等。尽管如此,对话外请求也可以有一个“预加载的路由集”,并且可以使用loose_route路由。它还负责严格路由器和松散路由器之间的转换。
loose_route()函数的作用是分析请求中的Route头部。如果没有Route头部,则函数返回FALSE,并且应该通过RURI以独占方式进行路由。如果找到Route头部,则函数返回TRUE,并按照RFC 3261第16.12节所述进行操作。唯一