Перейти к основному содержимому

STUN

STUN (Session Traversal Utilities for NAT) – это сетевой протокол, который используется для определения внешних IP-адресов и портов устройства за NAT (Network Address Translation), а также для проверки наличия соединения между двумя узлами через различные типы NAT. В контексте видеоконференций и VoIP (голосовой связи через интернет) STUN играет важную роль при установлении соединений между клиентами и серверами, особенно когда оба клиента находятся за NAT.

Основные Функции STUN:

  1. Определение внешнего IP-адреса и порта: Клиент отправляет запрос к серверу STUN, и тот возвращает информацию об IP-адресе и порте, видимых извне NAT.
  2. Проверка доступности соединения: С помощью специальных сообщений STUN можно проверить, доступен ли другой узел через сеть.
  3. Поддержка различных типов NAT: STUN поддерживает работу с различными типами NAT, такими как Full Cone NAT, Restricted Cone NAT, Port Restricted Cone NAT и Symmetric NAT.
  4. Интеграция с другими технологиями: STUN часто используется совместно с протоколами ICE (Interactive Connectivity Establishment) и TURN (Traversal Using Relays around NAT).

Как Работает STUN?

Протокол STUN основан на обмене UDP-сообщениями между клиентом и сервером. Сервер STUN отвечает на запросы клиентов, предоставляя им информацию о внешнем IP-адресе и порте, видимом со стороны интернета. Вот краткий пример последовательности действий:

  1. Клиент отправляет запрос на сервер STUN.
  2. Сервер получает запрос и определяет внешний IP-адрес и порт клиента.
  3. Сервер формирует ответ, содержащий эту информацию, и отправляет её обратно клиенту.
  4. Клиент получает ответ от сервера и использует полученные данные для установления соединения с другим клиентом или сервером.

Формат Сообщений STUN

Сообщения STUN состоят из заголовков и атрибутов. Заголовок содержит обязательную информацию, такую как тип сообщения, длину и магическое число. Атрибуты содержат дополнительные данные, такие как IP-адрес и порт, которые возвращаются клиенту.

Вот структура заголовка STUN:

class StunHeader:
def __init__(self):
self.type = 0x0001 # Тип сообщения (например, Binding Request)
self.length = 20 # Длина сообщения без учета заголовка
self.magic_cookie = 0x2112A442 # Магический номер для идентификации STUN

Пример атрибута MAPPED-ADDRESS:

class StunMappedAddressAttribute:
def __init__(self, address_family, port, ip_address):
self.attribute_type = 0x0001 # Тип атрибута (MAPPED-ADDRESS)
self.address_family = address_family # Семейство адресов (IPv4/IPv6)
self.port = port # Порт
self.ip_address = ip_address # Внешний IP-адрес

Использование STUN в приложениях голосовой и видеосвязи

В приложениях видеоконференций и VoIP STUN обычно используется вместе с протоколом ICE для установления прямого P2P-соединения между участниками. Рассмотрим простой пример использования STUN на Python для получения внешнего IP-адреса и порта.

import socket
from stun import StunClient

def get_external_ip_and_port():
client = StunClient()
response = client.send_request('stun.l.google.com', 19302)

if response is not None:
external_ip = response['external_ip']
external_port = response['external_port']

print(f'External IP: {external_ip}')
print(f'External Port: {external_port}')
else:
print("Failed to retrieve external IP and port.")

if __name__ == "__main__":
get_external_ip_and_port()

Этот код использует библиотеку stun для отправки запроса на публичный STUN-сервер Google (stun.l.google.com) и получения информации о внешнем IP-адресе и порте.