Labs 導讀
伴隨視頻物聯(lián)網(wǎng)的發(fā)展,IPC(IPCamera,網(wǎng)絡攝像頭)已經(jīng)在家庭安防場景廣泛應用。中國移動移動看家業(yè)務提供了以視頻為基礎的場景化安防服務,支持接入IPC、門鎖、貓眼等泛安防智能硬件,用戶通過使用和家親APP可以實現(xiàn)遠程看護、設備對講、監(jiān)控視頻回放等功能。為了實現(xiàn)以上功能,IPC等設備需使用流媒體傳輸協(xié)議發(fā)送攝像頭采集到的音視頻媒體流,而APP則通過流媒體傳輸協(xié)議獲取媒體流。
如今市面上常見的流媒體傳輸協(xié)議有:RTMP、WebRTC、QUIC、P2P、SRT等。移動看家使用的流媒體傳輸協(xié)議主要有P2P和SRT。今天,本文先介紹P2P協(xié)議。
什么是P2P?
簡單來說P2P就是設備之間不通過中間服務器轉(zhuǎn)發(fā),直接進行點對點的通信的方式。
那么非P2P是怎樣通信的呢?我們以微信通信為例,簡單介紹一下:
圖1
從圖1中我們可以看到,小明通過微信給小紅發(fā)了一條消息,其消息的真實流經(jīng)路徑是:小明->服務器->小紅。
那么問題就來了,為什么消息要先經(jīng)過服務器,而不能是直接:小明->小紅?
答:小明的手機在網(wǎng)絡上大概率是無法直接找到小紅的手機。
怎樣理解這句話?請看圖2
圖2
我們都知道,在網(wǎng)絡世界中,是通過IP地址來唯一確定某一臺設備的,但是由于IPv4地址數(shù)量的有限性,招致很多設備其實是無法獲取到唯一的IP地址(公網(wǎng)地址),而是使用NAT(網(wǎng)絡地址轉(zhuǎn)換)技術獲取一個內(nèi)網(wǎng)地址,多個內(nèi)網(wǎng)地址共用一個公網(wǎng)地址實現(xiàn)上網(wǎng)。家庭中常見的內(nèi)網(wǎng)地址有:192.168.X.X 。
公網(wǎng)地址唯一,而內(nèi)網(wǎng)地址不唯一,所以如果只是知道一個設備的內(nèi)網(wǎng)IP地址是無法找到對應設備的(除非是剛好處在同一個內(nèi)網(wǎng)環(huán)境中),這也就是為什么小明的手機在網(wǎng)絡上大概率是找不到小紅手機的原因。
而服務器由于有自己的公網(wǎng)地址,故此小明和小紅都可以通過這個公網(wǎng)地址都可以找到服務器,然后通過服務器這個中介,小明和小紅就可以通信了。
從圖2中我們也可以發(fā)現(xiàn),小明的手機連接的路由器A的WAN口的IP地址(公網(wǎng)地址)是:36.23.223.162;小紅的手機連接路由器B的WAN口的IP地址(公網(wǎng)地址)是:183.129.184.211。要是小明能知道自己的公網(wǎng)IP地址,并告知小紅(反過來也是一樣),也就能跳過服務器直接與對方相連。這其實也就是P2P的技術原理。
為什么要使用P2P?
使用P2P的好處有很多,從不同的角度出發(fā)可以得到不同的答案。如果站在設備廠商的角度來看,如果他們的設備之間能實現(xiàn)P2P,那就可以減少中轉(zhuǎn)服務器的流量費用,特別是當數(shù)據(jù)量大的時候,P2P省流量的優(yōu)勢就更加明顯,從而降低運營成本。從技術方面來看,P2P 直接跳過服務器中轉(zhuǎn),故此只要能連接成功,其傳輸速度從理論上來說會更快。
圖3
怎樣實現(xiàn)P2P?
從圖2的描述中我們知道,如果設備能知道自己本身的公網(wǎng)IP地址和端口,并告知對方,就能實現(xiàn)P2P通信。所以要實現(xiàn)P2P通信,就要解決以下兩個問題:
怎樣獲取自身的公網(wǎng)IP地址和端口
怎樣將獲取到的公網(wǎng)IP地址和端口告知對端
NAT原理
關于怎樣獲取自身的IP公網(wǎng)地址和端口,我們可以參考瀏覽器訪問百度搜索引擎的流程,如下圖:
圖4
圖中路由器下面連接了4個設備:ABCD,假設這4個設備都通過瀏覽器訪問百度(假設都是使用內(nèi)部端口80),那在路由器上會生成一張NAT映射表,瀏覽器返回數(shù)據(jù)在通過路由器的時候就通過這張映射表找到對應的內(nèi)部設備。
從表中我們可以看到,這些設備映射后的外網(wǎng)IP地址是相同的(即路由器的外網(wǎng)IP地址),但是端口不同。故此瀏覽器在返回數(shù)據(jù)的時候,通過IP+端口,就可以確定唯一的一臺設備(其實這也是NAT技術能實現(xiàn)多個設備只使用一個公網(wǎng)地址就能獨立上網(wǎng)的基本原理)。同理,如果這時候小明想和設備A通信,那小明只需要向設備A映射的公網(wǎng)地址信息:36.23.223.162:8081發(fā)起連接就可以了。
故此,如果能將內(nèi)網(wǎng)設備通過NAT方式映射到公網(wǎng)上,并獲取映射后的公網(wǎng)IP地址及對應的端口號,那么也就實現(xiàn)了P2P通信的第一步。想要實現(xiàn)內(nèi)網(wǎng)設備對公網(wǎng)地址的映射,除了常見的主動訪問某個知名網(wǎng)站之外,還可以通過STUN協(xié)議來實現(xiàn)。
STUN協(xié)議
圖5
STUN協(xié)議如圖5所示:設備通過給公網(wǎng)的STUN服務器發(fā)送請求獲得自己的公網(wǎng)地址信息。類似的,像這種通過某種協(xié)議或者方式讓路由器留下一個內(nèi)外網(wǎng)映射的“洞口”,通常稱為:“打洞”。而外網(wǎng)主機如果可以通過這個“洞口”與內(nèi)網(wǎng)主機通信,則說明“打洞成功”。
信令服務器
通過STUN協(xié)議可以獲取到設備本身的外網(wǎng)IP地址和端口,只是完成了P2P通信的第一步。第二步則是怎樣將自己的外網(wǎng)IP地址和端口告知對端。通常我們需要借助信令服務器來實現(xiàn)。通用的方案如圖6所示:
圖6
步驟1:IPC通過STUN協(xié)議獲取到了自己的公網(wǎng)地址信息:36.23.223.162 : 8081;
步驟2:IPC將自己的地址信息發(fā)給信令服務器,信令服務器則將地址信息轉(zhuǎn)發(fā)給“和家親APP”;
步驟3:“和家親APP”獲取到對端的地址信息后,發(fā)起連接;由于路由器已經(jīng)有IPC的地址映射,所以發(fā)起的連接會轉(zhuǎn)發(fā)給IPC設備,至此就實現(xiàn)了“和家親app”和IPC的P2P連接。
關于信令服務器,這邊需要需要說明一下。一般來說設備啟動時就會主動連接信令服務器,之后會保持與信令服務器的長連接;app也會保持與信令服務器的連接;通過信令服務器可以實現(xiàn)IPC與app的通信,如今信令服務器使用的協(xié)議是websocket。
擴展
圖6的幾個步驟對于快速理解P2P的原理是有幫助的,但是也省略了很多內(nèi)部細節(jié),這個章節(jié)會將一些遺留的知識點補充回來。
思考一個問題:通過STUN協(xié)議獲取到的公網(wǎng)IP地址和端口,對端就一定能連接成功嗎?很顯然答案是否定的。否則也就不會有“打洞成功率”的概念了。為了理解這點,首先需要了解NAT類型。
NAT類型
如今常見的NAT可以分成4種類型:
完全錐型
IP 限制錐型
端口限制錐型
對稱型
這4種類型中,越往后的NAT類型穿越難度越大。
完全錐型
完全錐型特點:一旦打洞成功,所有知道該洞的主機都可以通過它和內(nèi)網(wǎng)主機通信。
IP 限制錐型
IP 限制錐型特點:IP限制錐型要比完全錐型嚴格,打洞成功后,只有與之打洞成功的外網(wǎng)主機才能通過該洞與內(nèi)網(wǎng)主機通信,而其他外網(wǎng)主機哪怕知道這個洞口也不能通信。
端口限制錐型
端口限制錐型特點:端口限制錐型則要比IP限制錐型更嚴格,打洞成功后,除了要檢測IP地址之外還要檢測端口號。二者中只要有一項不滿足,都無法通過該洞口進行通信。
對稱型
完全錐型特點:內(nèi)網(wǎng)主機每次訪問不同的外網(wǎng)主機時,都會生成一個新的洞。而前面3種錐型使用的是同一個洞。
不同NAT類型的路由器其穿越表如下所示:
所以,前面例子中我們其實是將路由器的NAT類型默認假設成完全錐型。但是現(xiàn)實中,除了完全錐型外,我們還需要處理其他類型的路由器。
TURN協(xié)議
當兩端路由器的NAT類型是:(端口限制錐型,對稱型)或者(對稱型,對稱型)時,使用STUN協(xié)議就無法穿越,這個時候就需要使用TURN協(xié)議。TUAN協(xié)議簡單來說就是進行數(shù)據(jù)轉(zhuǎn)發(fā),兩個內(nèi)網(wǎng)主機分別把內(nèi)容發(fā)給TURN服務器,TURN服務器再將內(nèi)容分別轉(zhuǎn)發(fā)給對端,以此來實現(xiàn)通信。這邊不再進行贅述。
總結(jié)
P2P打洞的大致流程主要就是以下兩個步驟:
處在內(nèi)網(wǎng)的設備通過STUN/TURN協(xié)議獲取到自身的內(nèi)外網(wǎng)地址信息;
將相關的地址信息通過信令服務器發(fā)送給對端,對端拿到對應的地址信息后,嘗試連接。
在實際過程中,進行P2P打洞的設備不僅獲取外網(wǎng)的地址信息,也會獲取內(nèi)網(wǎng)的地址信息,同時也獲取TRUN服務器分配的地址信息,生成候選地址對,候選地址對也有連接的優(yōu)先級的概念,一般來說所有的候選地址對,都會嘗試連接。
由于P2P協(xié)議涉及內(nèi)容比較多,既需要了解底層的網(wǎng)絡原理,也需要了解類似STUN和TUAN協(xié)議的內(nèi)容。而且P2P協(xié)議打洞成功的關鍵很多時候與設備所處的網(wǎng)絡環(huán)境有關,假如設備和app都處在對稱型路由器之下,那打洞成功概率就會很低,并且由于P2P流程比較長,故此對于不了解其原理的開發(fā)人員來說定位起來會比較困難。
基于以上原因,如今中國移動智慧家庭運營中心的移動看家設備,已經(jīng)升級至全新的流媒體傳輸協(xié)議——SRT。但是這并不妨礙我們了解P2P的實現(xiàn)原理。關于SRT協(xié)議的介紹,請期待之后的文章。