日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

配置TURN服务器实现NAT穿透

發(fā)布時間:2024/8/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 配置TURN服务器实现NAT穿透 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

對問題的分析

我在剛接觸TURN時的一些疑問

搭建TURN服務(wù)器

如何測試我的TURN服務(wù)器是否成功運行?

解決ICE問題過程中遇到的另一個問題

?


最近使用WebRTC傳輸媒體流時,接收端已經(jīng)成功收到了發(fā)送端發(fā)來的offer,并且傳回的answer也已經(jīng)發(fā)送方被接收,之后接收端的ontrack/onaddstream成功觸發(fā),收到了媒體流并且能夠打印出來,但是既不能得到畫面,也不能得到聲音。

先說結(jié)論:

原因在于ice候選,在本機測試時和局域網(wǎng)測試時我只使用了谷歌的免費STUN服務(wù)器,是否成功視網(wǎng)絡(luò)情況而不同。

本地測試和局域網(wǎng)測試即便沒有ice候選也能成功連接傳輸媒體流,但是一旦部署到服務(wù)器上,ice就非常重要了

-----2020更新------

有很多朋友看了之后跟我說有相同的問題,接收端也得到了,也成功打印出來了,但是黑屏沒有畫面。配置了turn服務(wù)器之后也沒能解決,不知道是turn服務(wù)器的問題還是其他的問題。說一下我的想法:也有可能是MIMEType的問題,建議兩端用同一個瀏覽器同一個MIMEType來測試,因為MIMEType還蠻刁鉆的,我當(dāng)時發(fā)送方是Chrome,接收方是FireFox,盡管雙方設(shè)置的MIMEType相同但接收方黑屏。以后有機會再研究一下MIMEType吧

對問題的分析

我找不到思路的地方,在于我"能收到媒體流"(ontrack/onaddstream會觸發(fā)),但是無法播放,

發(fā)送端的ice狀態(tài):new -> checking -> close,無法達到connected或者completed,也就無法傳輸媒體流(onaddstream/ontrack是在RTCPeerConnection的對方掛載媒體流時觸發(fā)的,并不一定開始傳輸流)

接收端的RTCPeerConnection

IceConnectionState:new

IceGatheringState:completed

IceConnectionState:checking

IceGatheringState:completed

==========================

發(fā)送端的RTCPeerConnection則是

IceConnectionState:new

IceGatheringState:completed

IceConnectionState:checking

IceGatheringState:completed

IceConnectionState:closed

IceGatheringState:completed

也就是說雙方都能完成ice候選的收集工作,但是無法連接。

從stackoverflow上摘了一段:

The ice gathering state is not so important, as the application logic does not care usually about those (the application might monitor the candidates and know if the gathering is done when a null candidate surfaces), the ice connection states are VERY important to know if a connection was established and your application should focus on that. The peer connection state can be stable, and all the handshake done, without media flowing if the ICE connection state is failed.

也就是說iceConnectionState說明連接是否建立,即便websocket的握手完成,倘若iceConnectionState連接失敗(狀態(tài)不是connected),那么就不會有媒體流傳輸

考慮到自己在創(chuàng)建RTCPeerConnection時只使用了STUN服務(wù)器,是不是需要TURN服務(wù)器?

?

我在剛接觸TURN時的一些疑問

Q:TURN和STUN的區(qū)別

A:百度:“TURN和STUN的區(qū)別”,我只是使用了STUN和TURN,并沒有對其背后的原理進一步深入了解,就在這里不丟人了。

Q:需要兩臺服務(wù)器嗎?TURN服務(wù)器可不可以和信令服務(wù)器是同一臺服務(wù)器?

A:一臺就夠,TURN服務(wù)可以和信令轉(zhuǎn)發(fā)服務(wù)配置在同一臺服務(wù)器上,只要確保其使用的端口不沖突就可以了,我已經(jīng)試過并成功了

Q:自己搭TURN服務(wù)器感覺好麻煩啊,可以只使用STUN服務(wù)器嗎?有免費的TURN服務(wù)器嗎?

