Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183127
  • 博文数量: 67
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 622
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-19 19:12
文章分类

全部博文(67)

分类: LINUX

2015-06-25 14:57:29

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) |
0

上一篇:归并排序

下一篇:linux POSIX semaphore

给主人留下些什么吧!~~