SIP消息路由

本文通过一个完整的SIP呼叫实例解释SIP头部的一些常见字段,在对这些字段的解释的同时也阐述了SIP消息的路由过程。下图是呼叫的消息流示意图和所有的消息头部(因为SDP和消息路由无关,故在此省略)

                     atlanta.com  . . . biloxi.com

                 .      proxy              proxy     .

               .                                       .

       Alice's  . . . . . . . . . . . . . . . . . . . .  Bob's

      softphone                                        SIP Phone

         |                |                |                |

         |    INVITE F1   |                |                |

         |--------------->|    INVITE F2   |                |

         |  100 Trying F3 |--------------->|    INVITE F4   |

         |<---------------|  100 Trying F5 |--------------->|

         |                |<-------------- | 180 Ringing F6 |

         |                | 180 Ringing F7 |<---------------|

         | 180 Ringing F8 |<---------------|     200 OK F9  |

         |<---------------|    200 OK F10  |<---------------|

         |    200 OK F11  |<---------------|                |

         |<---------------|                |                |

         |                       ACK F12                    |

         |------------------------------------------------->|

         |                   Media Session                  |

         |<================================================>|

         |                       BYE F13                    |

         |<-------------------------------------------------|

         |                     200 OK F14                   |

         |------------------------------------------------->|

         |                                                  |

 

F1 INVITE Alice -> atlanta.com proxy

 

INVITE sip:bob@biloxi.com SIP/2.0

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

Max-Forwards: 70

To: Bob <sip:bob@biloxi.com>

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Contact: <sip:alice@pc33.atlanta.com>

Content-Type: application/sdp

Content-Length: 142

F2 100 Trying atlanta.com proxy -> Alice

 

SIP/2.0 100 Trying

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Content-Length: 0

F3 INVITE atlanta.com proxy -> biloxi.com proxy

 

INVITE sip:bob@biloxi.com SIP/2.0

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

Max-Forwards: 69

To: Bob <sip:bob@biloxi.com>

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Contact: <sip:alice@pc33.atlanta.com>

Content-Type: application/sdp

Content-Length: 142

F4 100 Trying biloxi.com proxy -> atlanta.com proxy

 

SIP/2.0 100 Trying

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1

 ;received=192.0.2.2

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Content-Length: 0

F5 INVITE biloxi.com proxy -> Bob

 

INVITE sip:bob@192.0.2.4 SIP/2.0

Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1

 ;received=192.0.2.2

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

Max-Forwards: 68

To: Bob <sip:bob@biloxi.com>

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Contact: <sip:alice@pc33.atlanta.com>

Content-Type: application/sdp

Content-Length: 142

F6 180 Ringing Bob -> biloxi.com proxy

 

SIP/2.0 180 Ringing

Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1

 ;received=192.0.2.3

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1

 ;received=192.0.2.2

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>;tag=a6c85cf

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

Contact: <sip:bob@192.0.2.4>

CSeq: 314159 INVITE

Content-Length: 0

F7 180 Ringing biloxi.com proxy -> atlanta.com proxy

 

SIP/2.0 180 Ringing

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1

 ;received=192.0.2.2

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>;tag=a6c85cf

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

Contact: <sip:bob@192.0.2.4>

CSeq: 314159 INVITE

Content-Length: 0

F8 180 Ringing atlanta.com proxy -> Alice

 

SIP/2.0 180 Ringing

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>;tag=a6c85cf

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

Contact: <sip:bob@192.0.2.4>

CSeq: 314159 INVITE

Content-Length: 0

F9 200 OK Bob -> biloxi.com proxy

 

SIP/2.0 200 OK

Via: SIP/2.0/UDP server10.biloxi.com;branch=z9hG4bK4b43c2ff8.1

 ;received=192.0.2.3

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1

 ;received=192.0.2.2

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>;tag=a6c85cf

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Contact: <sip:bob@192.0.2.4>

Content-Type: application/sdp

Content-Length: 131

F10 200 OK biloxi.com proxy -> atlanta.com proxy

 

SIP/2.0 200 OK

Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1

 ;received=192.0.2.2

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>;tag=a6c85cf

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Contact: <sip:bob@192.0.2.4>

Content-Type: application/sdp

Content-Length: 131

F11 200 OK atlanta.com proxy -> Alice

 

SIP/2.0 200 OK

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8

 ;received=192.0.2.1

