SIP INVITE - 小蘿蔔工作室Little Robot Studio

文章推薦指數: 80 %
投票人數:10人

SIP (Session Initiation Protocol) 協定的主要目的就是建立會話(Session),由SIP INVITE 負責建立,需要連帶支援ACK 確認建立結果、CANCEL 取消進行 ... 2010年10月26日星期二 SIPINVITE SIP(SessionInitiationProtocol)協定的主要目的就是建立會話(Session),由SIPINVITE負責建立,需要連帶支援ACK確認建立結果、CANCEL取消進行建立、跟BYE結束通話,才能完整處理相關基本動作。

建立過程中,會溝通通話方式,通常是用SDP描述RTP傳遞資訊的參數。

在通話中,INVITE也用來更改通話方式。

另一種更改通話方式是用SIPUPDATE。

另外在通話中可用INFO交換資訊。

成功通話建立流程大致如下: CallerCallee |INVITE| |----------------------->| |180Ringing| || |RTPMedia| |<======================>| |BYE| || 首先是INVITETransaction,發話端發出INVITE要求和受話端建立通話,受話端回應180Ringing表示振鈴中、然後200OK表示接通。

再用ACK確定收到200OK。

通話結束後,任一方可發起BYETransaction結束通話。

Transaction有重送機制,請求會重送直到收到回應,另一端收到重送的請求會重送回應,可確定請求和回應都有收到。

不同的是INVITE一般會有臨時回應1xx,收到後就停止重送了,最後回應也可能遺失而不知道最後結果,所以INVITETransaction設計有額外的ACK,還沒收到ACK前最後回應(200OK或其它)會重送。

上述RTPMedia可能早在180就已經建立 如果中間有Proxy的情形 CallerProxy(s)Callee |INVITE|| |------------------------->|INVITE| |100Trying|------------------------->| || |RTPMedia| |<===================================================>| |BYE| || 經過多個Proxy處理延遲會較久,可以馬上先回100Trying避免INVITE重送。

接通後,Proxy功成身退,ACK可以依據200OK的Contact直送受話端(或只保留特定Proxy,見Record-Route)。

註:重送180Ringing代表Cadence? 註:一般會有100Trying和INVITE請求互相確保有收到,但18x也可能遺失而有好幾秒不曉得是不是響鈴了還是怎樣,可用 PRACKtransaction確保。

註:BYE前如何確定通話仍在進行中?Sessionrefresher 註:如果不回100或其它1xx 如果受話端不接受通話,最後會回應3xx~6xx。

CallerProxy(s)Callee |INVITE|| |------------------------->|INVITE| |100Trying|------------------------->| ||ACK| ||------------------------->| 此時ACK是沿用INVITE的transaction,需逐Proxy(收到的Via及其branch)回送,不能直送。

主叫端在收到受話端接不接受前(收到最後回應前),可插入CANCELtranscation取消進行建立。

CallerProxy(s)Callee |INVITE|| |------------------------->|INVITE| |100Trying|------------------------->| ||CANCEL| |200OK(CANCEL)|------------------------->| ||ACK| ||------------------------->| SIPCANCEL的CSeq序號跟SIPINVITE一樣,Proxy先回應CANCEL的200OK,再回應SIPINVITE的487RequestTerminated。

如果主叫還是有收到INVITE的200OK,則視為通話已建立,除了ACK外,還要BYE結束通話。

INVITE會建立dialog,由Call-ID、Fromtag、Totag識別。

由於INVITE過程中可能forking分送給多個受話端的關係,或許會有多個來自不同受話端的回應,發話端要跟它們一一ACK,各自建立dialog,這些dialog都屬於同一session。

INVITE相關請求CSeq序號ViabranchTransaction說明 PRACK+new獨立 CANCEL沿用沿用獨立沿用Viabranch好找出要取消的Transaction。

失敗的ACK沿用沿用同沿用Viabranch好在INVITETransaction處理。

成功的ACK沿用new無 OPTIONS+new獨立也可能不在INVITEDialog內。

BYE+new獨立 註:INVITE相關 相關請求都在同一Dialog內(Call-ID、近端tag、和遠端tag都一樣)。

沿用INVITE的CSeq序號疑問:UPDATE是不是也跟INVITE相關? 用SDP描述通話媒介的參數,採用offer及answer方式: 如果起始offer在INVITE的話,answer在2xx或之前的1xx,以先收到為主。

受話端收到INVITE後,就可以依照offer中接受的部份開始送media,例如彩鈴,然後才送出answer。

如果起始offer在2xx,answer在ACK。

如果不接受offer,會馬上發BYE。

