SIP INVITE - 小蘿蔔工作室Little Robot Studio
文章推薦指數: 80 %
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代表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)
延伸文章資訊
- 1SIP INVITE Method - Dialogic
The INVITE is a SIP method that specifies the action that the requester (Calling Party) wants the...
- 2直接路由- SIP 通訊協定- Microsoft Teams
針對所有傳入的SIP (OPTIONS、INVITE) 到Microsoft SIP Proxy,連絡人標題必須在URI 主機名稱中具有配對的SBC FQDN,如下所示:.
- 3Understanding SIP INVITE method and messages - Wildix Blog
SIP INVITE method · Calls are started by means of the methods INVITE together with SDP (Session D...
- 4SIP INVITEs | Twilio
A SIP INVITE is a SIP request message that initiates a SIP call. A SIP INVITE is made up of lines...
- 5SIP INVITE - 小蘿蔔工作室Little Robot Studio
SIP (Session Initiation Protocol) 協定的主要目的就是建立會話(Session),由SIP INVITE 負責建立,需要連帶支援ACK 確認建立結果、CANCEL...