12.2.1.2 Processing the Responses
UAC將會(huì)從事務(wù)層收到一個(gè)請(qǐng)求的響應(yīng)消息。如果客戶端事務(wù)返回一個(gè)超時(shí)的話,此錯(cuò)誤看作是一個(gè)408(請(qǐng)求超時(shí))響應(yīng)。
UAC處理方式需要注意。如果此UAC收到了一個(gè)針對(duì)一個(gè)請(qǐng)求返回的3xx響應(yīng),此請(qǐng)求是在一個(gè)dialog中發(fā)送到請(qǐng)求,那么,此UAC處理方式和dialog外部發(fā)送到請(qǐng)求處理方式相同。具體的討論參考Section 8.1.3.4。
注意,但是,當(dāng)UAC嘗試可選地址時(shí),它仍然使用路由組支持此dialog創(chuàng)建請(qǐng)求的 Route頭。
當(dāng)UAC收到一個(gè)針對(duì)目的地刷新請(qǐng)求的2xx響應(yīng)時(shí),如果出現(xiàn)了遠(yuǎn)端目的地URL的話,UAC必須用此響應(yīng)中的Contact頭的URL替換dialog的遠(yuǎn)端目的地( remote target URI)。
如果在dialog中的請(qǐng)求響應(yīng)是一個(gè)481錯(cuò)誤(Call/Transaction Does Not Exist) 或者一個(gè)408 (Request Timeout)的話,UAC應(yīng)該結(jié)束此dialog。UAC也應(yīng)該結(jié)束完全無請(qǐng)求響應(yīng)回復(fù)的dialog(此客戶端事務(wù)層將會(huì)通知TU超時(shí)的結(jié)果)。
對(duì)于以INVITE發(fā)起的dialogs,通過發(fā)送一個(gè)BYE消息來結(jié)束dialog。
12.2.2 UAS Behavior
在dialog中發(fā)送的請(qǐng)求就像其他請(qǐng)求一樣,它是一個(gè)原子的核心請(qǐng)求。如果UAS接受了一個(gè)特別的請(qǐng)求,所有和它關(guān)聯(lián)的狀態(tài)修改都要被執(zhí)行。如果此請(qǐng)求被拒絕的話,不執(zhí)行任何狀態(tài)修改的流程。
注意,一些請(qǐng)求,例如,INVITE請(qǐng)求,它們會(huì)影響一些狀態(tài)改變。
UAS將會(huì)從事務(wù)層收到此請(qǐng)求。如果此請(qǐng)求在To頭中包含一個(gè)tag標(biāo)簽,UAS core會(huì)處理dialog身份確認(rèn),和此請(qǐng)求保持一致,然后通過現(xiàn)有的dialogs和此dialog進(jìn)行對(duì)比。如果對(duì)比匹配的話,那將確認(rèn)這是一個(gè)mid-dialog 請(qǐng)求。在此情況下,UAS首先使用同樣的針對(duì)外部dialog請(qǐng)求的處理規(guī)則來執(zhí)行處理流程,具體的討論在Section 8.2中。
如果此請(qǐng)求的To頭中包含了一個(gè)并且tag,但是,dialog身份確認(rèn)不能匹配當(dāng)前存在的任何dialog時(shí),UAS可能已經(jīng)出現(xiàn)系統(tǒng)崩潰然后重新啟動(dòng),或者維持現(xiàn)有狀態(tài),這里,此UAS可能已經(jīng)收到一個(gè)請(qǐng)求,這個(gè)請(qǐng)求可能是支持了不同的(失敗的)UAS(這些UAS有能力構(gòu)建To標(biāo)簽,因此那個(gè)UAS可以通過此tag標(biāo)簽來確認(rèn)請(qǐng)求,這些標(biāo)簽是用來支持UAS提供失敗恢復(fù)狀態(tài)的標(biāo)簽)。另外一種可能是,收到的請(qǐng)求可能已經(jīng)執(zhí)行了錯(cuò)誤路由;赥o tag標(biāo)簽,UAS可能接受或者拒絕此請(qǐng)求。接受此請(qǐng)求可以為To tag標(biāo)簽提供健壯性,因此dialog可以維持持續(xù)性,甚至UAS崩潰。希望支持這種能力的UA必須考慮前面的這一點(diǎn)。在處理過程中可能出現(xiàn)一些問題,例如UA重啟時(shí)選擇了嚴(yán)格遞增CSeq 序列號(hào),重構(gòu)路由組和接受超出范圍的RTP時(shí)間戳和序列號(hào)碼。
如果UAS想解決此請(qǐng)求的,因?yàn)閁AS不想重新創(chuàng)建此dialog,UAS必須針對(duì)其請(qǐng)求回復(fù)一個(gè)481響應(yīng)(Call/Transaction Does Not Exist)狀態(tài)響應(yīng)碼,并且發(fā)送此響應(yīng)到服務(wù)器事務(wù)層。
如果此請(qǐng)求沒有通過任何方式修改dialog狀態(tài)的話,此請(qǐng)求可能就會(huì)在dialog中收到(例如,OPTIONS請(qǐng)求)。對(duì)它們的處理方式就像外部dialog中收到的請(qǐng)求一樣。
如果遠(yuǎn)端序列號(hào)為空,此序列號(hào)必須設(shè)置為在請(qǐng)求中CSeq頭的序列號(hào)值。如果遠(yuǎn)端序列號(hào)不為空,但是請(qǐng)求中的序列號(hào)值低于遠(yuǎn)端序列號(hào)的話,此請(qǐng)求已經(jīng)排序異常,必須返回一個(gè)500(Server Internal Error)錯(cuò)誤響應(yīng)碼。如果遠(yuǎn)端序列號(hào)不為空,并且請(qǐng)求的序列號(hào)大于遠(yuǎn)端的序列號(hào)值,此請(qǐng)求是按續(xù)處理的。本地CSeq序列號(hào)大于遠(yuǎn)端CSeq序列號(hào)一位數(shù)是可能存在的。這本身不是一個(gè)錯(cuò)誤狀態(tài),UAS應(yīng)該準(zhǔn)備好接收處理類似的請(qǐng)求,這樣的請(qǐng)求中攜帶的CSeq值會(huì)高于前一個(gè)接收的請(qǐng)求的CSeq值。
如果代理對(duì)一個(gè)由UAC生成的請(qǐng)求進(jìn)行驗(yàn)證的話,此UAC需要重新提交攜帶安全消息的請(qǐng)求。重新提交請(qǐng)求將會(huì)生成一個(gè)新的CSeq序列號(hào)。因?yàn)閁AS從來沒有看到過第一個(gè)請(qǐng)求,因此,UA會(huì)在CSeq序列號(hào)位置提示間斷,這樣的間斷不代表任何錯(cuò)誤狀態(tài)消息。
當(dāng)UAS收到一個(gè)目的地刷新請(qǐng)求時(shí),它必須使用此請(qǐng)求中Contact頭中的URL替換dialog中的遠(yuǎn)端目的地URL地址(如果存在的話)。