To: Bob <sip:bob@biloxi.com>;tag=a6c85cf

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 INVITE

Contact: <sip:bob@192.0.2.4>

Content-Type: application/sdp

Content-Length: 131

F12 ACK Alice -> Bob

 

ACK sip:bob@192.0.2.4 SIP/2.0

Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds9

Max-Forwards: 70

To: Bob <sip:bob@biloxi.com>;tag=a6c85cf

From: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 314159 ACK

Content-Length: 0

F13 BYE Bob -> Alice

 

BYE sip:alice@pc33.atlanta.com SIP/2.0

Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10

Max-Forwards: 70

From: Bob <sip:bob@biloxi.com>;tag=a6c85cf

To: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 231 BYE

Content-Length: 0

F14 200 OK Alice -> Bob

 

SIP/2.0 200 OK

Via: SIP/2.0/UDP 192.0.2.4;branch=z9hG4bKnashds10

From: Bob <sip:bob@biloxi.com>;tag=a6c85cf

To: Alice <sip:alice@atlanta.com>;tag=1928301774

Call-ID: a84b4c76e66710

CSeq: 231 BYE

Content-Length: 0

1. SIP消息头部主要字段:

·         Request-URIRequest消息的第一行中method后面紧跟的部分就是Request-URI(本例中的sip:bob@biloxi.com)该值在消息经过Proxy之后就有可能发生变化,变成消息路径中Next HopURI

·         To包含的是最终用户的Public address,消息无论被Proxy多少次该值都不会改变。当最终用户开始回应第一个Response消息时(比如本例中的180 Ring)会在To中加上本地唯一的一个tag值。

·         From包含Request消息发起者的URI,也不会被Proxy改变;在生成Reqeust消息时就会在后面加上一个本地唯一的tag值。

·         Call-Id用来标识一个唯一的Session,整个Session期间的所有消息的Session-Id都是相同的。

·         Max-Forwards消息可被转发的最大次数,每经过一个Proxy,该值就会被减一。

·         CSeq该属性由一个整数和一个method名字两部分组成;整数部分的作用是用来对同一个Session中的Request消息进行排序的;从第一个Invite消息发出后,随后的所有Request消息(ACKCancel除外)中的CSeq值都依次加一。比如AliceBob的通话过程中Alice想修改会话的一些属性,于是她便发起第二个Invite消息,这个Invite消息中的CSeq就需要加一;在比如AliceBob发送了一个Invite消息,而Bob发回的200 OK发生延时,于是Alice又发送第二个Invite消息,此时对第一个Invite消息的200 OK到达,Alice根据200 OK中的CSeq便可以知道这是对第一个Invite消息的应答。Request消息CancelAck中的CSeq和与之对应的Invite消息中的CSeq值是一致的。

·         Via该属性记录了消息的路由。Request消息被生成的时候只有一个Via,那就是本地的URI,此后消息每经过一个ProxyProxy都会在消息中插入一个Via记录下自己的URI。当最终用户发挥Response消息时,会从Request消息中拷贝所有的Via,然后按照反序进行路由,每经过一个Proxy,该Proxy就会将包含自己URIVia删除,这样当Response消息最终到达Request发起端的时候就只剩下一个Via了。

·         Contact该属性包含了用户可以被直接找到的一个URIRequest发起方会在Request消息中加入该值,接收方会在第一个Response(该例中的180 Ring)中加入该值。利用这个URI,此后再发起Request消息时就直接发送到对方了,而无需经过Proxy,比如本例中的F12 ACK消息,由于之前通过交换Contact值,Alice知道如何能直接找到Bob,于是在第一行的SIP-URI中填上Bob所提供的Contact值,将ACK消息直接发送给Bob而无需经过Proxy,注意To中仍然是原先的值。

·         Route and Record-Route这两个属性都是有Proxy加入的;上面提到Contact属性可以让随后的Reqeust消息绕过Proxy而直接发给最终用户。有时候处于安全或者其他方面的原因,Proxy希望所有的消息都必须经过Proxy,那么这时候Proxy就需要在经过它的第一个Request消息中插入该属性记录自己的URI,这样此后的Request消息就必须按照该属性中指定的路径路由。

 

2. 对以上几个头部属性简单概括一下:

·         SIP-URI是一个Hop-to-Hop的属性,所以有可能被Proxy改变;

·         FromTo属性在消息的路由过程中一直保持不变;它们在Request消息中确定,此后对端发来的所有Response消息的FromTo都是原样拷贝Request消息中的FromTo

