一、NAT的四種類型
簡單來說,IPV4地址不夠,出現了NAT。
1、完全錐型
私網內的主機向公網主機發起一個請求,期間會在NAT服務上打洞(留下發起方公網的IP地址和端口)。外網的所有主機都可以通過這個IP地址和端口來訪問。
2、地址限制型
私網內的主機向公網內的某臺主機發起一個請求,會在NAT服務上開啓類似訪問權限的功能,就是說對於私網主機請求過的所有公網主機,都可以通過私網內主機的公網IP+端口訪問私網內的主機;而未被請求過的公網主機則無法訪問。
3、端口限制型
私網內的主機向公網內的某臺主機的某個端口發起一個請求,會在NAT服務上開啓類似訪問權限的功能,就是說對於私網主機請求過的所有公網主機的特定端口,都可以通過私網內主機的公網IP+端口訪問私網內的主機;而未被請求過的公網主機的特定端口則無法訪問。
4、對稱型
會在NAT服務的映射表中添上一組映射信息(每次請求都會往上添)----------六元組(私網內主機的內網IP+端口,私網內主機的公網IP+端口,公網內主機的IP+端口),其中前兩元是不變的,而後面的四元都有唯一的對應關係,也就是說公網內某個IP地址特定端口的主機只能通過映射表上與之相對應的第三、四元來訪問私網主機,其他都不能訪問。
二、STUN服務
服務器有兩個公網的IP地址和端口。
1、STUN服務目的
1、判斷通信雙方是否在NAT後;
2、判斷雙方NAT的類型;
3、交換各自公網的地址和端口(在NAT後就交換NAT轉換後的地址和端口)。
2、STUN服務檢測NAT類型的原理
1、客戶端向STUN服務器的第一個IP地址端口1發起請求,通過服務器原路返回進行響應。如果這個響應的IP地址和客戶端的相同,說明客戶端在公網,不在NAT之後。
2、前提:客戶端在NAT後。客戶端向STUN服務器的第一個IP地址端口1發起請求,通過服務器的第二個IP地址端口1響應。如果客戶端能收到響應,說明是完全錐型NAT。
3、如果第二步還不能收到響應,客戶端再向STUN服務器的第二個IP地址端口1發起請求,通過服務器同一個IP地址的端口2響應。如果客戶端能收到響應,說明是地址限制型NAT;
4、如果第三步收不到響應,客戶端向STUN服務器的第二個IP地址端口1發起請求,由服務器原路返回進行響應。客戶端不能收到請求,且返回的IP地址和第一步響應的I地址不相同,說明是對稱型NAT;當客戶端能收到請求,就是端口限制型NAT。
如果STUN提供的服務能夠連通,那兩端不走中繼服務器,直接點對點傳輸媒體流了。
三、TURN服務
服務器分爲turn_client端和turn_server端。
1、TURN服務目的
解決無法穿透的NAT。
2、TURN服務原理
假設A端和B端要通信。A發送請求給STUN/TURN服務器(限定必須是3478端口),turn_client向turn_server發送一個Allocate請求,turn_server收到Allocate請求之後會爲A發的請求分配一個relay端口(中繼端口),經過中繼端口轉發給B。相反,B要發送自己的數據就通過relay端口進行發送,之後經過服務器端口轉發到3478,最後再到達A端。
每次A發送的數據先發到turn_client端(3478),turn_client發送Send到turn_server的時候會帶上TURN的協議頭,然後turn_server再去掉協議頭,發給B端。B端發數據先到turn_server端(Allocate請求開通的relay端口),turn_server發Data給turn_client的時候也會帶上TURN的協議頭,然後turn_client再去掉協議頭,發給A端。這樣發數據會浪費帶寬,可用Channel解決帶寬損耗問題。
四、TURN/STUN服務搭建
1、修改配置文件
雲服務器記得開放端口!
listening-port=3478
external-ip=公網IP
user=用戶名:密碼 //訪問TURN服務的憑證
min-port=x
max-port=x //relay端口在min-max範圍內
2、測試ICE
ICE測試網址百度就有。
不用管報錯信息,只要relay和srflx就代表STUN/TURN服務搭建成功!