【正文】
一個(gè)包頭行,空行、都必須由回車換行組成(CRLF)。一般消息=這兩種消息類型都由一個(gè)起始行,一個(gè)或者多個(gè)包頭域,一個(gè)可選的消息中文組成。即使在字符集上和語法細(xì)節(jié)上有所不同,請(qǐng)求()還是應(yīng)答()消息都基于RFC2822格式的。SIP消息:SIP協(xié)議是一個(gè)基于文本的協(xié)議,使用UTF8字符集(RFC2279[7])。proxy,location,registrar服務(wù)器都是邏輯實(shí)體,在它們的實(shí)現(xiàn)中,可能是作為單個(gè)應(yīng)用實(shí)現(xiàn)的。類似的,同樣的代碼可以對(duì)一個(gè)請(qǐng)求做為proxy服務(wù)器處理,對(duì)另一個(gè)請(qǐng)求作為重定向服務(wù)器。UAC和UAS,就像代理服務(wù)器和轉(zhuǎn)發(fā)服務(wù)器,是在事務(wù)by事務(wù)的原理(串行事務(wù)處理)上定義的。User Agent(UA)。在transaction和transport層智商的UAS實(shí)現(xiàn)的功能集合。換句話說,是響應(yīng)請(qǐng)求的一小段軟件,在事務(wù)中作為UAS存在。應(yīng)答接受、拒絕、或者轉(zhuǎn)發(fā)對(duì)應(yīng)的請(qǐng)求。UAC Core:UAC核心。如果它接下來收到一個(gè)請(qǐng)求,那么在那個(gè)事務(wù)中,它就是作為UAS來處理請(qǐng)求。UAC角色只在事務(wù)中存在。User Agent Client(UAC):用戶代理客戶端。URLencoded:一串根據(jù)RFC2396-。它是指由用戶代理服務(wù)器(UAS)發(fā)出應(yīng)答到用戶代理客戶端(UAC)的消息流向方向。Upstream:上行流。在transaction 層之上的協(xié)議層。Target Refresh Request: 目標(biāo)刷新請(qǐng)求。支持嚴(yán)格路由的代理服務(wù)器也叫嚴(yán)格路由器。在這個(gè)規(guī)則下,如果在包頭中包含Route域,那么代理服務(wù)器就會(huì)刪除Request_URI域內(nèi)容。Strict Routing:嚴(yán)格路由。一個(gè)無狀態(tài)的代理服務(wù)器直接轉(zhuǎn)發(fā)每一個(gè)接收到的請(qǐng)求和每一個(gè)接收到的響應(yīng)。Stateless Proxy:無狀態(tài)的代理服務(wù)器。一個(gè)(事務(wù))有狀態(tài)代理服務(wù)器和一個(gè)call stateful proxy不是一回事。也是一個(gè)事務(wù)又狀態(tài)代理服務(wù)器(transaction stateful proxy)。Stateful Proxy:有狀態(tài)的代理服務(wù)器。因?yàn)檎?qǐng)求的目的地址變成了另一個(gè)用戶,這就是回溯,是一個(gè)合法的情況。,并且Joe的pc呼叫轉(zhuǎn)移到bob。通常導(dǎo)致這樣的現(xiàn)象是呼叫轉(zhuǎn)發(fā)(call forwarding)。通常,這是說,請(qǐng)求的RequestURI不同于上次的Request_URI。Spiral:回溯。給INVITE請(qǐng)求的2xx應(yīng)答的ACK回應(yīng),是一個(gè)獨(dú)立的事務(wù)。SIP 事務(wù):一個(gè)SIP事務(wù)是在客戶端和服務(wù)端得事件,包括了從第一個(gè)由客戶端發(fā)送到服務(wù)端得請(qǐng)求,到最后一個(gè)(非1xx)服務(wù)端向客戶端發(fā)出得終結(jié)應(yīng)答。在SDP中,一個(gè)會(huì)話可以被SDP用戶名,session id,網(wǎng)絡(luò)類型,地址類型,地址元素得一個(gè)集合串所規(guī)定?!?RFC 2327[1])(一個(gè)session在SDP訂一下可以是一個(gè)或者多個(gè)RTP sessino)。根據(jù)SDP得描述:”一個(gè)多媒體會(huì)話是一個(gè)由多媒體發(fā)送方和接受方組成得集合,并且包括在發(fā)送方和接受方之間得數(shù)據(jù)流。在順序查找中,代理服務(wù)器順序嘗試聯(lián)系地址,在處理下一個(gè)之前必須等待上一個(gè)請(qǐng)求已經(jīng)有一個(gè)結(jié)束應(yīng)答。一個(gè)server是一個(gè)網(wǎng)絡(luò)元素接收請(qǐng)求并且處理請(qǐng)求并且發(fā)送回應(yīng)給請(qǐng)求方。這些URI描述了傳遞一個(gè)請(qǐng)求所必須經(jīng)歷得代理列表。Route Set: 路由集。是給呼叫方得一個(gè)信號(hào)表示被叫方正在振鈴(Ringing)。Ringback: 回鈴音。用來標(biāo)志從客戶端發(fā)往服務(wù)端得請(qǐng)求處理得情況得。Response:應(yīng)答。 一個(gè)由客戶端發(fā)到服務(wù)端得SIP信息,用于執(zhí)行特定得功能。Regular Transaction:常規(guī)事務(wù)。他把請(qǐng)求得信息放到定位服務(wù)器中,這樣可以讓定位服務(wù)器很方便得查找位置信息。Registrar: 登記員。一個(gè)重定向服務(wù)器是一個(gè)產(chǎn)生3xx應(yīng)答的UAS服務(wù)器,指示客戶端連接別的URI。A client recurses on a 3xx response when it generates a new request to one or more of the URIs in the Contact header field in the response.Recursion:回路、遞歸。一個(gè)代理服務(wù)器翻譯,并且,如果有需要的話,再轉(zhuǎn)發(fā)前會(huì)重寫請(qǐng)求消息。一個(gè)代理服務(wù)器首先提供的是路由服務(wù),也就是說保證請(qǐng)求被發(fā)到更加”靠近”目標(biāo)用戶的地方。一個(gè)中間的實(shí)體。服務(wù)器用來標(biāo)志自己正在處理的應(yīng)答,但是本應(yīng)答并不結(jié)束一個(gè)SIP事務(wù)。并行搜索情況下,代理服務(wù)器會(huì)向多個(gè)用戶可能存在的地方發(fā)起請(qǐng)求,并且等待應(yīng)答。一個(gè)代理服務(wù)器接收到客戶的請(qǐng)求,即使它不是由Request_URI所決定的服務(wù)器。方法是請(qǐng)求消息自身攜帶的。Method:方法。SIP消息既可以是請(qǐng)求也可以是應(yīng)答。Message:消息。A proxy is said to be loose routing if it follows the procedures defined in this specification for processing of the Route header field. These procedures separate the destination of the request (present in the RequestURI) from Loose Routing:丟失路由。環(huán)路請(qǐng)求是錯(cuò)誤的,所以,處理程序需要檢測和防止協(xié)議中出現(xiàn)的環(huán)路請(qǐng)求。當(dāng)請(qǐng)求抵達(dá)一個(gè)代理服務(wù)器,代理服務(wù)器轉(zhuǎn)發(fā)這個(gè)請(qǐng)求,當(dāng)這個(gè)請(qǐng)求再次來到同一個(gè)代理服務(wù)器,就稱之為環(huán)路。它包含一張綁定了addressofrecord的表,被叫方可能有0到多個(gè)記錄。Location Service: 定位服務(wù)。一個(gè)被叫方從收到INVITE請(qǐng)求起,到終止INVITE建立的對(duì)話結(jié)束,都稱作被叫方。Invitee,Invited User,Called Party, Callee:被叫方。Invitation: 一個(gè)INVITE請(qǐng)求。一個(gè)caller從發(fā)出INVITE請(qǐng)求建立對(duì)話開始,到對(duì)話終止都一直是這個(gè)角色。和臨時(shí)應(yīng)答一樣。一個(gè)提供SIP服務(wù)的主機(jī)。Header Field Value:頭域值。某些頭域字段只能有單個(gè)值,比如結(jié)果域(result)就只能有一個(gè)值。一個(gè)頭域字段由一個(gè)頭域名和(零個(gè)或多個(gè))頭域值組成。頭域字段是在SIP消息頭域的字段。頭域是在SIP消息頭部用來描述這個(gè)SIP消息信息的部分。一個(gè)響應(yīng)終端SIP事務(wù)的應(yīng)答,和事務(wù)中間的臨時(shí)響應(yīng)相反。它特指從UAC到UAS的請(qǐng)求流的方向, 我們用Call identifier,local tag(本地tag),remote tag(對(duì)方tag)來標(biāo)志一個(gè)對(duì)話,一個(gè)對(duì)話在RFC 2543中被正式叫做CALL LEG.Dialog:對(duì)話,一個(gè)對(duì)話是持續(xù)一段時(shí)間的兩個(gè)UA之間的端到端的SIP關(guān)系。所有的核心,除了無狀態(tài)代理服務(wù)器,都是事務(wù)用戶。核心定義了SIP實(shí)體的特定類別。客戶端可能會(huì)也可能不會(huì)和人交互。Client:客戶端。一個(gè)請(qǐng)求有狀態(tài)(call stateful)的代理服務(wù)器也一定是事務(wù)有狀態(tài)的,但是事務(wù)有狀態(tài)的不一定是請(qǐng)求有狀態(tài)的。Call:呼叫,一個(gè)呼叫是一個(gè)非正式的術(shù)語,它是指在端點(diǎn)之間一個(gè)一些通訊行為,通常用于建立多媒體對(duì)話。由于它是直接的UAC和UAS的串連,所以,不需要對(duì)他有額外的定義。為了決定該如何應(yīng)答一個(gè)請(qǐng)求,B2BUA就像UAC一樣工作,并且發(fā)出請(qǐng)求。通常情況下,定位服務(wù)器是通過登記服務(wù)來建立的。協(xié)議的定義以下講述的名次對(duì)SIP有著額外的意義:AddressofRecord: 記錄地址。第16節(jié)講數(shù)了代理服務(wù)器,代理服務(wù)器用于在兩個(gè)UA之間做消息路由使用。第14節(jié)講述了在對(duì)話中使用INVITE請(qǐng)求來改變會(huì)話的屬性。一個(gè)會(huì)話由一組參與者,他們之間用于交流的媒體流組成。當(dāng)一個(gè)UAC在一個(gè)對(duì)話中發(fā)出請(qǐng)求的時(shí)候,它不僅遵循第8節(jié)描述的一般UAC規(guī)則而且也遵循對(duì)話中的請(qǐng)求規(guī)則。對(duì)話過程要求兩個(gè)用戶代理之間的信息是有序的而且請(qǐng)求被正確路由傳輸?shù)?。在?duì)話中,有其他的相關(guān)會(huì)被發(fā)送。第10節(jié)描述了UAC和UAS的對(duì)REGISTER實(shí)現(xiàn)的core(核心)行為。對(duì)UAC來說,這些規(guī)則約束請(qǐng)求的建立;對(duì)UAS來說,這些規(guī)則約束請(qǐng)求的處理和應(yīng)答。Cores,除了無狀態(tài)代理服務(wù)器,都是事務(wù)用戶。當(dāng)客戶取消一個(gè)事務(wù),它請(qǐng)求服務(wù)器終止正在處理的事務(wù),并且回滾狀態(tài)到該事務(wù)開始前的狀態(tài),并且產(chǎn)生指定的該事務(wù)的錯(cuò)誤報(bào)告。當(dāng)一個(gè)TU發(fā)出一個(gè)請(qǐng)求,它首先創(chuàng)建一個(gè)客戶事務(wù)實(shí)例(client transaction instance)并且和請(qǐng)求一起發(fā)送,這包括了目標(biāo)IP地址、端口號(hào)、以及發(fā)送請(qǐng)求的設(shè)備。在事務(wù)層之上是事務(wù)用戶(TU)。事務(wù)層包含一個(gè)客戶元素(可以認(rèn)為是一個(gè)客戶事務(wù))和一個(gè)服務(wù)器元素(可以認(rèn)為是一個(gè)服務(wù)器事務(wù)),他們都可以用一個(gè)有限狀態(tài)機(jī)來處理特定的請(qǐng)求。用戶代理包含一個(gè)事務(wù)層,來實(shí)現(xiàn)有狀態(tài)的代理服務(wù)器。任何一個(gè)用戶代理客戶端(user agent client UAC)完成的事情都是由一組事務(wù)構(gòu)成的。一個(gè)事務(wù)是客戶發(fā)送的一個(gè)請(qǐng)求事務(wù)(通過通訊層)發(fā)送到一個(gè)服務(wù)器事務(wù),連同服務(wù)器事務(wù)的所有的該請(qǐng)求的應(yīng)答發(fā)送回客戶端事務(wù)。第三層是事務(wù)層。第18節(jié)有通訊層的描述。它定義了一個(gè)客戶端如何發(fā)送請(qǐng)求和接收應(yīng)答,以及一個(gè)服務(wù)器如何接收請(qǐng)求和發(fā)送應(yīng)答。編碼方式是采用擴(kuò)展的BackusNaur Form grammar(BNF范式)。一個(gè)物理的實(shí)現(xiàn)可以實(shí)現(xiàn)不同的邏輯要素,或許甚至是基于串行事務(wù)處理原理。不是SIP每一個(gè)要素都一定包含每一個(gè)層。當(dāng)我們說一個(gè)要素”包含”某一個(gè)層,我們的意思是這個(gè)要素復(fù)核這個(gè)層定義的規(guī)則。協(xié)議分成不同層次來描述是為了能夠更清晰的表達(dá),在同一個(gè)小節(jié)里有功能的公共要素的交叉描述。最后在SIP中需要注意的是,注冊(cè)服務(wù)只是用來提供路由收到的SIP請(qǐng)求的,它并不做請(qǐng)求的身份認(rèn)證的判定??梢酝ㄟ^其他任意的地址映射方式來實(shí)現(xiàn)定位服務(wù)。他是讓代理服務(wù)通過輸入一個(gè)URI來查詢到底應(yīng)該向哪里轉(zhuǎn)發(fā)請(qǐng)求。這些消息在定位服務(wù)(location service)中保存,并且允許代理服務(wù)器通過不同的手段查找Bob。Bob并沒有限定非得在一個(gè)單個(gè)設(shè)備上發(fā)起注冊(cè)。一個(gè)很重要的概念就是SIP服務(wù)器的差別在邏輯上,并非在物理上的差別。登記服務(wù)器登記這個(gè)映射,這個(gè)叫做綁定(binding),寫到一個(gè)數(shù)據(jù)庫里邊,叫做定位服務(wù)(location service)。在初始化的時(shí)候,或者每隔一段時(shí)間,Bob的SIP 。每一個(gè)代理都可以單獨(dú)決定是否接收INVITE以后的后續(xù)消息,并且這些后續(xù)消息都可以被發(fā)送到那些決定接收后續(xù)消息的代理服務(wù)器。這個(gè)消息會(huì)被Bob的SIP電話和Alice的softphone所接到(因?yàn)镽ecordRoute頭域?qū)⒃?00(OK)應(yīng)答中被送回),并且在會(huì)話中一直保存。在某些情況下,所有會(huì)話中的包都繼續(xù)通過代理轉(zhuǎn)發(fā)會(huì)很有用。我們稍晚一點(diǎn)會(huì)討論這個(gè)INVITE的特別處理,但是基于SIP的可靠性的機(jī)制,一個(gè)通話的時(shí)間可以認(rèn)為包含電話振鈴和掛機(jī)的時(shí)間(but relate to the reliability mechanisms in SIP, the length of time it can take for a ringing phone to be answered, and forking.)基于這樣的原因,SIP請(qǐng)求的處理通常根據(jù)是否INVITE請(qǐng)求進(jìn)行分類,INVITE類和非INVITE類請(qǐng)求分開處理。Alice通過發(fā)送200(OK)應(yīng)答來確認(rèn)收到了這個(gè)BYE消息,這個(gè)消息終止了會(huì)話并且應(yīng)答了BYE的請(qǐng)求。在通話結(jié)束的時(shí)候,Bob首先斷開(掛機(jī)hangs up),并且發(fā)送一個(gè)BYE的消息。可以在14節(jié)找到會(huì)話屬性更改的細(xì)節(jié)說明。如果對(duì)方不同意這個(gè)媒體屬性變化,他會(huì)發(fā)送一個(gè)錯(cuò)誤的應(yīng)答比如488(暫時(shí)不能進(jìn)行),這個(gè)也會(huì)收到發(fā)起者的一個(gè)ACK響應(yīng)。對(duì)方收到這個(gè)reINVITE請(qǐng)求后,會(huì)發(fā)送一個(gè)200(OK)應(yīng)答表示接受這個(gè)改變。這個(gè)可以通過發(fā)送一個(gè)包含新媒體屬性描述的reINVITE請(qǐng)求來完成。現(xiàn)在,Alice和Bob的媒體會(huì)話開始了,他們通過發(fā)送剛才建立會(huì)話所交換的SDP包中約定的互相明白的媒體包來進(jìn)行會(huì)話。會(huì)話建立過程中的細(xì)節(jié)描述再13節(jié)由描述。所以,不需要兩個(gè)代理服務(wù)器再查找對(duì)方的地址了,所以代理服務(wù)器不參與接下來的通話流了。在這個(gè)例子中,ACK信號(hào)是直接由Alice的softphone發(fā)送到Bob的SIP phone上,跨過了兩個(gè)代理服務(wù)器。在這個(gè)例子中,200(OK)應(yīng)答通過兩個(gè)代理并且發(fā)送到Alice的softphone上,Alice的softphone收到這個(gè)應(yīng)答,停止振鈴,并且標(biāo)志電話Bob已經(jīng)接聽。一個(gè)代理服務(wù)器可以同時(shí)向N個(gè)地方發(fā)送INVITE請(qǐng)求。除了DNS和位置服務(wù)之外,代理服務(wù)器可以自主決定路由,也就是說自己決定應(yīng)