設定可能なTURNサーバー
OpenTokクライアントが使用するTURNサーバーを設定できます。
この機能は アドオン機能.
このトピックには以下のセクションが含まれます:
- 概要
- OpenTok.js
- OpenTok Android SDK
- OpenTok iOS SDK
- OpenTok Windows SDK
- OpenTok macOS SDK
- OpenTok Linux SDK
- OpenTok React Native SDK
- 既知の問題
- よくあるご質問
概要
セッション内の各クライアントに対して、以下の方法でTURNサーバーの使用方法をカスタマイズすることができます:
-
クライアントが使用するTURNサーバーのリストを追加することができます。
-
クライアントが、貴社のTURNサーバーのみを使用するか、それとも OpenTokのTURNサーバーに加えてそれらを使用するかを決定できます
独自のTURNサーバーを追加することで、OpenTokのTURNサーバーがブロックされている可能性のある 制限の厳しいネットワーク環境においても、ユーザーが接続できるようになります。
OpenTokのTURNサーバーを無効にして、独自のTURNサーバーのみを使用するように設定すれば、 メディアストリームがネットワーク外へ流出することを確実に防ぐことができます。
OpenTok.js (Webクライアント用)、OpenTok iOS SDK、またはOpenTok Android SDK を使用することで、セッションに接続する各クライアントごとに独自のTURNサーバーを追加できます。カスタムTURNサーバーAPIは、 これらのClient SDKのバージョン2.13.0で追加されました。
また IPプロキシ アドオン機能で 独自のプロキシサーバーを使用して ノンメディア トラフィック(Video APIの呼び出し、 WebSocket接続、ログトラフィックなど)。
OpenTok.js
について options パラメーターの OT.initSession() このメソッドには、 iceConfig
プロパティを含む。このプロパティには以下のプロパティが含まれる:
-
includeServers(String) - 以下のように設定する。'custom'で提供されたカスタム TURNサーバーを使用します。customServers配列に設定します。これを'all'(デフォルト)と クライアントが提供するカスタムTURNサーバーとOpenTok TURNサーバーの両方を使用します。 -
transportPolicy(String) - 以下のように設定する。'all'(デフォルト)、クライアントは すべてのICEトランスポートタイプ(host、srflx、TURNなど)を使用してメディア接続を確立します。設定 これを'relay'TURN経由での接続を常に強制し、他のすべてのICE候補を無視する。 候補を無視する。 -
customServers(Array) - カスタム TURN サーバーを定義するオブジェクトの配列を設定します。 各オブジェクトは1つのカスタムTURNサーバーに対応し、以下のプロパティを含みます:-
urls(文字列または文字列の配列) - 文字列または文字列の配列。 は、TURNサーバーがサポートするURLである(URLは1つだけである場合もある)。 -
username(String) - このオブジェクトで定義されているTURNサーバーのユーザー名。 -
credential(String) - このオブジェクトで定義されたTURNサーバーのクレデンシャル文字列。 オブジェクトで定義されている
-
注: クライアントが指定したTURNサーバのみを使用するようにするには(OpenTok TURNサーバは使用しない
OpenTok TURN サーバーは使わない): TURN サーバーに includeServers プロパティ 'custom'を設定する。
transportPolicy プロパティ 'relay'を設定する。 customServers プロパティで
TURNサーバーをリストアップします。
カスタム TURN 認証情報を動的に更新するには、 Session.setIceConfig() メソッドを使用する。
次の例は、クライアントにTURNサーバーを設定する方法を示している:
const session = OT.initSession(projectId, sessionId, {
iceConfig: {
includeServers: 'custom',
transportPolicy: 'relay',
customServers: [
{
urls: [
'turn:123.124.125.126:3478?transport=udp',
'turn:123.124.125.126:3478?transport=tcp'
],
username: 'webrtc',
credential: 'foO0Bar1'
},
{
urls: [
'turns:turntls.example.com:3478?transport=tcp'
],
username: 'webrtc',
credential: 'foO0Bar2',
},
],
},
});
OpenTok Android SDK
について Session.Builder クラスには、クライアントのTURNサーバーの使い方を設定するための2つのメソッドがあります:
-
Session.Builder.setCustomIceServers()— このメソッドを呼び出すと、クライアント用にカスタム TURN サーバーのリストが追加されます。 -
Session.Builder.setIceRouting()— このメソッドを呼び出すと、クライアント向けのICE オプションに制限が追加されます。
つの新しいメソッドに加えて、2つの新しい列挙型がTURNサーバーのオプションを定義している:
-
IncludeServers— カスタムサーバーのみを使用する場合と、 OpenTokサーバーとカスタムサーバーの両方を使用する場合のオプションが含まれています。 -
TransportPolicy— 使用するルーティング方法を説明します。
注: クライアントに、指定したTURNサーバーのみを使用させ(OpenTokのTURNサーバーは 使用させない)、Sessionオブジェクトの作成に使用するSession.Builder オブジェクトの以下のメソッドを呼び出します:
-
setCustomIceServers()— IceServer オブジェクトのリスト (カスタム TURN サーバーに対応するもの)をserverListパラメータに を渡すIncludeServers.TURNとしてconfigパラメータが必要だ。 -
setIceRouting()— パスインTransportPolicy.Relay.
次の例は、クライアントにTURNサーバーを設定する方法を示している:
List<IceServer> serverList = new IceServer(
'turn:123.124.125.126:3478?transport=udp', // TURN server URL
'webrtc', // Username
'foO0Bar1' // Credential
);
mSession = new Session.Builder(this, apiKey, sessionId)
.setCustomIceServers(serverList, IncludeServers.Custom)
.setIceRouting(TransportPolicy.TURN)
.build();
mSession.setSessionListener(this);
mSession.connect(token);
OpenTok iOS SDK
OTSessionオブジェクトを初期化するときに OTSessionSettings.iceConfig
プロパティを使用して、クライアントのカスタム TURN サーバー設定を定義します。
OTSessionICEConfig クラスは OTSessionSettings.iceConfig 財産である。
注: クライアントに、指定したTURNサーバーのみを使用させ(OpenTokのTURNサーバーは
使用させない)、以下の関数を呼び出します。 [OTSessionSettings addICEServerWithURL:] メソッドの
メソッドを設定します。次に
オブジェクトの以下のプロパティを設定します:
-
includeServers— これを「OTSessionICEIncludeServersCustom」に設定してください。 -
transportPolicy— これを OTSessionICETransportRelay に設定してください。
を設定することができます。 OTSessionICEConfig.filterOutLanCandidates プロパティは
プロパティで、中継セッションで同じローカルネットワーク上のクライアントにサブスクライブしないようにします、
これは、iOS 14+でアプリがユーザーに許可を求める結果となる。
この機能は はない。 設定可能なTURNアドオンが必要です。
詳しくは 本題.
次の例は、クライアントにTURNサーバーを設定する方法を示している:
OTSessionICEConfig *myICEServerConfiguration = [[OTSessionICEConfig alloc] init];
myICEServerConfiguration.includeServers = OTSessionICEIncludeServersCustom;
myICEServerConfiguration.transportPolicy = OTSessionICETransportRelay;
NSError *error = nil;
[myICEServerConfiguration addICEServerWithURL:@"turn:123.124.125.126:3478?transport=udp"
userName:@"webrtc"
credential:@"foO0Bar1"
error:&error];
OTSessionSettings *settings = [[OTSessionSettings alloc] init];
settings.iceConfig = myICEServerConfiguration;
_session = [[OTSession alloc] initWithApiKey:kApiKey
sessionId:kSessionId
delegate:self
settings:settings];
OpenTok Windows SDK
IceConfig クラスを使用して、クライアントが使用するカスタム ICE 構成を設定します。 を設定します。
について IceConfig() コンストラクタ・メソッドには以下のパラメータがある:
-
customIceServers-- クライアントが使用するカスタムTURNサーバーを表すIceServerオブジェクトのリスト。 オブジェクトのリスト。それぞれの IceServer に対して カスタムTURNサーバーのURL、ユーザー名、認証文字列を設定する。 -
transportPolicy-- の値を設定する。ICETransportを列挙する:-
All-- クライアントはすべてのICE候補タイプ(ホスト、srflx、リレーなど)を使用する。 を使用してメディア接続を確立する。 -
Relayed-- クライアントは常にTURNを介して接続を強制し、他のICE候補を無視する。 他のすべてのICE候補を無視する。
-
-
includeServers-- の値を設定する。IncludeServersを列挙する:-
All-- クライアントは、お客様が提供するカスタムTURNサーバーに加え、 OpenTokのTURNサーバーも利用します。 -
Custom-- クライアントは、あなたが提供したカスタムTURNサーバーだけを使用します。
-
Session.Builder クラスには IceConfig プロパティ。Session オブジェクトを構築する際、これを
IceConfig オブジェクトに設定してください。
次の例は、クライアントにTURNサーバーを設定する方法を示している:
List<IceServer> iceServers = new List<IceServer>() {
new IceServer(
"turn:123.124.125.126:3478?transport=udp", "webrtc", "fo0Bar1"
)
};
IceConfig iceConfig = new IceConfig(
iceServers,
ICETransport.Relayed,
ICEIncludeServers.Custom
);
session = new Session.Builder(context, apiKey, sessionId){
IceConfig = iceConfig
}.Build();
OpenTok macOS SDK
タイプ otc_custom_ice_config は、以下のメンバーを含む構造体を定義している:
-
num_ice_servers-- ICEサーバーの数 -
ice_url-- ICEサーバーのURLを指定する文字列の配列。 -
ice_user-- TURNサーバーのユーザー名を指定する文字列の配列。 -
ice_credential-- TURNサーバーのクレデンシャル文字列を指定する文字列の配列。 を指定する文字列の配列。
に電話する。 otc_session_settings_set_custom_ice_config() 関数に渡して
を渡します。 otc_custom_ice_config インスタンスだ:
otc_session_settings_set_custom_ice_config(session_settings,
&ice_config);
次の例は、クライアントにTURNサーバーを設定する方法を示している:
// Provide the ICE configuration here.
struct otc_custom_ice_config ice_config;
ice_config.num_ice_servers = 1;
ice_config.ice_url = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_url[0] = strdup("turn:123.124.125.126:3478?transport=udp");
ice_config.ice_user = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_user[0] = strdup("webrtc");
ice_config.ice_credential = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_credential[0] = strdup("foO0Bar1");
ice_config.force_turn = OTC_TRUE;
ice_config.use_custom_turn_only = OTC_FALSE;
otc_session_settings *session_settings = otc_session_settings_new();
if (session_settings != NULL) {
otc_session_settings_set_custom_ice_config(session_settings,
&ice_config);
}
otc_session *session = NULL;
session = otc_session_new_with_settings(API_KEY,
SESSION_ID,
&session_callbacks,
session_settings);
if (session == NULL) {
printf("Could not create OpenTok session successfully");
return EXIT_FAILURE;
}
otc_session_connect(session, TOKEN);
OpenTok Linux SDK
タイプ otc_custom_ice_config は、以下のメンバーを含む構造体を定義している:
-
num_ice_servers-- ICEサーバーの数 -
ice_url-- ICEサーバーのURLを指定する文字列の配列。 -
ice_user-- TURNサーバーのユーザー名を指定する文字列の配列。 -
ice_credential-- TURNサーバーのクレデンシャル文字列を指定する文字列の配列。 を指定する文字列の配列。
に電話する。 otc_session_settings_set_custom_ice_config() 関数に渡して
を渡します。 otc_custom_ice_config インスタンスだ:
otc_session_settings_set_custom_ice_config(session_settings,
&ice_config);
次の例は、クライアントにTURNサーバーを設定する方法を示している:
// Provide the ICE configuration here.
struct otc_custom_ice_config ice_config;
ice_config.num_ice_servers = 1;
ice_config.ice_url = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_url[0] = strdup("turn:123.124.125.126:3478?transport=udp");
ice_config.ice_user = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_user[0] = strdup("webrtc");
ice_config.ice_credential = (char **)malloc(sizeof(char *) * ice_config.num_ice_servers);
ice_config.ice_credential[0] = strdup("foO0Bar1");
ice_config.force_turn = OTC_TRUE;
ice_config.use_custom_turn_only = OTC_FALSE;
otc_session_settings *session_settings = otc_session_settings_new();
if (session_settings != NULL) {
otc_session_settings_set_custom_ice_config(session_settings,
&ice_config);
}
otc_session *session = NULL;
session = otc_session_new_with_settings(API_KEY,
SESSION_ID,
&session_callbacks,
session_settings);
if (session == NULL) {
printf("Could not create OpenTok session successfully");
return EXIT_FAILURE;
}
otc_session_connect(session, TOKEN);
OpenTok React Native SDK
について options の支柱である。 OTSession コンポーネントには iceConfig
プロパティを含む。このオブジェクトには以下のプロパティが含まれます:
-
includeServers(String) - 以下のように設定する。'custom'で提供されたカスタム TURNサーバーを使用します。customServers配列に設定します。これを'all'(デフォルト)と クライアントが提供するカスタムTURNサーバーとOpenTok TURNサーバーの両方を使用します。 -
transportPolicy(String) - 以下のように設定する。'all'(デフォルト)、クライアントは すべてのICEトランスポートタイプ(host、srflx、TURNなど)を使用してメディア接続を確立します。設定 これを'relay'TURN経由での接続を常に強制し、他のすべてのICE候補を無視する。 候補を無視する。 -
customServers(Array) - カスタム TURN サーバーを定義するオブジェクトの配列を設定します。 各オブジェクトは1つのカスタムTURNサーバーに対応し、以下のプロパティを含みます:-
urls(文字列または文字列の配列) - 文字列または文字列の配列。 は、TURNサーバーがサポートするURLである(URLは1つだけである場合もある)。 -
username(String) - このオブジェクトで定義されているTURNサーバーのユーザー名。 -
credential(String) - このオブジェクトで定義されたTURNサーバーのクレデンシャル文字列。 オブジェクトで定義されている
-
注: クライアントが指定したTURNサーバのみを使用するようにするには(OpenTok TURNサーバは使用しない
OpenTok TURN サーバーは使わない): TURN サーバーに includeServers プロパティ 'custom'を設定する。
transportPolicy プロパティ 'relay'を設定する。 customServers プロパティで
TURNサーバーをリストアップします。
次の例は、クライアントにTURNサーバーを設定する方法を示している:
<OTSession
apiKey="your-api-key"
sessionId="your-session-id"
token="your-session-token"
options={{
iceConfig:{
transportPolicy: 'all',
includeServers: 'all',
customServers: [
{
urls: [
'turn:123.124.125.126:3478?transport=udp',
'turn:123.124.125.126:3478?transport=tcp'
],
username: 'webrtc',
credential: 'foO0Bar1'
},
],
}
}}
>
<OTPublisher style={{ width: 600, height: 400 }}/>
<OTSubscriber style={{ width: 600, height: 400 }} />
</OTSession>
既知の問題
クライアントが常にTURNサーバーを使用するように設定した場合 中継セッションそのため は、自身のストリーム(自身がパブリッシュするストリーム) をサブスクライブできない。
よくあるご質問
設定可能なTURN APIはHTTPトラフィックの問題に対応していますか?
いいえ。設定可能なTURNは、メディア・トラフィックのみの信頼できるエンドポイントへの接続に関する顧客の懸念を払拭します。 メディア・トラフィックに限ります。
HTTPトラフィックの場合、顧客は以下のいずれかを行う必要がある:
-
OpenTokのドメイン名をホワイトリストに登録する:
- *.opentok.com
- *.tokbox.com
-
Vonage Video API用に提供されたIPアドレスブロックをホワイトリストに登録します。
-
クライアントのWebプロキシ設定を使用して、すべてのVonage HTTPSトラフィックをプロキシする をプロキシします。プロキシ要件のセクションを参照してください。 これ.
利用可能なTURNターゲット間のメディアパスはどのように選択されているのか。往復の待ち時間を考慮しているのか、ターゲットをリストアップした順番に影響されているのか、それともランダムなのか。
TURNサーバーの順番は、提供されたリストに基づいて保証されるものではありません。その代わり、メディアが流れ始めると メディアが流れ始めると、ICEの実装は、どの候補/サーバーが最良の接続性を持ち、最初にネゴシエーションに成功したかを選択する。 を選択する。
TURNサーバーのURLが複数のIPアドレスにマッピングされている場合、セッションのために特定のTURNサーバーはどのように選択されますか?これはランダムですか?
ChromeやFirefoxで使用されているものを含め、ほとんどの実装では、DNSルックアップによって返された最初のIPを使用する。 この結果、通常はランダムなラウンドロビン選択となる。
TCPとUDPの両方のTURNサーバーが提供され、到達可能な場合、UDPターゲットを優先し、必要な場合のみTCPにフォールバックすることは可能か?
UDPのリレー候補はTCPのリレー候補よりも優先される。 の方が優先される。以下を参照のこと。 RFC 8445 を参照してください。渡されたICEサーバーの順番はこれに影響しない。
1つのクライアントで、異なるストリームに異なるメディアパスを使用できますか?
はい、OpenTokでは個々のメディアストリームを個別に扱うため、これは想定通りの動作です。
コンフィギュラブルTURN APIはメディアパスの選択においてどの程度のコントロールが可能ですか?
メディアパスの選択は、WebRTC内部のICE(Interactive Connectivity Establishment)によって処理されます。 この動作を変更する方法はない。コンフィギュラブルTURN APIは、クライアントからWebRTCに提供される は、クライアントがWebRTCに提供するICEサーバーのリストを変更するのに役立つだけで、選択プロセスには影響しない。
UDP経由でのOpenTok Media Serverへの直接接続は、常に推奨されるのでしょうか?
はい、OpenTok Media Server への直接接続が常に推奨されます。OpenTok Media Server への接続に失敗した場合、または「Configurable TURN API」で「Force TURN」オプションが使用された場合、 TURN への切り替えが行われます。
ロードバランシングのために、同じタイプの複数のTURNサーバーを使用できますか?
クライアントがランダムにサーバーを選ぶことになり、そのサーバーは接続期間中に変わる可能性があるため、これは推奨されません。
カスタムTURNサーバーの負荷分散方法は?
詳細はお問い合わせください。
TURNサーバーはメディアの暗号化を解除できますか?
TURNサーバーは、DTLS-SRTPを使用して交換されるSRTPキーにアクセスでき ない。 接続のエンドポイントのみが利用できる。
セッション中にTURNサーバーがクラッシュした場合の原因と復旧方法
TURNサーバーが使用中にクラッシュした場合、クライアントの接続は切断されます。 クライアントはICE再起動を使用して接続の再確立を試みます。
TURNサーバーのテスト方法は?
TURNサーバーのテストは、以下のいずれかの方法で行うことができます。 ビデオAPIプレイグラウンド, その トリクルアイスのテストページ または その turnutils_uclient.