會話啟動協定(Session Initiation Protocol)
/ SIP rhymes with 'sip' /
在兩個人能通話之前,得有東西做相當於查號碼、撥號、讓對方電話響、並約定彼此要說哪種語言的事。RTP 在通話進行時承載真正的語音——但它從不負責安排通話。這個建立的工作屬於信令協定,而在網際網路上最主流的就是 SIP,會話啟動協定。SIP 是負責找到對方、讓對方響鈴、協商媒體如何流動、稍後再把通話拆除的那一部分。
它刻意運作得很像網頁的 HTTP:SIP 是一個以文字為基礎、請求-回應式、帶有可讀方法的協定。要發起通話,撥號者朝被叫方的 SIP 位址(長得像電子郵件地址,例如 sip:[email protected])送出一個 INVITE;沿途的 SIP 伺服器協助定位 Alice 目前在哪裡,並把 INVITE 轉送到她的裝置。她的電話響起,若她接聽,便以一個 200 OK 回覆,撥號者以一個 ACK 確認,通話就接通了。關鍵在於,INVITE 與 OK 帶著一段對媒體的簡短描述(編解碼器、位址、連接埠——通常以一個伴隨的格式 SDP 寫成),好讓兩端就如何送出 RTP 達成共識。要掛斷,其中一方送出 BYE。SIP 也處理註冊,好讓你的電話告訴網路該去哪裡找你;以及重導向,好讓通話能在裝置之間跟著你走。
為什麼重要:SIP 是多數網路電話系統、IP 電話網路與許多視訊會議架構的信令骨幹——是舊式電話系統那套通話建立信令的現代替代品。一個澄清的重點:SIP 建立並拆除會話,但它本身不承載語音或視訊;真正的媒體是另外透過 RTP 流動,常常直接在兩個端點之間。所以一通通話其實牽涉兩個合作的通道——SIP 安排它,RTP 承載它。
Alice 打給 Bob:她的用戶端送出 INVITE sip:[email protected](附上一份 SDP 提議,列出她的編解碼器與她要在哪個 UDP 埠接收 RTP)。Bob 的電話響起,他接聽,他的用戶端回傳帶有自己 SDP 的 200 OK,Alice 送出 ACK——現在 RTP 音訊就直接在他們之間流動。任一方都能以 BYE 結束它。
SIP 安排通話(INVITE / 200 OK / ACK / BYE);接著由 RTP 承載媒體。
SIP 是信令,不是媒體。它讓電話響起並協商參數,但它不承載你的聲音——那是另外透過 RTP 傳送的。把兩者搞混,會對網路電話的運作建立錯誤的心智模型。