STUN (Session Traversal Utilities for NAT), IP ağlarında gerçek zamanlı ses video için kullanılan bir IETF protokolüdür. STUN bir sunucu-istemci protokolüdür; bir STUN sunucusu genellikle hem UDP hem de TCP üzerinde çalışır ve 3478 numaralı bağlantı noktasını dinler.
STUN protokolünün temel amacı, bir NAT'ın arkasında çalışan bir cihazın genel IP'sini ve NAT türünün ne olduğunu keşfetmesini sağlamaktır.
STUN, bir NAT'ın arkasındaki eşler (peer) arasında iletişim kurmak için bir mekanizma sağlar. Eşler, genel IP adresinin ve Bağlantı Noktasının hangisi olduğunu öğrenmek için bir STUN sunucusuna bir istek gönderir. İstemciden sunucuya gönderilen binding istekleri, NAT'lar tarafından ayrılan IP ve bağlantı noktası bağlamalarını belirlemek için kullanılır. STUN istemcisi, STUN sunucusuna bir Binding isteği gönderir, sunucu istemci tarafından kullanılan kaynak IP ve Bağlantı Noktasını inceler ve bu bilgiyi istemciye döndürür.
STUN Sunucusu
TsgcSTUNServer, STUN protokolünü uygulayan ve STUN istemcilerinden gelen binding isteklerini işlemeye olanak tanıyan sunucudur.
STUN sunucusu Kimlik Doğrulama ile veya olmadan yapılandırılabilir, Fingerprint Özniteliğini doğrulayabilir, bir alternatif sunucu gönderebilir ve daha fazlasını yapabilir.
Temel Kullanım
Genellikle stun sunucuları UDP 3478 bağlantı noktasında çalışır ve kimlik doğrulama gerektirmez, bu nedenle bir STUN sunucusu yapılandırmak için dinleme bağlantı noktasını (varsayılan olarak 3478) ayarlayın ve sunucuyu başlatın.
Sunucuyu yapılandırın
- Port: dinleyen Sunucu bağlantı noktası, örnek: 3478
STUN sunucusunu başlatmak için Active = True özelliğini ayarlayın.
Yeni bir Delphi STUN Sunucusunun nasıl başlatılacağını gösteren aşağıdaki Delphi Kodunu inceleyin.
oSTUN := TsgcSTUNServer.Create(nil); oSTUN.Port := 3478; oSTUN.Active := True;
Uzun Süreli Kimlik Bilgileri (Long-Term Credentials)
Genellikle STUN Sunucuları Kimlik Doğrulama olmadan yapılandırılır, bu nedenle herhangi bir STUN istemcisi bir binding isteği gönderebilir ve sunucudan Kimlik Doğrulama olmadan bir yanıt bekleyebilir.
sgcWebSockets STUN Sunucusu Uzun Süreli Kimlik Bilgilerini destekler, böylece TsgcSTUNServer'ı yalnızca Uzun Süreli kimlik bilgisi içeren binding isteklerine izin verecek şekilde yapılandırabilirsiniz.
Bunu yapılandırmak için STUNOptions.Authorization özelliğine erişin ve etkinleştirin.
Ardından LongTermCredentials özelliğine erişin ve etkinleştirin. Varsayılan olarak, bu tür yetkilendirme zaten bir Realm dizesiyle ve 10 dakikalık (= 600 saniye) varsayılan bir StaleNonce değeriyle yapılandırılmıştır.
Uzun Süreli Kimlik Bilgileri etkinleştirilmiş yeni bir Delphi STUN Sunucusunun nasıl oluşturulacağını gösteren aşağıdaki Delphi Kodunu inceleyin.
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 İstemcisi
TsgcSTUNClient, STUN protokolünü uygulayan ve STUN sunucularına binding istekleri göndermeye olanak tanıyan istemcidir.
Bileşenler, taşıma olarak UDP ve TCP kullanmaya olanak tanır ve taşıma olarak UDP kullanıldığında, yanıt kısa bir süre sonra gelmezse istekleri yeniden göndermek için bir Yeniden İletim mekanizması uygular.
Temel kullanım
Genellikle stun sunucuları UDP 3478 bağlantı noktasında çalışır ve kimlik doğrulama gerektirmez, bu nedenle bir STUN istek binding'i göndermek için, istemcinin nereye bağlanacağını bilmesini sağlamak üzere sunucu özelliklerini doldurun ve bileşenin sunucudan yanıt alacağı olayları işleyin.
Sunucuyu yapılandırın
- Host: sunucunun IP veya DNS adı, örnek: stun.sgcwebsockets.com
- Port: dinleyen Sunucu bağlantı noktası, örnek: 3478
STUN sunucusuna bir istek binding'i göndermek için SendRequest metodunu çağırın.
Olayları işleyin
- Sunucu başarılı bir yanıt döndürürse, OnSTUNResponseSuccess olayı çağrılır ve aBinding nesnesini okuyarak Binding bilgisine erişebilirsiniz.
- Sunucu bir hata döndürürse, OnSTUNResponseError olayı çağrılır ve aError nesnesini okuyarak Hata Kodu ve Nedenine erişebilirsiniz.
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;
});