·         Via是用来帮助Response消息进行路由的,Contact是用来供随后的Request消息进行路由的。

参考资料:

1.  “RFC 3261”- Section 4Section 12Section 17Section 24

2.  “SIP Demystified”- Chapter 4 Chapter 5

<think> SIP中继路由和外线路由是VoIP通信中常见的两种路由方式,主要区别在于应用场景和路由目标: 1. **SIP中继路由(Trunk Routing)**: - 用于连接企业PBX与运营商或ITSP(互联网电话服务提供商) - 实现企业内部分机通过运营商的SIP中继拨打外部电话 - 通常基于被叫号码模式(如国际/国内前缀)选择不同中继 2. **外线路由(Outbound Routing)**: - 更广义的概念,指从本地网络向外部网络发送呼叫的路由 - 包含SIP中继路由,但也可包括其他出站路径(如PSTN网关、其他PBX等) 关键差异点: | 特性 | SIP中继路由 | 外线路由 | |--------------|-----------------------------|-----------------------------| | **物理媒介** | 纯IP(SIP协议) | 可能包含模拟/数字线路 | | **连接对象** | 运营商/ITSP | 运营商、其他分支机构、PSTN等 | | **配置目标** | 优化运营商链路使用 | 实现最经济/可靠的出局路径 | | **典型应用** | 企业拨打外线电话 | 包括中继在内的所有出局呼叫 | 实际系统中,SIP中继路由通常是外线路由的子集。例如: - 外线路由表可能包含: 1. 国际长途 -> 选择廉价SIP中继A 2. 本地固话 -> 选择传统PSTN网关 3. 紧急呼叫 -> 强制走PSTN(法规要求) 技术实现差异: - **SIP中继路由**依赖注册状态和SDP协商,通常需处理NAT穿越 - **外线路由**可能涉及协议转换(如SIP到ISDN) 总结:SIP中继是特定技术(SIP)的实现方式,外线路由是功能层面的概念。 </think> ### SIP中继路由与外线路由的区别 在SIP通信系统中,**中继路由(Trunk Routing)** 和 **外线路由(Outbound Routing)** 是两种不同的路由机制,主要区别如下: | **维度** | **SIP中继路由 (Trunk Routing)** | **外线路由 (Outbound Routing)** | |------------------|---------------------------------------------------|-----------------------------------------------| | **定义** | 运营商之间的SIP主干链路连接 | 本地网络向外部网络发起的呼叫路由 | | **主要目的** | 实现不同运营商/服务商之间的互联互通 | 处理用户设备向外部号码发起的呼叫 | | **路由方向** | 横向(运营商↔运营商) | 纵向(用户终端→外部网络) | | **典型应用场景** | 跨运营商呼叫、企业多线路切换、灾备路由 | 用户拨打外线电话、国际长途、特服号码 | | **技术特点** | 基于SIP URI路由<br>支持负载均衡<br>需要SIP协议协商 | 基于号码分析<br>支持呼叫权限控制<br>需要NAT穿越 | | **配置要素** | SIP对端IP/域名<br>认证凭证<br>容量限制 | 拨号规则<br>费率表<br>呼叫限制策略 | #### 具体说明: 1. **中继路由**: - 本质是**网络与网络之间的连接通道** - 例如:企业PBX通过SIP中继连接到电信运营商 - 关键技术:SIP TLS加密、SRTP媒体流、负载均衡算法 ```mermaid graph LR A[企业PBX] -- SIP中继 --> B[运营商A] A -- SIP中继 --> C[运营商B] ``` 2. **外线路由**: - 本质是**呼叫出站规则引擎** - 例如:员工拨打"0086..."自动选择最便宜运营商 - 关键技术:号码规范化、LCR(最低成本路由)、呼叫限制 ```mermaid graph TB D[分机1001] --> E{路由决策} E -->|国内长途| F[运营商A] E -->|国际长途| G[运营商B] ``` #### 典型配置差异: **中继路由配置示例**: ```ini [Trunk_OperatorA] type = sip host = sip.operatorA.com port = 5060 auth_user = company123 auth_pass = ******** max_calls = 30 ``` **外线路由配置示例**: ```ini [Outbound_Rule1] pattern = ^00\d+ # 国际号码 trunk = Trunk_OperatorB cost = 0.05/min # 费率 block = 001881 # 禁止拨打特定国家 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值