INVITE--透過proxy發出INVITE Via:紀錄請求經過的proxy,依此回送回覆。

加上branch參數作為transaction識別,以"z9hG4bK"開頭來跟舊版SIP區別。

To:受話端的名子及URI,到受話端時會加上tag From:請求者(未必是呼叫端?)顯示的名子及URI,加上tag識別用。

Call-ID:唯一的呼叫代號(搭配To及From的tag) CSeq:請求序號及method Contact:進一步請求的直接聯繫方式 Max-Forward:最多節點數目 Record-Route:proxy可選擇加上去,放proxy的URI,讓接下來的通話仍會經由它。

Content-Type/Content-Length:內容類別及長度,通常是SDP描述typeofmessage,codec,samplingrate等 100Trying--連線嘗試建立中,請稍後。

180Ringing--受話端開始振鈴了,等候接起。

200OK--受話端接起來時對INVITE的回應,並含接受的SDP描述。

ACK--呼叫端根據200ACK的Contact直送受叫端 接下來由SDP決定的參數不經過proxy直接通話。

2xx重送 發話端每次收到2xx要回送ACK,受話端經過T1沒收到的話重送2xx,再來一直double重送週期,直到T2。

經過64*T1時間仍沒收到ACK,dialog仍視為確認,但session應該透過BYE結束。

更改通話 通話中如要改變通話媒介的參數,則參考現有的通話媒介再重新INVITE→200OK→ACK。

問題 如果INVITE收到多個不同Totag的回應會怎樣? 參考來源 RFC3261§13InitiatingaSession RFC3665§3.8UnsuccessfulNoAnswer 延伸閱讀 Authorizationandauthentication RFC5626:ManagingClient-InitiatedConnectionsintheSessionInitiationProtocol(SIP) 跟NAT/Firewall有關 SIPUPDATE 張貼者: ijon 於 晚上8:43 以電子郵件傳送這篇文章BlogThis!分享至Twitter分享至Facebook分享到Pinterest 標籤: 電話, Network, SIP 1則留言: ijon2020年3月9日上午10:24180Ringing需要0.5s,1s,2s,...嗎?200OK沒收到ACK是0.5,1,2,4,4,4,4(共8次)?還是最後一直持續4s?Call-ID建議格式?Contact的host可以是文字嗎?Contact格式?PRACK送的時機?回覆刪除回覆回覆新增留言載入更多… 較新的文章 較舊的文章 首頁 訂閱: 張貼留言(Atom) 標籤 心法 手機 音 電 電腦 電話 圖 影 翻譯 Arduino asm Asterisk BBB blackfin C coLinux Desktop Device DSP Embedded Firefox git ISDN kamailio Kernel Lego Linux Linux-Kernel Linux-Kernel-Network Linux-Network Linux-System lua LXDE MIPS Network NXT NXT-G OpenWrt Programming Protocol ramips Raspberry-Pi Shell SIP SQLite ssh svn System TOC Tools Ubuntu USB vim VirtualBox Web Windows Wireless x86 網頁 首頁 主題 熱門文章 PrecisionTimeProtocol 精確時間協定(PrecisionTimeProtocol,PTP)透過網路封包同步絕對時間、頻率、和相位,達到毫秒級精確度。

版本IEEE1588-2002(PTPv1):未廣泛採用。

IEEE1588-2008(PTPv2):沒向前相容。

有p... IPMulticast 有些應用需要進行一對多或多對多的封包傳送,例如網路廣播電台、網路電視廣播。

如果封包使用unicast單點傳送的方式,傳送端需要先知道所有傳送的對象,一個一個傳送,對傳送端負擔較大,也需要很多倍的網路頻寬。

封包的broadcast廣播通常會侷限在本地區域網路內,如果開放到網... ARPandGratuitousARP Ethernet是靠MAC位址傳送封包,傳送IP封包給對方IP位址,還需要知道對方MAC位址才能傳送。

ARP(AddressResolutionProtocol)就是用來詢問對方MAC位址的協定,包括ARPrequest跟ARPrep... RFC5424SyslogMessageFormat 廣為使用的syslog來自BSD,訊息格式並沒有標準化,共通點只有都是以「」開始。

RFC3164只是說明觀察到的格式,認定送到syslogUDPport(514)的封包都是syslog訊息。

RFC5424用ANBF... Ethernet封包格式與長度 ←84-1538octets→←72-1526octets→Preamble10101010Start-of-Frame-Delimiter10101011EthernetFrameInterframegap7octets1... FSKCIDFormat CallerID(calleridentification,CID)有多種翻譯或別名:來電顯示、來電號碼顯示、CLID(CallerLineIdentityDisplay),CLI(callinglineidentification)、callingn... OpenWrtprocd OpenWrt使用procd取代傳統Linux使用的init及udev。

