亚洲综合伊人,成人欧美一区二区三区视频不卡,欧美日韩在线高清,日韩国产午夜一区二区三区,大胆美女艺术,一级毛片毛片**毛片毛片,你瞅啥图片

您當(dāng)前的位置是:  首頁(yè) > 資訊 > 國(guó)內(nèi) >
 首頁(yè) > 資訊 > 國(guó)內(nèi) >

完整SIP/SDP媒體協(xié)商概論-STUN連接檢查-服務(wù)器端流程

2020-04-23 09:05:59   作者:james.zhu    來(lái)源:Asterisk開(kāi)源派   評(píng)論:0  點(diǎn)擊:


  在上一篇文章中,筆者討論了STUN 連接檢查的客戶端的處理流程。接下來(lái),在本章節(jié),筆者繼續(xù)討論關(guān)于服務(wù)器端的處理流程。
  客戶端發(fā)送綁定請(qǐng)求后,對(duì)端agent必須準(zhǔn)備好接收綁定請(qǐng)求,這個(gè)綁定請(qǐng)求是發(fā)送到了每個(gè)候選地址的基準(zhǔn)地址。綁定請(qǐng)求包含在自己最近的offer或者answer消息中。因此,即使agent是一個(gè)輕量級(jí)部署場(chǎng)景的agent,它也要求部署方案維持一個(gè)狀態(tài)來(lái)處理服務(wù)器端的流程。
  接收綁定請(qǐng)求時(shí),agent必須使用短期安全機(jī)制對(duì)請(qǐng)求進(jìn)行認(rèn)證和消息完整性檢查。Agent必須考慮用戶名稱的有效性,如果用戶名稱含有兩個(gè)用戶名稱構(gòu)成的(通過(guò)冒號(hào):分割),其中第一個(gè)用戶名稱等于一個(gè)用戶名稱,這個(gè)用戶在此會(huì)話中,由agent在offer或者answer生成的名稱。關(guān)于名稱構(gòu)成的討論,讀者可以查閱上一篇文章。有時(shí)也存在其他的可能性,例如,提供方offerer在收到對(duì)端peer的answer之前一個(gè)收到一個(gè)綁定請(qǐng)求。如果這樣的情況發(fā)生,agent必須馬上生成一個(gè)響應(yīng)消息,響應(yīng)消息中包含映射地址的計(jì)算數(shù)據(jù)。在這一時(shí)間點(diǎn),agent已經(jīng)具備了足夠的信息生成響應(yīng)消息。因此,agent就不需要對(duì)端peer的密碼。一旦agent收到answer以后,這個(gè)answer消息就會(huì)馬上通過(guò)幾個(gè)步驟進(jìn)行處理,包括檢查修復(fù)角色沖突的流程,計(jì)算映射地址的流程,通過(guò)學(xué)習(xí)獲得peer反射候選地址,Triggered Checks和更新推薦標(biāo)識(shí)。提醒讀者,以上這些流程都是針對(duì)全部署場(chǎng)景agent來(lái)說(shuō)的。還有一些場(chǎng)景中,在收到answer之前,收到了多個(gè)STTUN請(qǐng)求,這樣就會(huì)導(dǎo)致在triggered check 隊(duì)列中生成多個(gè)配對(duì)隊(duì)列。
  Agent一定不能使用ALTERNATE-SERVER機(jī)制,也一定不能支持RFC3489規(guī)范的向后兼容機(jī)制,它必須使用FINGERPRINT機(jī)制。
  如果agent在媒體數(shù)據(jù)中(例如在QoS中)使用了區(qū)分服務(wù)-Diffserv(遵從RFC2475),agent也應(yīng)該使用同樣的標(biāo)識(shí)方式在綁定請(qǐng)求的響應(yīng)中。因?yàn)閰^(qū)分服務(wù)不在我們討論的范圍,具體關(guān)于Diffserv,讀者查閱RFC2475,這里不做進(jìn)一步討論。以下幾個(gè)步驟的討論將僅涉及全部署場(chǎng)景的agent處理流程。
  1、檢測(cè)修復(fù)角色沖突
  正常情況下,通過(guò)agent的主控/被控方選擇,雙方可以選擇自己的成功的角色。但是,在一些非正常的環(huán)境中,例如使用了第三方的呼叫控制,雙方都成為同樣的角色。下面,筆者將討論如何檢查同一角色沖突問(wèn)題,以及如何修復(fù)同一角色沖突問(wèn)題。
  Agent必須檢查綁定請(qǐng)求,其屬性可能是ICE- CONTROLLING或ICE-CONTROLLED 屬性。如果要檢查以上兩種屬性,agent需要按照以下流程進(jìn)行:
  • 如果在請(qǐng)求中,其屬性既不是ICE-CONTROLLING,也不是ICE-CONTROLLED屬性的話,說(shuō)明agent沒(méi)有遵從RFC5245規(guī)范,這里有角色沖突的問(wèn)題,但是agent目前執(zhí)行不了檢測(cè)。
  • 如果agent是一個(gè)被控方角色,并且請(qǐng)求中出現(xiàn)了ICE-CONTROLLING屬性,接下來(lái)根據(jù)具體屬性內(nèi)容大小進(jìn)行判斷:
  • 如果agent的tie-breaker大于或等于ICE-CONTROLLING的內(nèi)容,此agent生成一個(gè)綁定錯(cuò)誤響應(yīng),錯(cuò)誤響應(yīng)中包含一個(gè)ERROR-CODE屬性(487-角色沖突),這里,agent角色仍然保持不變。
  • 如果agent的tie-breaker小于ICE-CONTROLLING的內(nèi)容,agent切換到主控方agent角色。
  • 如果agent是一個(gè)主控方agent角色,并且請(qǐng)求中出現(xiàn)了ICE-CONTROLLED屬性,接下來(lái)根據(jù)具體屬性內(nèi)容進(jìn)行判斷:
  • 如果agent的tie-breaker大于或等于ICE-CONTROLLED的內(nèi)容,agent切換到被控方角色。
  • 如果agent的tie-breaker小于ICE-CONTROLLED的內(nèi)容, 此agent生成一個(gè)綁定錯(cuò)誤響應(yīng),錯(cuò)誤響應(yīng)中包含一個(gè)ERROR-CODE屬性(487-角色沖突),這里,agent角色仍然保持不變。
  • 如果agent是主控方角色agent,并且ICE-CONTROLLING屬性出現(xiàn)在了請(qǐng)求中,或者agent是被控方角色agent,并且ICE-CONTROLLED屬性出現(xiàn)在了請(qǐng)求中,雙方角色無(wú)沖突。
  修改了agent角色以后,需要對(duì)角色的狀態(tài)進(jìn)行修復(fù)。因?yàn)楦髯越巧膬?yōu)先級(jí)是主控方和被控方的主要執(zhí)行功能,因此agent修改屬性不是簡(jiǎn)單切換角色就完成了工作流程。修改角色需要agent重新計(jì)算配對(duì)優(yōu)先級(jí)。這個(gè)計(jì)算方式我們?cè)谇懊娴臍v史文章中有非常詳細(xì)地介紹,讀者可查閱此文章。agent角色切換或者修改同樣也會(huì)直接影響agent其他后續(xù)的功能執(zhí)行,例如,它是否負(fù)責(zé)選擇推薦配對(duì),是否基于ICE結(jié)果生成更新offer的消息。
  假設(shè)STUN服務(wù)器端對(duì)綁定請(qǐng)求生成了成功的響應(yīng)的話,甚至于agent角色也發(fā)生了變化,agent可以繼續(xù)執(zhí)行其余服務(wù)器端的步驟:計(jì)算映射地址,通過(guò)學(xué)習(xí)獲得peer反射候選地址等流程。
  2、計(jì)算映射地址
  對(duì)于在轉(zhuǎn)發(fā)候選地址收到的請(qǐng)求來(lái)說(shuō),被STUN流程(即XOR-MAPPED-ADDRESS屬性生成)使用的源傳輸?shù)刂肥且粋(gè)傳輸?shù)刂,這個(gè)傳輸?shù)刂肥潜籗TUN認(rèn)為的傳輸?shù)刂。讀者在計(jì)算映射地址是一定要注意,這里涉及了兩種綁定請(qǐng)求的傳輸方式(Data Indication和ChannelData)。如果綁定請(qǐng)求通過(guò)Data Indication傳輸?shù)脑,這個(gè)源傳輸?shù)刂窌?huì)出現(xiàn)在Data Indication消息的XOR-MAPPED-ADDRESS屬性中。如果綁定請(qǐng)求通過(guò)ChannelData傳輸?shù)脑,這個(gè)源傳輸?shù)刂肥墙壎ù薱hannel 通道的地址。關(guān)于Data Indication消息和ChannelData的定義細(xì)節(jié),讀者查閱以下兩個(gè)規(guī)范草案:
  • Data Indication:https://tools.ietf.org/id/draft-rosenberg-midcom-turn-08.txt
  • ChannelData:https://tools.ietf.org/html/rfc5766-10
  3、學(xué)習(xí)Peer Reflexive Candidates
  如果請(qǐng)求中的源傳輸?shù)刂凡荒芷ヅ淙魏维F(xiàn)存遠(yuǎn)端候選地址的話,這說(shuō)明對(duì)端的是一個(gè)新的peer反射候選地址。這個(gè)候選地址需要通過(guò)以下方式進(jìn)行構(gòu)建:
  • 此候選地址的優(yōu)先級(jí)設(shè)置為請(qǐng)求中獲得的PRIORITY 屬性值。
  • 候選地址類型設(shè)置為peer reflexive。
  • 候選地址的foundation設(shè)置為一個(gè)任意值,這個(gè)foundation必須區(qū)別于所有其他遠(yuǎn)端候選地址的foundation。如果在SDP的后續(xù)的offer/answer交互中包含了peer reflexive候選地址,這將表示對(duì)此候選地址來(lái)說(shuō),這是一個(gè)真實(shí)的foundation。
  • 此候選地址的component ID設(shè)置為一個(gè)component ID,這個(gè)ID是為本地候選地址到遠(yuǎn)端地址(發(fā)送請(qǐng)求的地址)。
  • 構(gòu)建候選地址完成后,這個(gè)候選地址將被添加到遠(yuǎn)端候選地址列表中。但是,agent還不會(huì)使用本地候選地址和這個(gè)遠(yuǎn)端候選地址進(jìn)行配對(duì)處理。在triggered check流程會(huì)進(jìn)行本地候選地址和其配對(duì)的處理。
  4、Triggered Checks處理
  下一步,agent將會(huì)構(gòu)建配對(duì),在此配對(duì)中,本地候選地址等同于STUN請(qǐng)求接收的傳輸?shù)刂,遠(yuǎn)端候選地址等同于源傳輸?shù)刂罚ㄟ@是請(qǐng)求發(fā)出的地址),這個(gè)地址可能是通過(guò)學(xué)習(xí)獲得的一個(gè)peer reflexive 遠(yuǎn)端候選地址。本地候選地址將是主機(jī)候選地址(這種情況下,請(qǐng)求可能不是通過(guò)轉(zhuǎn)發(fā)候選地址獲得),或者本地候選地址是一個(gè)轉(zhuǎn)發(fā)候選地址(這種情況下,請(qǐng)求通過(guò)轉(zhuǎn)發(fā)地址獲得)。此本地候選地址從來(lái)不會(huì)是服務(wù)器端反射地址。因?yàn)檫@兩個(gè)候選地址對(duì)agent來(lái)說(shuō)都是可知的,所以,agent可以獲得它們的配對(duì),然后計(jì)算其候選配對(duì)優(yōu)先級(jí)。接下來(lái),這個(gè)配對(duì)會(huì)查詢檢查列表。通過(guò)查詢檢查列表可能獲得其中一個(gè)結(jié)果:
  • 如果配對(duì)已在檢查列表中,繼續(xù)執(zhí)行以下四種檢查:
  • 如果配對(duì)在等待或封凍狀態(tài),如果檢查沒(méi)有出現(xiàn)在triggered check隊(duì)列中,把此配對(duì)的檢查流程加入到triggered check隊(duì)列中。
  • 如果配對(duì)在In-Progress 狀態(tài),agent將會(huì)取消這個(gè)事務(wù)處理。這里取消的意思是agent將不在重傳請(qǐng)求,將不會(huì)認(rèn)為缺乏響應(yīng)是失敗的,但是會(huì)在事務(wù)超時(shí)時(shí)間內(nèi)對(duì)此響應(yīng)執(zhí)行等待流程。另外,通過(guò)對(duì)agent進(jìn)行隊(duì)列排序,此agent將會(huì)被加入到triggered check隊(duì)列中,因此會(huì)讓agent創(chuàng)建一個(gè)新的連接檢查,然后,agent必須對(duì)此配對(duì)創(chuàng)建一個(gè)新的連接檢查(重新作為一個(gè)新的STUN綁定請(qǐng)求事務(wù))。最后,這個(gè)配對(duì)的狀態(tài)切換為等待狀態(tài)。
  • 如果配對(duì)狀態(tài)是失敗狀態(tài),此狀態(tài)必須切換為等待狀態(tài),并且通過(guò)把a(bǔ)gent加入triggered check隊(duì)列,由此觸發(fā)agent創(chuàng)建一個(gè)新的連接檢查。接下來(lái),agent必須為這一對(duì)配對(duì)創(chuàng)建一個(gè)新的檢查連接(重新作為一個(gè)新的STUN綁定請(qǐng)求事務(wù))。
  • 如果配對(duì)狀態(tài)是成功狀態(tài),agent則無(wú)需執(zhí)行進(jìn)一步處理步驟。
  • 當(dāng)雙方agent在NAT背后時(shí),通過(guò)以上步驟處理來(lái)支持ICE的快速處理。
  如果配對(duì)不在檢查列表時(shí),需要進(jìn)行執(zhí)行以下流程:
  • 基于配對(duì)優(yōu)先級(jí),配對(duì)會(huì)插入到檢查列表中
  • 配對(duì)狀態(tài)設(shè)置為等待狀態(tài)
  • 配對(duì)會(huì)加入到triggered check隊(duì)列中
  加入到triggered check隊(duì)列以后,triggered check隊(duì)列將會(huì)被發(fā)送出去。當(dāng)triggered check隊(duì)列發(fā)送以后,其構(gòu)建和處理的流程按照前面討論的發(fā)送請(qǐng)求來(lái)處理。具體關(guān)于發(fā)送請(qǐng)求的詳情,讀者可參與筆者上一篇文章,或者查閱RFC5245-7.1.2,這里不再重復(fù)。這些流程要求agent獲得一個(gè)傳輸?shù)刂,部分用戶名(username fragment),對(duì)端peer密碼。這里讀者還要再次注意用戶名稱和密碼的設(shè)置。遠(yuǎn)端候選地址的用戶名稱(username fragment)等于收到的綁定請(qǐng)求中,冒號(hào)后面的USERNAME名稱,agent使用此用戶名稱檢查從peer收到的SIP消息(可能從多個(gè)分叉中檢查),然后找到此用戶名稱(username fragment),然后通過(guò)此用戶名稱選擇相應(yīng)的密碼。關(guān)于用戶名稱和密碼構(gòu)成的處理方式,讀者可以參考上一篇文章中的介紹。
  5、更新推薦Flag標(biāo)識(shí)
  • 如果必要,配對(duì)的推薦方式標(biāo)識(shí)也是需要更新的。如果agent收到了一個(gè)綁定請(qǐng)求,綁定請(qǐng)求中已有一個(gè)USE-CANDIDATE設(shè)置屬性,并且這個(gè)agent是一個(gè)主控方agent,agent將會(huì)查看配對(duì)狀態(tài)(根據(jù)上一個(gè)討論中的計(jì)算方式),并且繼續(xù)進(jìn)行判斷處理:
  • 如果這個(gè)配對(duì)狀態(tài)是成功狀態(tài),這表示由這對(duì)配對(duì)生成的檢查流程生成了一個(gè)成功的響應(yīng)。這會(huì)引起agent的一個(gè)更新處理。當(dāng)成功響應(yīng)收到以后,agent會(huì)構(gòu)建一對(duì)有效配對(duì)。關(guān)于構(gòu)建有效配對(duì)的流程,讀者可以參考筆者的客戶端流程處理的文章。構(gòu)建配對(duì)后,agent會(huì)將配對(duì)的推薦標(biāo)識(shí)設(shè)置為true值。這樣的設(shè)置方式可能會(huì)結(jié)束此媒體流的ICE處理流程。
  • 如果配對(duì)狀態(tài)是In-Progress狀態(tài)的話,如果agent的檢查流程生成了成功的結(jié)果,當(dāng)響應(yīng)抵達(dá)時(shí),隨之生成的有效配對(duì)已確定了的推薦標(biāo)識(shí)設(shè)置。當(dāng)響應(yīng)抵達(dá)時(shí),這樣的設(shè)置方式可能會(huì)結(jié)束此媒體流的ICE處理流程。關(guān)于ICE結(jié)束處理流程的討論,筆者將在下一篇文章做做詳細(xì)說(shuō)明。
  6、針對(duì)Lite部署的額外流程處理討論
  本文章中以上討論的都是基于全場(chǎng)景部署的agent的討論。輕量級(jí)的部署場(chǎng)景agent的處理相對(duì)比較簡(jiǎn)單,使用的場(chǎng)景也不是非常普遍,因此沒(méi)有太多的約定條件(沒(méi)有優(yōu)先級(jí),foundation等計(jì)算設(shè)置,沒(méi)有隊(duì)列檢查等流程)。這里,筆者針對(duì)輕量級(jí)部署場(chǎng)景的agent做一些簡(jiǎn)單說(shuō)明,希望讀者引起注意。如果收到的check消息中包含了USE-CANDIDATE設(shè)置屬性,agent將需要構(gòu)建一個(gè)候選配對(duì)。其中候選配對(duì)中,本地候選地址等于傳輸?shù)刂罚ㄊ盏秸?qǐng)求的地址),遠(yuǎn)端候選地址等于一個(gè)源傳輸?shù)刂罚ㄗ⒁,這個(gè)地址是收到請(qǐng)求的源傳輸?shù)刂罚?gòu)建成的候選配對(duì)設(shè)定一個(gè)任意優(yōu)先級(jí),然后推送到有效候選列表中(valid list)。Agent然后設(shè)置這對(duì)候選配對(duì)的推薦標(biāo)識(shí)為true。針對(duì)媒體流的每個(gè)構(gòu)件模塊,如果這個(gè)有效候選列表包含了一對(duì)候選配對(duì),媒體流的ICE處理流程將被視作完成狀態(tài)。
  到此為止,結(jié)合上一篇文章中關(guān)于STUN客戶端處理流程介紹,筆者已經(jīng)完成了關(guān)于ICE連接檢查的討論(客戶端處理流程和本章節(jié)的服務(wù)器端處理流程)。在接下來(lái)的章節(jié)中,筆者將重點(diǎn)討論關(guān)于ICE結(jié)束處理的流程。
  參考資料:
  https://tools.ietf.org/html/rfc5766
  https://www.rfc-editor.org/rfc/rfc8445
 
  關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的Asterisk行業(yè)分享
  Asterisk freepbx FreeSBC技術(shù)文檔: www.freepbx.org.cn
  融合通信/IPPBX商業(yè)解決方案:www.hiastar.com
  如何使用FreeSBC,qq技術(shù)分享群:334023047, www.freesbc.cn
 

【免責(zé)聲明】本文僅代表作者本人觀點(diǎn),與CTI論壇無(wú)關(guān)。CTI論壇對(duì)文中陳述、觀點(diǎn)判斷保持中立,不對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請(qǐng)讀者僅作參考,并請(qǐng)自行承擔(dān)全部責(zé)任。

專題

CTI論壇會(huì)員企業(yè)

平泉县| 喀喇沁旗| 闸北区| 阿克苏市| 抚宁县| 当雄县| 双牌县| 太原市| 霍州市| 南阳市| 通道| 平凉市| 长葛市| 高唐县| 农安县| 应城市| 宣化县| 建水县| 富宁县| 巩义市| 静宁县| 额敏县| 长顺县| 临沭县| 靖西县| 双牌县| 延边| 天台县| 大英县| 五常市| 安塞县| 龙南县| 英德市| 浙江省| 德江县| 台前县| 文水县| 永丰县| 湛江市| 乡城县| 鲜城|