1、record-route、route、via、contact
sip proxy使用record-route添加loose route或strict route,使主被叫或得路由集,后续的请求即可将此路由集添加到route头域
loose route 可以向后兼容strict route,反之不行,即loose route可以识别并处理strict route,但是strict route将loose route视为strict route进行处理
proxy添加via来指示响应消息的返回路径
route字段比request-uri的优先级高,即没有route字段了采用request-uri来进行路由
contact用于告知对方自己的地址,后续的请求可以直接发到改地址上
2、例子(下面的u表示UA,s表示strict route,l表示loose route)
1)全都是strict route,拓扑u1--s1--s2--s3--u2
u1发起invite
u1-->s1:
invite:callee@s3.com
contact:caller@u1.com
s1-->s2:
invite:callee@s3.com
contact:caller@u1.com
record-route:s1@s1.com
s2-->s3:
invite:callee@s3.com
contact:caller@u1.com
record-route:s1@s1.com
record-route:s2@s2.com
s3-->u2:
invite:callee@u2.com 此处s3发现request-uri是自己负责的域,于是定位具体的callee地址
contact:caller@u1.com
record-route:s1@s1.com
record-route:s2@s2.com
record-route:s3@s3.com
至此,u2得到路由集s3、s2、s1,且得到对端具体地址caller@u1.com,u2在200OK中通过record-route将路由集带给u1,并通过contact携带自己的地址
当u1收到200OK时,获取路由集s1、s2、s3,以及callee具体地址callee@u2.com,后续请求即可使用路由集填充route字段
假设u1发送bye
u1-->s1:
bye:s1@s1.com //u1发现下一跳s1是strict route,于是将request-uri放到最后一个route中,并用s1填充request-uri
route:s2@s2.com
route:s3@s3.com
route:callee@u2.com
s1-->s2:
bye:s2@s2.com 严格路由先检查request-uri是不是自己,是则弹出下一跳用之代替request-uri后根据request-uri发出,否则丢弃
route:s3@s3.com
route:callee@u2.com
s2-->s3:
bye:s3@s2.com
route:callee@u2.com
s3-->u2:
bye:callee@u2.com
2)全都是loose route,拓扑u1--l1--l2--l3--u2
u1发起invite
u1-->l1:
invite:callee@l3.com
contact:caller@u1.com
l1-->l2:
invite:callee@l3.com
contact:caller@u1.com
record-route:l1@l1.com;lr
l2-->l3:
invite:callee@l3.com
contact:caller@u1.com
record-route:l1@l1.com;lr
record-route:l2@l2.com;lr
l3-->u2:
invite:callee@u2.com
contact:caller@u1.com
record-route:l1@l1.com;lr
record-route:l2@l2.com;lr
record-route:l3@l3.com;lr
至此,u2得到路由集l3、l2、l1,且得到对端具体地址caller@u1.com,u2在200OK中通过record-route将路由集带给u1,并通过contact携带自己的地址
当u1收到200OK时,获取路由集l1、l2、l3,以及callee具体地址callee@u2.com,后续请求即可使用路由集填充route字段
假设u1发送bye
u1-->l1:
bye:callee@u2.com 此处u1发现下一跳l1是loose route,直接使用callee@u2.com作为request-uri
route:l1@l1.com;lr
route:l2@l2.com;lr
route:l3@l3.com;lr
l1-->l2:
bye:callee@u2.com 此处l1检查request-uri,不是自己则不管,接着检查第一个route,若是自己则删除之,否则不处理
route:l2@l2.com;lr
route:l3@l3.com;lr
l2-->l3:
bye:callee@u2.com
route:l3@l3.com;lr
l3-->u2:
bye:callee@u2.com
3)混合,拓扑u1--l1--s2--l3--u2
u1发起invite
u1-->l1:
invite:callee@l3.com
contact:caller@u1.com
l1-->s2:
invite:callee@l3.com
contact:caller@u1.com
record-route:l1@l1.com;lr
s2-->l3:
invite:callee@l3.com
contact:caller@u1.com
record-route:l1@l1.com;lr
record-route:s2@s2.com; 此处无lr
l3-->u2:
invite:callee@u2.com
contact:caller@u1.com
record-route:l1@l1.com;lr
record-route:s2@s2.com
record-route:l3@l3.com;lr
至此,u2得到路由集l3、s2、l1,且得到对端具体地址caller@u1.com,u2在200OK中通过record-route将路由集带给u1,并通过contact携带自己的地址
当u1收到200OK时,获取路由集l1、s2、l3,以及callee具体地址callee@u2.com,后续请求即可使用路由集填充route字段
假设u1发送bye
u1-->l1:
bye:callee@u2.com 此处u1发现下一跳l1是loose route,直接使用callee@u2.com作为request-uri
route:l1@l1.com;lr
route:s2@s2.com
route:l3@l3.com;lr
l1-->s2:
bye:s2@s2.com //此处l1检查request-uri,不是自己则不管,接着检查第一个route,若是自己则删除之,否则不处理
route:l3@l3.com;lr //然后发现下一跳s2是strict route,于是将request-uri放到最后一个route中,用下一跳(s2)替换
route:callee@u2.com //request-uri
s2-->l3:
bye:l3@l3.com //s2将l3当做strict route进行处理
route:callee@u2.com
l3-->u2:
bye:callee@u2.com //l3发现request-uri是自己(表明上一跳是strict route),
//于是用最后一个route替换request-uri,并删除最有一个route
4)混合,拓扑u1--s1--s2--l3--u2
u1发起invite
u1-->s1:
invite:callee@l3.com
contact:caller@u1.com
s1-->s2:
invite:callee@l3.com
contact:caller@u1.com
record-route:s1@s1.com
s2-->l3:
invite:callee@l3.com
contact:caller@u1.com
record-route:s1@s1.com
record-route:s2@s2.com
l3-->u2:
invite:callee@u2.com
contact:caller@u1.com
record-route:s1@s1.com
record-route:s2@s2.com
record-route:l3@l3.com;lr
至此,u2得到路由集l3、s2、s1,且得到对端具体地址caller@u1.com,u2在200OK中通过record-route将路由集带给u1,并通过contact携带自己的地址
当u1收到200OK时,获取路由集s1、s2、l3,以及callee具体地址callee@u2.com,后续请求即可使用路由集填充route字段
假设u1发送bye
u1-->s1:
bye:s1@s1.com 此处u1发现下一跳s1是strict route,于是将request-uri放到最后一个route中,并用s1填充request-uri
route:s2@s2.com;
route:l3@l3.com;lr
route:callee@u2.com
s1-->s2:
bye:s2@s2.com
route:l3@l3.com;lr
route:callee@u2.com
s2-->l3:
bye:l3@l3.com //s2将l3当做strict route进行处理
route:callee@u2.com
l3-->u2:
bye:callee@u2.com //l3发现request-uri是自己(表明上一跳是strict route),
//于是用最后一个route替换request-uri,并删除最有一个route
阅读(17860) | 评论(0) | 转发(0) |