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,可以參考對照一下。
沒有留言:
張貼留言