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-URI:Request消息的第一行中method后面緊跟的部分就是Request-URI(本例中的sip:bob@biloxi.com)。該值在消息經過Proxy之后就有可能發生變化,變成消息路徑中Next Hop的URI。
·???????? 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消息(ACK和Cancel除外)中的CSeq值都依次加一。比如Alice與Bob的通話過程中Alice想修改會話的一些屬性,于是她便發起第二個Invite消息,這個Invite消息中的CSeq就需要加一;在比如Alice給Bob發送了一個Invite消息,而Bob發回的200 OK發生延時,于是Alice又發送第二個Invite消息,此時對第一個Invite消息的200 OK到達,Alice根據200 OK中的CSeq便可以知道這是對第一個Invite消息的應答。Request消息Cancel和Ack中的CSeq和與之對應的Invite消息中的CSeq值是一致的。
·???????? Via:該屬性記錄了消息的路由。Request消息被生成的時候只有一個Via,那就是本地的URI,此后消息每經過一個Proxy,Proxy都會在消息中插入一個Via記錄下自己的URI。當最終用戶發揮Response消息時,會從Request消息中拷貝所有的Via,然后按照反序進行路由,每經過一個Proxy,該Proxy就會將包含自己URI的Via刪除,這樣當Response消息最終到達Request發起端的時候就只剩下一個Via了。
·???????? Contact:該屬性包含了用戶可以被直接找到的一個URI,Request發起方會在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改變;
·???????? From和To屬性在消息的路由過程中一直保持不變;它們在Request消息中確定,此后對端發來的所有Response消息的From和To都是原樣拷貝Request消息中的From和To;
·???????? Via是用來幫助Response消息進行路由的,Contact是用來供隨后的Request消息進行路由的。
參考資料:
1.? “RFC 3261”- Section 4,Section 12,Section 17,Section 24;
2.? “SIP Demystified”- Chapter 4, Chapter 5;總結
 
                            
                        - 上一篇: 民生女人花信用卡免息期多久
- 下一篇: 民生女人花信用卡,你对它了解多少?