procd原始碼除了套件procd外,還包括套件procd-ujail、procd-seccomp、procd-nand、procd-nand-firstboot。

procd... JTAG JTAG(JointTestActionGroup)是一個在1985年成立的電子工業協會,致力於發展產品製造後如何驗證設計及測試印刷電路板接線的方法。

在1990年結果寫成IEEEStandard1149.1-1990,標題是「StandardTestA... gitdescribe 用最近的tag及其間隔的送交數目來描述一個送交,格式是--g,後面可以選擇加是否dirty。

前面的g代表git,用來區別SCM。

指令格式... Linuxdevicenumber devicenumber由majornumber和minornumber組成[註1]。

major號碼識別使用的驅動程式,例如/dev/null和/dev/zero使用driver1、virtualconsoles和serialter... 網誌存檔 ►  2022 (22) ►  五月 (13) ►  三月 (5) ►  二月 (3) ►  一月 (1) ►  2021 (67) ►  十二月 (3) ►  十一月 (3) ►  十月 (5) ►  九月 (4) ►  八月 (4) ►  七月 (7) ►  六月 (4) ►  五月 (3) ►  四月 (1) ►  三月 (10) ►  二月 (1) ►  一月 (22) ►  2020 (66) ►  十二月 (8) ►  十一月 (15) ►  十月 (8) ►  九月 (2) ►  八月 (4) ►  七月 (4) ►  六月 (8) ►  五月 (3) ►  四月 (4) ►  三月 (9) ►  一月 (1) ►  2019 (53) ►  十二月 (3) ►  十一月 (10) ►  十月 (10) ►  九月 (7) ►  八月 (2) ►  七月 (2) ►  六月 (5) ►  五月 (1) ►  四月 (1) ►  三月 (3) ►  二月 (5) ►  一月 (4) ►  2018 (35) ►  十二月 (4) ►  十一月 (4) ►  十月 (2) ►  九月 (2) ►  八月 (8) ►  七月 (10) ►  六月 (1) ►  四月 (1) ►  三月 (2) ►  二月 (1) ►  2017 (14) ►  十一月 (3) ►  十月 (6) ►  九月 (2) ►  八月 (3) ►  2016 (14) ►  九月 (2) ►  八月 (2) ►  七月 (2) ►  二月 (5) ►  一月 (3) ►  2015 (38) ►  十二月 (4) ►  十一月 (3) ►  九月 (4) ►  八月 (8) ►  四月 (3) ►  二月 (12) ►  一月 (4) ►  2014 (71) ►  十二月 (5) ►  十一月 (6) ►  十月 (1) ►  九月 (16) ►  八月 (3) ►  七月 (7) ►  六月 (7) ►  五月 (11) ►  四月 (6) ►  三月 (1) ►  二月 (2) ►  一月 (6) ►  2013 (60) ►  十二月 (5) ►  十一月 (19) ►  十月 (3) ►  八月 (13) ►  七月 (6) ►  三月 (1) ►  二月 (12) ►  一月 (1) ►  2012 (31) ►  十二月 (1) ►  十一月 (14) ►  十月 (4) ►  九月 (3) ►  八月 (3) ►  四月 (2) ►  三月 (2) ►  一月 (2) ►  2011 (17) ►  十二月 (5) ►  十月 (1) ►  二月 (2) ►  一月 (9) ▼  2010 (75) ►  十二月 (4) ►  十一月 (5) ▼  十月 (13) uClinuxforNFSclient uClinux新增應用程式 uClinux產品設定檔 uClinux的目錄結構 GRE SIPINVITE IPsec NAT類型 git產生/移除subversion空目錄 DNS設定 LEGOPowerFunctions gEDAsymbols git回復或清除 ►  九月 (1) ►  八月 (4) ►  七月 (2) ►  六月 (11) ►  五月 (5) ►  四月 (12) ►  三月 (7) ►  二月 (10) ►  一月 (1) ►  2009 (23) ►  十二月 (5) ►  十一月 (3) ►  十月 (4) ►  九月 (1) ►  八月 (5) ►  七月 (5) ►  2008 (2) ►  七月 (1) ►  二月 (1) ►  2007 (19) ►  十月 (1) ►  九月 (1) ►  八月 (2) ►  七月 (1) ►  六月 (2) ►  五月 (1) ►  三月 (3) ►  二月 (7) ►  一月 (1) ►  2006 (1) ►  十二月 (1)



請為這篇文章評分?