2008年3月26日 星期三

SIP Intro --- CANCEL method

CANCEL method的介紹

本節將會介紹CANCEL這個method,因為最近有focus這部分。

這個例子之前有說過

Alice                     Bob
|                        |
|       INVITE F1        |
|----------------------->|
|    180 Ringing F2      |
|<-----------------------|
|                        |
|       200 OK F3        |
|<-----------------------|
|         ACK F4         |
|----------------------->|
|   Both Way RTP Media   |
|<======================>|
|                        |
|         BYE F5         |
|<-----------------------|
|       200 OK F6        |
|----------------------->|
|                        |


我將以這個為基礎,說明CANCEL這個method的用法。首先,CANCEL的用途在於取消掉某一個REQUEST(就如這個例子的INVITE),而使用時有一個前提,就是要在RESPONSE之前送出,也就是說如果已經收到RESPONSE(2XX),則不能送CANCEL了,只能送BYE。而且要接收到Provisional response後才能送CANCEL。

OK,有了傳送的條件後,再來說CANCEL要有什麼內容限制。Request-URI、Call-ID、To、CSeq的數字部分、From(也包含了其tags)必須要跟要取消掉的REQUEST的內容一致,還有Via裡只能有一個值,這個值只能是打算要取消掉的REQUEST的Via中第一筆數據。這個內容限制就是用來找出妳要CANCEL的REQUEST(transaction)。如果沒有符合以上內容,則收到CANCEL的User Agent無法找到對應的transaction(call),UA就會回覆一個481 Call/Transaction does not exist。

符合有了以上的規範,才能正確的cancel掉妳想要cancel的request,UA就會回覆一個487 Request terminated!

成功CANCEL就會如下

Alice                      Bob
|                           |
|         INVITE F1         |
|-------------------------->|
|      180 Ringing F2       |
|<--------------------------|
|         CANCEL F3         |
|-------------------------->|
| 487 Request terminated F4 |
|<--------------------------|
|           ACK F5          |
|-------------------------->|



不成功的會像下面這樣子

Alice                         Bob
|                           |
|         INVITE F1         |
|-------------------------->|
|      180 Ringing F2       |
|<--------------------------|
|         CANCEL F3         |
|-------------------------->|
|   481 Call not exist F4   |(Call/Transaction 
|<--------------------------|  does not exist)
|           ACK F5          |
|-------------------------->|


以下是用Etherea抓的INVITE與CANCEL,可以參考對照一下。



沒有留言:

搜尋此網誌