A:網(wǎng)上一搜有很多“國內(nèi)免費的STUN服務(wù)器”,具體是否能用你可以用我下面提到的Trickle ICE來檢測;

這個網(wǎng)站提供了免費的STUN/TURN服務(wù)器(需要注冊)http://numb.viagenie.ca/

但是但是但是!盡管我在Trickle ICE中能夠成功得到ice候選,如下圖。而且在使用時RTCPeerConnection的iceConnectionState屬性也顯示為connected,但我仍然沒能成功傳輸媒體流。在我的整個WebRTC項目完成后我回過頭來測試這個仍然不行...

注冊后成功后你的郵箱會收到郵件(注冊時驗證碼可能要多刷新幾次)

最終我還是搭建了自己的TURN服務(wù)器

?

搭建TURN服務(wù)器


參考:

Centos6 安裝 stun/turn服務(wù)??https://yq.aliyun.com/articles/138462

搭建ICE(TURN、STUN)服務(wù)??https://blog.csdn.net/qq_41345773/article/details/88965707

我服務(wù)器是CentOS 7.3.x

1.安裝必須的文件

yum install -y make gcc cc gcc-c++ wget

yum install -y openssl-devel libevent libevent-devel mysql-devel mysql-server

?

2.下載并安裝 LibEvent modules

下載

wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz

解壓

tar zxvf libevent-2.0.21-stable.tar.gz

進入解壓生成的文件夾:

cd libevent-2.0.21-stable

生成makefile文件

./configure

執(zhí)行make

sudo make ?

安裝

sudo make install

退回上一級目錄

cd ..

?

3.下載并安裝 TURN modules

和上面一樣

wget http://turnserver.open-sys.org/downloads/v4.4.5.2/turnserver-4.4.5.2.tar.gz tar -zxvf turnserver-4.4.5.2.tar.gz cd turnserver-4.4.5.2 ./configure sudo make sudo make install

4.turnserver安裝成功后會出現(xiàn)如下信息

告知相關(guān)使用事項,需要一直看完(我還以為卡掉了....)

1) If you system supports automatic start-up system daemon services,

the, to enable the turnserver as an automatically started system

service, you have to:

????????a) Create and edit /etc/turnserver.conf or

????????/usr/local/etc/turnserver.conf .

????????Use /usr/local/etc/turnserver.conf.default as an example.

????????b) For user accounts settings: set up SQLite or PostgreSQL or

????????MySQL or MongoDB or Redis database for user accounts.

????????Use /usr/local/share/turnserver/schema.sql as SQL database schema,

????????or use /usr/local/share/turnserver/schema.userdb.redis as Redis

????????database schema description and/or

????????/usr/local/share/turnserver/schema.stats.redis

????????as Redis status & statistics database schema description.

????????If you are using SQLite, the default database location is in

????????/var/db/turndb or in /usr/local/var/db/turndb or in /var/lib/turn/turndb.

????????c) add whatever is necessary to enable start-up daemon for the

????????/usr/local/bin/turnserver.

2) If you do not want the turnserver to be a system service,

???then you can start/stop it "manually", using the "turnserver"

???executable with appropriate options (see the documentation).

3) To create database schema, use schema in file

/usr/local/share/turnserver/schema.sql.

4) For additional information, run:

???$ man turnserver

???$ man turnadmin

???$ man turnutils
?

5.配置conf文件

找到以下目錄的文件,注意!這個default文件只是個示例!!

/usr/local/etc/turnserver.conf.default

使用cp命令將其復(fù)制到/etc/turnserver.conf/usr/local/etc/turnserver.conf

即執(zhí)行命令

cp /usr/local/etc/turnserver.conf.default /etc/turnserver.conf

cp /usr/local/etc/turnserver.conf.default /usr/local/etc/turnserver.conf

我使用的是第一條命令,第二條命令沒有測試

?

6.修改turnserver.conf的內(nèi)容

turnserver.conf文件中有對設(shè)置內(nèi)容的詳細描述,學(xué)好英語或善用翻譯軟件

需要設(shè)置的主要有以下幾點:

內(nèi)網(wǎng)IP:

