首頁(yè) 資訊 修復(fù)《Kamailio實(shí)戰(zhàn)》中的一個(gè)大Bug

修復(fù)《Kamailio實(shí)戰(zhàn)》中的一個(gè)大Bug

來(lái)源:泰然健康網(wǎng) 時(shí)間:2025年08月09日 09:40

2022-11-18 00:00[勘誤]

有讀者在《Kamailio實(shí)戰(zhàn)》第19頁(yè)發(fā)現(xiàn)一個(gè)大Bug。

原文是這樣的:

Record-Route

當(dāng)一個(gè)Proxy收到一個(gè)SIP消息時(shí),它可以決定是否留在SIP傳輸?shù)穆窂缴?,即后續(xù)的SIP消息是否還要經(jīng)過(guò)它。比如在A呼叫B的通信上,如果Proxy只起到“找到B”的作用,則它可以將第一個(gè)消息原樣傳送,B回送的消息將可以不經(jīng)過(guò)Proxy而直接回到A上,如圖1-14所示。

圖1-14

如果Proxy想保留在SIP路徑上,則它在將消息轉(zhuǎn)發(fā)到下一跳之前要把它自己的地址加到Record-Route頭域中。那么,當(dāng)B在回復(fù)響應(yīng)消息的時(shí)候,就回將消息回到Record-Route指定的地址上,如圖1-15所示。

圖1-15

↓↓↓ 修改以后的內(nèi)容如下(改得比較多):

Record-Route

當(dāng)一個(gè)代理服務(wù)器轉(zhuǎn)發(fā)一個(gè)SIP消息時(shí),它可以決定是否留在SIP傳輸?shù)穆窂缴?,即后續(xù)的SIP事務(wù)是否還要經(jīng)過(guò)它。比如在A呼叫B的通信上,如果代理服務(wù)器只起到“找到B”的作用,則它可以將第一個(gè)事務(wù)相關(guān)消息(包括INVITE和200 OK)進(jìn)行轉(zhuǎn)發(fā),而后續(xù)的事務(wù)(ACK以及BYE和200 OK)可以不經(jīng)過(guò)代理服務(wù)器而直接回到A上,如圖1-14所示。

圖1-14

如果代理服務(wù)器想保留在SIP路徑上,則它在進(jìn)行消息轉(zhuǎn)發(fā)時(shí)把它自己的地址加到Record-Route頭域中。那么,在后續(xù)的事務(wù)請(qǐng)求都會(huì)發(fā)到Record-Route指定的地址上,如圖1-15所示。

圖1-15

注意: SIP消息是以事務(wù)為單位的,所以Record-Route頭域會(huì)影響后續(xù)的事務(wù)。在同一個(gè)事務(wù)中,回復(fù)消息會(huì)回到請(qǐng)求消息Via頭域中的地址上(如果有rport則會(huì)回到接收到的消息的來(lái)源地址上1)。不同的事務(wù),如果有Record-Route頭域,則后域的事務(wù)請(qǐng)求消息(如ACK或BYE)會(huì)發(fā)到Record-Route頭域指定的地址上,否則,會(huì)發(fā)到Contact頭域指定的地址上。在實(shí)際應(yīng)用中,有時(shí)會(huì)遇到呼叫(INVITE-200 OK)能接通,但ACK或BYE收不到的情況,這時(shí)候就需要檢查第一個(gè)事務(wù)中的Record-Route或Contact頭域是否正確。這種情況經(jīng)常會(huì)出現(xiàn),尤其是在網(wǎng)絡(luò)中有NAT的情況下。

有了上面這些基礎(chǔ)知識(shí),下面我們可以看看Kamailio的應(yīng)用了。事實(shí)上,這些基礎(chǔ)知識(shí)略枯燥,也不是那么容易懂,也可以先學(xué)習(xí)后面的內(nèi)容,再回過(guò)來(lái)復(fù)習(xí)這部分,或許更有助于理解。

↑↑↑ 以上是修改后的內(nèi)容,勘誤到此結(jié)束。

其實(shí),Record-Route跟轉(zhuǎn)發(fā)是否有狀態(tài)是兩個(gè)不同的概念,這個(gè)概念在SIP中是有用的,但是在SIP Proxy中是沒(méi)有用的。在SIP中,Record-Route是用來(lái)保留SIP路徑的,而轉(zhuǎn)發(fā)是否有狀態(tài)是用來(lái)保留SIP事務(wù)的。在SIP Proxy中,Record-Route是沒(méi)有用的,因?yàn)镻roxy不會(huì)保留SIP路徑,而轉(zhuǎn)發(fā)是否有狀態(tài)是有用的,因?yàn)镻roxy需要保留SIP事務(wù)(比如收到一個(gè)200 OK回復(fù)消息是否能找到先前對(duì)應(yīng)的請(qǐng)求消息,如果找不到,就是無(wú)狀態(tài)的;如果能找到,就是有狀態(tài)的,就能進(jìn)行更多的出錯(cuò)處理,如進(jìn)行失敗處理、繼續(xù)走備用路由等)。

出現(xiàn)這個(gè)Bug的原因是我對(duì)SIP的研究不夠深入,沒(méi)有做足夠的驗(yàn)證,弄混了Record-Route與轉(zhuǎn)發(fā)是否有狀態(tài)的區(qū)別。接受大家批評(píng)。

唯一值得欣慰的是很多讀者都對(duì)出現(xiàn)這個(gè)錯(cuò)誤表示理解,并說(shuō)由于這個(gè)錯(cuò)誤加深了對(duì)這些概念的認(rèn)識(shí),更有用。

感謝大家的理解與支持。退一萬(wàn)步講,治學(xué)還是應(yīng)該嚴(yán)謹(jǐn)?shù)摹?shū)中還有其它印刷錯(cuò)誤,我會(huì)在后續(xù)的版本中一并修正。

完整的勘誤信息在這里:/correction.html。

關(guān)于rport參見(jiàn)后面3.1.7節(jié)(19)。這個(gè)說(shuō)法也不是絕對(duì)的。有些UAS實(shí)現(xiàn)中,為了防止被惡意攻擊,會(huì)忽略rport,而是嚴(yán)格使用Via頭域中的地址;而有的UAS實(shí)現(xiàn)中,即使沒(méi)有rport,也會(huì)當(dāng)作有rport來(lái)處理,這樣更便于NAT穿越。 ?

相關(guān)知識(shí)

「iOS」修復(fù)bug,開(kāi)啟電池健康的重新校準(zhǔn)
和平精英怎么卡自動(dòng)開(kāi)槍BUG 卡自動(dòng)開(kāi)槍BUG操作教程
八號(hào)補(bǔ)丁更新日志:崩潰修復(fù)與玩法優(yōu)化
王者榮耀新版本健康系統(tǒng)驚現(xiàn)BUG,玩家歡樂(lè)變憂(yōu)慮
如何在刷機(jī)過(guò)程中修復(fù)電池健康?
電池壽命修復(fù)大師官方版
iOS10.1健康數(shù)據(jù)問(wèn)題及iOS10.1.1修復(fù)解析
iOS8的健康應(yīng)用/可能遇到的Bug
王瑞雪 針灸 手法私密婦科骨盆修復(fù)實(shí)戰(zhàn)技法!
六熾西游大戰(zhàn)僵尸2輔助

網(wǎng)址: 修復(fù)《Kamailio實(shí)戰(zhàn)》中的一個(gè)大Bug http://m.u1s5d6.cn/newsview1655735.html

推薦資訊