STUN(Session Traversal Utilities for NAT)は IP ネットワーク上のリアルタイム音声・映像に使用される IETF プロトコルです。STUN はサーバー・クライアントプロトコルであり、STUN サーバーは通常 UDP と TCP の両方でポート 3478 をリッスンします。
STUN プロトコルの主な目的は、NAT の背後で動作するデバイスが自分のパブリック IP アドレスと NAT の種類を把握できるようにすることです。
STUN は NAT 背後のピア間で通信するためのメカニズムを提供します。ピアは STUN サーバーにリクエストを送信して自分のパブリック IP アドレスとポートを確認します。クライアントからサーバーへ送信されるバインディングリクエストは、NAT が割り当てた IP とポートのバインディングを特定するために使用されます。STUN クライアントはバインディングリクエストを STUN サーバーに送信し、サーバーはクライアントが使用した送信元 IP とポートを検査してこの情報をクライアントに返します。
STUN サーバー
TsgcSTUNServer は STUN プロトコルを実装したサーバーであり、STUN クライアントからのバインディングリクエストを処理します。
STUN サーバーは認証あり/なしで設定でき、フィンガープリント属性の検証・代替サーバーの送信などに対応しています。
基本的な使い方
STUN サーバーは通常 UDP ポート 3478 で動作し認証を必要としません。STUN サーバーを設定するにはリスニングポート(デフォルト 3478)を設定してサーバーを起動します。
サーバーの設定
- Port: サーバーのリスニングポート(例:3478)
Active = True プロパティを設定して STUN サーバーを起動します。
新しい Delphi STUN サーバーを起動する方法を示す Delphi コードを以下に示します。
oSTUN := TsgcSTUNServer.Create(nil); oSTUN.Port := 3478; oSTUN.Active := True;
長期認証情報
通常 STUN サーバーは認証なしで設定されており、すべての STUN クライアントが認証なしでバインディングリクエストを送信してサーバーから応答を受け取れます。
sgcWebSockets STUN サーバーは長期認証情報をサポートしており、長期認証情報を持つバインディングリクエストのみを許可するように TsgcSTUNServer を設定できます。
設定するには STUNOptions.Authorization プロパティにアクセスして有効にします。
次に LongTermCredentials プロパティにアクセスして有効にします。デフォルトでは、この認証タイプは Realm 文字列と StaleNonce のデフォルト値 10 分(600 秒)で設定済みです。
長期認証情報を有効にした新しい Delphi STUN サーバーの作成方法を示す Delphi コードを以下に示します。
oSTUN := TsgcSTUNServer.Create(nil);
oSTUN.Port := 3478;
oSTUN.STUNOptions.Authentication.Enabled := True;
oSTUN.STUNOptions.Authentication.LongTermCredentials.Enabled := True;
oSTUN.STUNOptions.Authentication.LongTermCredentials.Realm := 'sgcWebSockets';
oSTUN.STUNOptions.Authentication.LongTermCredentials.StaleNonce := 600;
oSTUN.Active := True;
procedure OnSTUNRequestAuthorization(Sender: TObject; const aRequest: TsgcSTUN_Message; const aUsername, aRealm: string; var Password: string);
begin
if aUsername = 'my-user' then
Password := 'my-password';
end;
STUN クライアント
TsgcSTUNClient は STUN プロトコルを実装したクライアントであり、STUN サーバーへバインディングリクエストを送信します。
このコンポーネントはトランスポートとして UDP と TCP を使用でき、UDP を使用する場合は応答が一定時間内に届かない場合にリクエストを再送する再送メカニズムを実装しています。
基本的な使い方
通常 STUN サーバーは UDP ポート 3478 で動作し認証を必要としません。STUN バインディングリクエストを送信するには、サーバープロパティを設定してクライアントに接続先を伝え、コンポーネントがサーバーからの応答を受け取るイベントを処理します。
サーバーの設定
- Host: サーバーの IP または DNS 名(例:stun.sgcwebsockets.com)
- Port: サーバーのリスニングポート(例:3478)
メソッド SendRequest を呼び出して STUN サーバーにバインディングリクエストを送信します。
イベントの処理
- サーバーが成功応答を返した場合、OnSTUNResponseSuccess イベントが呼び出され、aBinding オブジェクトを読み取ってバインディング情報にアクセスできます。
- サーバーがエラーを返した場合、OnSTUNResponseError イベントが呼び出され、aError オブジェクトを読み取ってエラーコードと理由にアクセスできます。
oSTUN := TsgcSTUNClient.Create(nil);
oSTUN.Host := 'stun.sgcwebsockets.com';
oSTUN.Port := 3478;
oSTUN.SendRequest;
procedure OnSTUNResponseSuccess(Sender: TObject; const aMessage: TsgcSTUN_Message; const aBinding: TsgcSTUN_ResponseBinding);
begin
DoLog('Remote IP: ' + aBinding.RemoteIP + '. Remote Port: ' + IntToStr(aBinding.RemotePort));
end;
procedure OnSTUNResponseError(Sender: TObject; const aMessage: TsgcSTUN_Message; const aError: TsgcSTUN_ResponseError);
begin
DoLog('Error: ' + IntToStr(aError.Code) + ' ' + aError.Reason);
end;
});