listening-ip=172.16.0.13

端口listening-port不設(shè)置默認為3478

外網(wǎng)IP:
external-ip=106.52.27.49

長時驗證
lt-cred-mech

登錄用戶名&密碼(假如我的是winka9587,密碼是123)
user=winka9587:123

其他的都用默認值

未解決的問題:

很奇怪的一點,我在conf文件中同時設(shè)置兩個靜態(tài)用戶就無法成功獲得候選

user=user:pwd

user=user2:pwd2

但是如果只設(shè)置一個,那么就可以成功獲得候選(沒搞明白為什么)

?

7.啟動turnserver

假設(shè)你在conf文件中設(shè)置的

外網(wǎng)ip為106.52.27.49

端口為3478

記得去服務(wù)器控制臺配置好安全組規(guī)則,開放3478端口

你的conf路徑為/etc/turnserver.conf

執(zhí)行命令turnserver -v -r 106.52.27.49:3478 -a -o -c /etc/turnserver.conf

8.關(guān)閉turnserver

ps -ef|grep turnserver kill -9 [序號]

?

如何測試我的TURN服務(wù)器是否成功運行?

瀏覽器訪問 http://【 TURN服務(wù)器iIP地址 】:【 端口 】

出現(xiàn)下圖 表示TURN服務(wù)器已經(jīng)成功運行

此外,你可能會想看看是否能夠成功通過你的TURN服務(wù)器獲得ICE候選

可以使用Trickle?ICE,這是WebRTC官方部署在github上的一個示例,可以用它來檢測通過STUN/TURN服務(wù)器獲得的ICE候選

默認的是Google的一個免費STUN服務(wù)器:stun.l.google.com:19302

單擊Gather candidates即可通過你輸入的所有STUN/TURN服務(wù)器收集候選

?

比如我自己的TURN服務(wù)器ip及端口為106.52.27.49:3478

因為測試的是TURN服務(wù)器,所以前面加上turn:(如果測試STUN服務(wù)器就加stun,就像上面的Google服務(wù)器是stun.l.google.com:19302,前面要加上stun:

turn:106.52.27.49:3478

用戶名xxx

密碼xxx

添加之后收集候選

Component Type 為 relay?的就是通過TURN服務(wù)器得到的候選

?

解決ICE問題過程中遇到的另一個問題

在嘗試解決上面問題的途中我遇到了另一個問題,在使用node-wrtc的過程中我無法SetRemoteDescription,會拋出異常,查看之后發(fā)現(xiàn)原因是服務(wù)器端的RTCPeerConnection的signalingState在構(gòu)造函數(shù)完成后狀態(tài)變?yōu)閏losed,而客戶端的初始狀態(tài)為stable(PeerConnection剛剛建立還未開始協(xié)商或者已經(jīng)協(xié)商完成,參考:signalingState的官方文檔)

參考問題:https://github.com/feross/simple-peer/issues/426

因為在RTCPeerConnection的構(gòu)造函數(shù)中參數(shù)有turn服務(wù)器和stun服務(wù)器的地址,問題出在其中的url和urls上

WebRTC的最新標準已經(jīng)拋棄了url,使用urls

這里說一下我因為繞了一些彎路的原因,在服務(wù)器端需要使用WebRTC,所以使用了nodejs的node-wrtc模塊,這個模塊嚴格遵守了最新的WebRTC標準,很多官方最新標準中被廢棄的功能在這里面“非常及時”地被刪除了...而在瀏覽器上仍然可用,比如onaddstream、url

var iceOption= { iceServers: [//stun服務(wù)器{urls:"stun:stun.l.google.com:19302"},//turn服務(wù)器&登錄用戶名&密碼{urls: "turn:106.52.27.49:3478",username:"用戶名",credential:"密碼"}]};var pc = new RTCPeerConnection(iceOption);

見iceServer的官方文檔

https://developer.mozilla.org/en-US/docs/Web/API/RTCIceServer

解決方案:將url修改為urls

?

?

總結(jié)

以上是生活随笔為你收集整理的配置TURN服务器实现NAT穿透的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。