web-dev-qa-db-ja.com

WebRTC-指定する必要があるSTUN / TURNサーバーの数

NAT traversalWebRTCで問題が発生しています。ビデオストリーミングは一部の人では機能しますが、学生寮のルーターの背後にいる人では機能しません。

これはTURNサーバーを使用して解決する必要があると思います。私はそれをしました、それはまだ機能していません、そして今、私はTURNサーバーがまったく機能しているかどうか疑問に思っています。結果として、複数のTURNサーバーを設定できるかどうか、また設定する必要があるかどうか、そうであればどのように設定するかを考えます。

私は 別のスレッドのSTUN/TURNサーバーのこのリスト を見つけました。今、私はこのように設定しています

var STUN = {
    'url': 'stun:stun.l.google.com:19302',
};

var TURN = {
    url: 'turn:[email protected]:80',
    credential: 'homeo'
};

var iceServers = 
{
    iceServers: [STUN, TURN]
};

var pc = new RTCPeerConnection(iceServers);

だから私の質問は基本的に:複数のSTUN/TURNサーバーを設定することは可能ですか?可能であればそれを行う必要がありますか?そのコードはどのようになりますか?

21
spacecoyote
A STUN server is used to get an external network address.
TURN servers are used to relay traffic if direct (peer to peer) connection fails.

STUNサーバーまたはTURNサーバー、あるいはその両方のURLは、RTCPeerConnectionコンストラクターの最初の引数であるiceServers構成オブジェクトのWebRTCアプリによって(オプションで)指定されます。

より多くのサーバーを使用する例:

var ICE_config= {
  'iceServers': [
    {
      'url': 'stun:stun.l.google.com:19302'
    },
    {
      'url': 'turn:192.158.29.39:3478?transport=udp',
      'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
      'username': '28224511:1379330808'
    },
    {
      'url': 'turn:192.158.29.39:3478?transport=tcp',
      'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
      'username': '28224511:1379330808'
    }
  ]
}
pc = new RTCPeerConnection(ICE_config);

RTCPeerConnectionがその情報を取得すると、ICEマジックが自動的に発生します。RTCPeerConnectionはICEフレームワークを使用してピア間の最適パスを計算し、必要に応じてSTUNサーバーとTURNサーバーを操作します。

[〜#〜] stun [〜#〜]:公衆インターネット上にあるSTUNサーバーには、1つの簡単なタスクがあります。IP:ポートアドレスを確認します(NATの背後で実行されているアプリケーションからの)着信要求とその応答を応答として送信します。つまり、アプリケーションはSTUNサーバーを使用して、パブリックの観点からIP:ポートを検出します。このプロセスにより、WebRTCピアがパブリックにアクセス可能なアドレスを取得し、直接リンクをセットアップするために、それをシグナリングメカニズムを介して別のピアに渡すことができます。 (実際には、さまざまなNATはさまざまな方法で機能し、複数のNAT=レイヤーが存在する場合がありますが、原則は同じです。)

[〜#〜] turn [〜#〜]:TURN RTCPeerConnectionは、UDPを介してピア間の直接通信をセットアップしようとします。それが失敗した場合、RTCPeerConnectionはTCPを使用します。それが失敗した場合、TURNサーバーをフォールバックとして使用して、エンドポイント間でデータを中継できます。

繰り返しますが、TURNはピア間でオーディオ/ビデオ/データストリーミングを中継するために使用され、データのシグナリングではありません!

TURNサーバーにはパブリックアドレスがあるため、ピアがファイアウォールまたはプロキシの背後にある場合でも、ピアからアクセスできます。 TURNサーバーには、ストリームをリレーするという概念的にシンプルなタスクがありますが、STUNサーバーとは異なり、本質的に多くの帯域幅を消費します。つまり、TURNサーバーはより強力である必要があります。

this を参照

21
Muath

STUNに関して、WebRTCはバインド要求をすべてに送信し、結果がマージされます。 (WebRTCコードの古いバージョンでは、最初のSTUNサーバーのみが使用されているようです)

平均で接続時間を短縮できるため、複数のSTUNサーバーを使用することをお勧めします。正確な数は、STUNサーバーの信頼性によって異なります。 通常は2つで十分です

TURNについては、P2P接続ができない場合にこれらのサーバーがトラフィックを中継するため、問題はさらに複雑になります。多くのクライアントがある場合、単一のTURNサーバーがおそらく最大帯域幅に達します。この場合、複数のTURN Serverを設定すると役立ちます。

どうやって? 接続性チェックフェーズ中に、WebRTCは往復時間が最も短いTURNリレーを選択します。したがって、複数のTURN Serverを設定すると、帯域幅とユーザー数の点でアプリケーションをスケールアップできます。

大規模なアプリケーションを開発していない場合は、1または2のTURNサーバーで通常十分です

https://chromium.googlesource.com/external/webrtc/+/master でWebRTCコードを参照できます。

私は内部を見ることをお勧めします:webrtc/p2p/client/basicportallocator.cc、webrtc/p2p/base/stunport.ccおよびwebrtc/p2p/base/turnport.cc

8
Emil

この問題は、大学のファイアウォールがポート19302をブロックしている可能性があります。パブリックwifiファイアウォールは通常、ポート80と443でのみトラフィックを許可します。言い換えると、ポート19302を使用しようとするため、GoogleのSTUNサーバーを使用しないでください。学校のファイアウォール。

0
kiwicomb123