💡 Полезные Советы

Про APIPA, Эффект гонки и как DORA связана с DHCP?

30.03.26
12

DHCP (Dynamic Host Configuration Protocol) - это сетевой протокол, который автоматически раздает устройствам IP-адреса и другие важные настройки (маску подсети, шлюз по умолчанию и адреса DNS-серверов). Без него каждый адрес в сети пришлось бы вбивать руками.

Процесс получения IP-адреса называется DORA (по первым буквам четырех этапов):

  1. D - Discover (Поиск): Новое устройство кричит на всю сеть (широковещательный запрос): "Эй! Мне нужен IP-адрес. Тут есть DHCP-сервер?"
  2. O - Offer (Предложение): Роутер (или выделенный сервер) слышит запрос, резервирует свободный адрес и отвечает: "Я тут. Возьми вот этот IP".
  3. R - Request (Запрос): Устройство отвечает: "Отлично, беру! Оформи аренду".
  4. A - Acknowledge (Подтверждение): Сервер фиксирует выдачу: "Договорились. Адрес твой на следующие 24 часа".

Динамические адреса - это удобно для смартфонов, но плохо для серверов. Например, если вы подняли сервер Minecraft или развернули виртуалку в Proxmox, смена IP после перезагрузки сломает все доступы. Для таких случаев в DHCP используют Static Lease (Резервирование) - жесткую привязку нужного IP-адреса к MAC-адресу сетевой карты устройства.

Пример: Клиентский ПК без интернета
Во время удаленной поддержки клиент жалуется, что сеть "отвалилась". Ты просишь его проверить IP-адрес в настройках Windows, и он диктует что-то вроде 169.254.x.x.
Это так называемый адрес APIPA (Automatic Private IP Addressing). Он означает, что процесс DORA сломался на первом же шаге: ПК прокричал "Discover", но DHCP-сервер ему не ответил (или до него не дошел запрос из-за проблем со свитчем). ОС поняла, что ответа не будет, и назначила себе этот резервный адрес.

Подробнее про APIPA (169.254.x.x)

APIPA (Automatic Private IP Addressing) - это встроенный в операционные системы (Windows, macOS, большинство дистрибутивов Linux) механизм "спасения утопающих".

Когда ПК отправляет широковещательный DHCP Discover, но в ответ тишина (таймаут), ОС понимает: "Сервера нет, но сеть как-то строить надо". Тогда она делает следующее:

  1. Выбирает случайный адрес из зарезервированного диапазона 169.254.0.1 – 169.254.255.254 с маской подсети 255.255.0.0 (или /16).
  2. Проверяет на конфликты: Перед тем как назначить этот адрес сетевому интерфейсу, ПК отправляет специальный запрос (Gratuitous ARP) в сеть: "Эй, у кого-нибудь уже есть этот 169.254.x.y?". Если ответа нет - забирает адрес себе. Если есть - генерирует новый и спрашивает снова.

APIPA не назначает основной шлюз (Default Gateway) и DNS.
Это значит, что интернета на этом ПК не будет. Однако, если в кабинете стоит свитч, к которому подключены пять компьютеров, и роутер внезапно "умер", все пять ПК получат адреса 169.254.x.x. Они смогут пинговать друг друга, и ты даже сможешь расшарить между ними папку по локалке. Это так называемая Link-Local сеть.

Два DHCP-сервера в одной сети: Эффект гонки (Race Condition)

Представь ситуацию: в офисе работает основной роутер (сеть 192.168.1.0/24), но кто-то из сотрудников принес из дома свой Wi-Fi роутер (сеть 10.0.0.0/24), воткнул его LAN-портом в офисную розетку и забыл выключить на нем DHCP. Это называется Rogue DHCP (ложный/паразитный DHCP-сервер).

Оба сервера находятся в одном широковещательном домене (L2-сегменте). Что произойдет, когда новый клиент включит ПК?

Сработает правило: Кто первый встал, того и тапки.

  1. Клиент кричит на всю сеть DHCP Discover.
  2. Этот крик слышат оба DHCP-сервера.
  3. Оба сервера моментально формируют пакет DHCP Offer (один предлагает 192.168.1.50, другой - 10.0.0.20) и отправляют его клиенту.
  4. Клиент получает оба предложения, но принимает то, которое пришло к нему первым. Второе он просто игнорирует.
  5. Клиент отправляет DHCP Request на первый пришедший IP, официально забирая его. Проигравший сервер видит это и возвращает свой IP обратно в пул свободных.

От чего зависит скорость ответа?

  • От загрузки процессора роутера/сервера.
  • От топологии (какой сервер физически ближе по количеству свитчей к клиенту).
  • От настроек (некоторые enterprise-серверы искусственно делают микро-задержку пинга перед выдачей IP, чтобы проверить, не занят ли он, а дешевый домашний роутер выпаливает адрес не глядя).

Последствия для сети:

Абсолютный хаос. Половина офиса (те, кто успел получить правильный IP от 192.168.1.x) будет работать нормально. Вторая половина получит IP 10.0.0.x, неправильный шлюз (домашний роутер сотрудника) и останется без интернета и доступа к корпоративным ресурсам. Причем после перезагрузки ПК ситуация может поменяться местами.

Для защиты от таких паразитных серверов на умных (управляемых) коммутаторах настраивают функцию DHCP Snooping. Она разрешает пакетам DHCP Offer проходить только через один конкретный (доверенный) порт, к которому подключен легальный сервер, а на всех остальных портах такие пакеты жестко блокируются.

Защита инфраструктуры: DHCP Snooping

DHCP Snooping - это как раз тот самый "фейсконтроль" на уровне управляемого коммутатора (свитча), который защищает сеть от хаоса с двумя серверами.

Чтобы понять, какой именно порт блокируется, нужно посмотреть на то, как коммутатор делит все свои порты после включения этой функции. Он разбивает их на два лагеря: Trusted (Доверенные) и Untrusted (Недоверенные).

Как это выглядит под капотом
По умолчанию, когда ты включаешь DHCP Snooping на свитче, абсолютно все порты становятся недоверенными (Untrusted). Доверенные порты сетевой администратор должен назначить руками.

  1. Trusted (Доверенный) порт: Это порт, к которому физически подключен твой легальный DHCP-сервер (или аплинк-порт, который ведет к другому коммутатору, за которым стоит сервер).
    1. Что разрешено: Через этот порт коммутатор пропускает любые DHCP-пакеты. И запросы от клиентов (Discover, Request), и ответы от сервера (Offer, Acknowledge).
  2. Untrusted (Недоверенный) порт:
    1. Это порты, куда подключаются обычные пользователи, рабочие станции, принтеры и, потенциально, тот самый принесенный из дома роутер сотрудника.
    2. Что разрешено: Коммутатор разрешает получать из этого порта только клиентские запросы (Discover, Request), потому что ПК должны иметь возможность попросить IP.
    3. Что БЛОКИРУЕТСЯ: Если из этого порта вдруг "вылетает" пакет от имени сервера (например, DHCP Offer с предложением IP-адреса), коммутатор понимает: "Ага, за этим портом сидит самозванец!". Он моментально отбрасывает (drop) этот пакет, а сам порт может перевести в состояние ошибки (err-disable), выключив на нем линк и отправив алерт админу.

Binding Database

DHCP Snooping Binding Database (База данных привязок) - это специальная таблица, которую коммутатор (свитч) автоматически создает и хранит в своей оперативной памяти, когда на нем активирована функция DHCP Snooping.

Позже эта таблица используется для защиты от подмены IP-адресов и мак-спуфинга (например, с помощью функции Dynamic ARP Inspection), чтобы никто не мог вручную прописать себе чужой IP и перехватывать трафик.

Как выглядит эта таблица

Если зайти в консоль управления коммутатором (например, Cisco) и ввести команду show ip dhcp snooping binding, вы увидите примерно такую картину:

Сама по себе Binding Database - это просто лог-файл. Но она является фундаментом для работы двух очень мощных технологий защиты от хакеров внутри локальной сети:

  1. Dynamic ARP Inspection (DAI) - Защита от перехвата трафика
    1. Проблема: Хакер в локальной сети может отправить фальшивое сообщение (ARP-ответ) всем компьютерам: "Эй, теперь я ваш роутер (шлюз), отправляйте весь интернет-трафик через меня!". Это называется атакой Man-in-the-Middle (Человек посередине).
    2. Как помогает база: Если включить DAI, коммутатор перестает верить устройствам на слово. Когда порт хакера пытается заявить: "Мой IP - это IP роутера", свитч мгновенно сверяется с Binding Database. Он видит: "Так, на порту №8 у нас числится IP 192.168.1.51, а ты пытаешься выдать себя за шлюз 192.168.1.1. Блокирую!". Пакет уничтожается.
  2. IP Source Guard (IPSG) - Защита от подмены IP-адреса
    1. Проблема: Пользователь может вручную зайти в настройки сетевого адаптера Windows и прописать себе чужой IP-адрес (например, адрес начальника или сервера), чтобы получить чужие права доступа или избежать ограничений по скорости.
    2. Как помогает база: Свитч проверяет каждый исходящий пакет данных от пользователя. Если в пакете указан IP-адрес отправителя 192.168.1.100, а в базе привязок за этим портом числится 192.168.1.50, коммутатор просто не выпустит этот трафик за пределы порта.

Почему нельзя использовать неофициальные клиенты Telegram: разбор MITM-атаки

24.03.26
93

Атака "Человек посередине" (Man-in-the-Middle, MITM) - это вид кибератаки, при которой злоумышленник тайно перехватывает (и зачастую изменяет) канал связи между двумя сторонами. Жертвы при этом уверены, что общаются напрямую друг с другом.

В классическом сценарии пользователь отправляет данные на сервер, но они сначала попадают на устройство злоумышленника. Злоумышленник читает информацию, может её модифицировать, и только потом отправляет конечному серверу. Чтобы это работало с зашифрованными протоколами (такими как HTTPS или MTProto в Telegram), атакующему необходимо подменить ключи шифрования, чтобы устройство жертвы доверяло "промежуточному" серверу как оригинальному.

 Несколько реальных MITM‑атак:
1. Wi‑Fi Honeypot
Фальшивая точка доступа с именем вроде “Free Airport Wi‑Fi”.
Пользователь подключается - весь трафик идёт через злоумышленника.

2. ARP Spoofing в офисной сети
Атакующий убеждает жертву, что он - это шлюз.
Жертва отправляет пакеты злоумышленнику - он пересылает их дальше.

3. Подмена DNS

Жертва думает, что заходит на tbank.ru , а попадает на поддельный сайт.

4. Корпоративный MITM‑прокси

Компании устанавливают свой корневой сертификат CA и расшифровывают HTTPS для мониторинга.

Анализ MITM-атаки в клиенте Telega

Полный технический анализ MITM в клиенте Telega

Авторы статьи выяснили, что создатели этого приложения намеренно внедрили в него функционал для полного перехвата и чтения переписки своих пользователей.

Вот как технически реализована эта атака внутри клиента:
1. Подмена IP-адресов серверов (DC Proxy)
Оригинальный Telegram имеет жестко прописанные адреса своих дата-центров (DC). Клиент Telega при запуске обращается к своему собственному API (https://api.telega.info/v1/dc-proxy) и получает список подменных IP-адресов. В результате приложение направляет весь трафик не на настоящие серверы Telegram, а на серверы, контролируемые создателями Telega (зарегистрированные на их собственную автономную систему).
2. Внедрение собственного RSA-ключа шифрования
Просто перенаправить трафик недостаточно - оригинальный Telegram использует публичные RSA-ключи, вшитые в приложение, для первичного обмена ключами сессии. Сервер должен иметь соответствующий приватный ключ, иначе соединение не установится.
Реверс-инжиниринг библиотеки libtmessages.49.so в клиенте Telega показал, что разработчики добавили свой собственный (дополнительный) публичный RSA-ключ, которого нет в официальном клиенте. Благодаря этому, когда клиент Telega связывается с подставным сервером, этот сервер может расшифровать первичный запрос с помощью своего приватного ключа. Это классический пример MITM - сервер злоумышленников (Telega) терминирует на себе шифрование, читает данные в открытом виде, а затем уже от своего имени отправляет их на настоящие серверы Telegram.
3. Отключение Perfect Forward Secrecy (PFS)
PFS - это криптографическое свойство, которое гарантирует, что даже если долгосрочный ключ будет скомпрометирован в будущем, прошлые сессии расшифровать не удастся (так как для каждой сессии генерируются уникальные ключи). В коде Telega передача флага usePfs была модифицирована таким образом, что эта дополнительная защита отключена по умолчанию.
4. Принудительное отключение секретных чатов (End-to-End)
Секретные чаты в Telegram используют сквозное (End-to-End) шифрование, при котором ключи генерируются только на устройствах собеседников и не передаются на сервер. MITM-атака на такие чаты практически невозможна без ведома пользователей.
Чтобы обойти эту "проблему", клиент Telega через удаленные настройки (Remote Config Firebase) получает флаг enable_sc = false. Из-за этого приложение полностью скрывает кнопку создания секретного чата, а все входящие запросы на секретный чат тихо игнорируются, лишая пользователей возможности безопасного общения.

5. Встроенная цензура (Модерация)
Помимо перехвата трафика, авторы статьи обнаружили систему "черных списков", работающую независимо от модерации самого Telegram. Клиент по команде со своих серверов может блокировать пользователям доступ к определенным каналам, ботам и даже личным сообщениям с конкретными людьми.

Приложение Telega - это троянский конь. Разработчики клиента целенаправленно разрушили криптографическую защиту Telegram (подменили серверы связи, внедрили свой RSA-ключ и отключили E2E-шифрование), чтобы пропускать весь трафик через себя и иметь возможность читать, анализировать или модифицировать переписку пользователей. Это подчеркивает главное правило кибербезопасности: использование неофициальных клиентов мессенджеров полностью компрометирует безопасность вашей переписки.

Почему классический MITM невозможен в официальном Telegram (MTProto + Fake TLS)?

После прочтения разбора "Телеги" может возникнуть вопрос: а может ли провайдер, товарищ майор или хакер в публичном Wi-Fi перехватить трафик обычного Telegram, например, вклинившись в соединение через прокси? Короткий ответ - нет. И вот почему сеть Telegram (на базе протокола MTProto и обертки Fake TLS) криптографически защищена от атак «Человек посередине» на уровне сети:

  • Абсолютное доверие только вшитым ключам: В официальном приложении Telegram "намертво" прописаны публичные RSA-ключи серверов (те самые, которые создатели Telega подменили в своем коде). Если кто-то попытается вклиниться в сеть и подсунуть свой сертификат или ключ, официальный клиент просто откажется устанавливать соединение.
  • Fake TLS - это только маскировка: Технология Fake TLS (используемая в MTProxy) создана для обхода систем DPI (глубокого анализа пакетов). Она "заворачивает" пакеты Telegram в оболочку, которая для провайдера выглядит как обычное защищенное соединение с условным google.com. Если оборудование попытается просканировать этот трафик методом MITM, прокси-сервер сбросит соединение или прикинется обычным веб-сайтом.
  • Двойное шифрование: Даже если злоумышленник узнает «секрет» вашего MTProxy и снимет обертку Fake TLS, внутри он обнаружит монолитный зашифрованный MTProto-трафик. Ключи для его расшифровки генерируются непосредственно на вашем устройстве (по протоколу Диффи-Хеллмана) и никогда не передаются по сети в открытом виде.

Главный вывод: Архитектура Telegram выстроена так, что перехватить трафик "по пути" от вашего смартфона до серверов - математически нерешаемая задача на сегодняшний день. Именно поэтому единственный способ читать чужую переписку - это заставить жертву добровольно установить зараженный клиент (как Telega), который сольет ключи прямо с устройства.

Что такое DNS и как это работает: Подробное руководство

19.03.26
69

Интернет может казаться магией, но под капотом скрываются строгие и логичные алгоритмы. Один из самых важных - это DNS (Domain Name System или Система доменных имён). Если бы не DNS, нам бы пришлось запоминать длинные ряды цифр вместо удобных названий сайтов, таких как www.riopass.ru.

Что такое DNS?

Представьте себе классическую телефонную книгу. Вы знаете имя человека (например, Иван Иванов), но вам нужен его номер телефона, чтобы дозвониться. Вы открываете книгу, находите имя и смотрите соответствующий ему номер.

DNS делает абсолютно то же самое для интернета:

  • Люди привыкли использовать понятные доменные имена (например, yandex.ru, google.com).
  • Компьютеры и серверы общаются друг с другом исключительно с помощью IP-адресов (например, 192.0.2.1 или 2a00:1450:4010:c05::8b).

DNS - это глобальная телефонная книга интернета, которая мгновенно переводит человекочитаемые адреса в машинные IP-адреса.

Как происходит преобразование адреса?

Когда вы вводите адрес в строку браузера и нажимаете Enter, начинается увлекательное путешествие, которое обычно занимает миллисекунды. Этот процесс делится на два больших этапа: локальный поиск и поиск в глобальной сети.

Локальное преобразование
Прежде чем беспокоить глобальные серверы, ваш компьютер пытается найти ответ у себя "в карманах".

  • Кэш браузера: Ваш браузер (Chrome, Safari, Firefox) хранит записи о сайтах, которые вы недавно посещали. Первым делом он проверяет свой собственный кэш.
  • Кэш операционной системы (ОС): Если браузер не нашел IP-адрес, он передает запрос операционной системе (Windows, macOS, Linux). ОС проверяет свой кэш DNS. Также на этом этапе проверяется локальный файл hosts (специальный текстовый файл, где пользователи могут вручную прописать соответствие IP и домена).
  • Кэш маршрутизатора (Роутера): Если на компьютере ответа нет, запрос уходит на ваш домашний или офисный роутер. У него тоже есть своя небольшая память для DNS-запросов.

Если ни на одном из этих локальных этапов IP-адрес не найден, компьютер обращается за помощью во внешний мир.

Клиент -> Резолвер: рекурсивный запрос
Резолвер -> ROOT/TLD/авторитетный: итеративные запросы

Преобразование в рамках интернета

Здесь в игру вступает иерархия серверов интернета. Ваш запрос передается рекурсивному DNS-серверу (обычно его предоставляет ваш интернет-провайдер). Его задача - бегать по инстанциям, пока не найдет нужный ответ.

Вот как выглядит его маршрут:

  • Корневые серверы (Root Nameservers):
    Рекурсивный сервер не знает, где находится example.com, поэтому он идет к "самым главным" серверам интернета - корневым. Они не знают точного IP-адреса сайта, но знают, кто отвечает за зону .com, .ru или .org.
  • Серверы доменных зон верхнего уровня (TLD Nameservers):
    Корневой сервер отправляет запрос к серверу, отвечающему за конкретную зону (например, к TLD-серверу зоны .com). Этот сервер тоже не знает точный IP сайта, но знает, у какого сервера находится эта информация.
  • Авторитативные серверы (Authoritative Nameservers):
    Это финальная инстанция. TLD-сервер указывает на авторитативный сервер, который физически хранит нужную DNS-запись для example.com. Этот сервер выдает точный IP-адрес.

Рекурсивный сервер получает IP-адрес, сохраняет его в свой кэш (чтобы в следующий раз ответить быстрее) и отдает вашему браузеру. Браузер подключается к серверу по полученному IP-адресу, и вы видите сайт.

Виды DNS-запросов: Как именно общаются серверы

  1. Рекурсивный запрос (Recursive Query)
    Это запрос в стиле: "Сделай всю работу за меня и дай готовый ответ".
    Когда ваш компьютер обращается к DNS-серверу провайдера (или к 8.8.8.8), он отправляет именно рекурсивный запрос. Это означает, что сервер берет на себя обязательство пройти по всем инстанциям (корневые серверы, TLD, авторитативные) и вернуть вашему компьютеру либо готовый IP-адрес, либо сообщение об ошибке (если домена не существует). Ваш компьютер при этом просто ждет.
  2. Итеративный запрос (Iterative / Non-recursive Query)
    Это запрос в стиле: "Дай мне лучший ответ, который у тебя есть прямо сейчас".
    Именно так общаются между собой сами DNS-серверы в глобальной сети. Когда рекурсивный сервер провайдера спрашивает корневой сервер: "Где example.com?", он делает итеративный запрос. Корневой сервер не будет искать ответ сам. Он скажет: "Я не знаю точный IP, но я знаю, кто отвечает за зону .com. Вот его адрес, иди спроси у него". Рекурсивный сервер принимает этот ответ и делает следующий итеративный запрос уже к TLD-серверу.

Направления запросов: Прямые, Обратные и Инверсные

Помимо способа поиска, запросы делятся по тому, что именно мы ищем. Здесь важно не путать термины.

  1. Прямой запрос (Forward DNS Query)
    Это классика, о которой мы говорили выше. У нас есть доменное имя (человекочитаемое), и мы хотим получить его IP-адрес (машинный).
    Это самый частый сценарий. Допустим, мы хотим узнать, на каком IP-адресе "живет" сайт riopass.ru.
    В Windows (через cmd или PowerShell): -> Введите команду: -> nslookup riopass.ru, если порт 53 заблокирован то nslookup riopass.ru 8.8.8.8
    В ответе вы увидите DNS-сервер, который обработал ваш запрос, и ниже сам IP-адрес сайта.
  2. Обратный запрос (Reverse DNS Query / rDNS)
    Здесь всё наоборот: у нас есть IP-адрес, и мы хотим узнать, какое доменное имя за ним закреплено. Это часто используется для проверки на спам (почтовые серверы проверяют, совпадает ли IP-адрес отправителя с его доменом) или при трассировке сетей (утилита traceroute). Для этого используется специальная доменная зона in-addr.arpa и записи типа PTR (Pointer).

    Теперь попробуем выполнить rDNS-запрос. Возьмем всем известный публичный DNS-сервер от Google с адресом 8.8.8.8 и проверим, какое доменное имя за ним закреплено в глобальной сети. В Windows: ->Просто введите IP вместо домена: -> nslookup 8.8.8.8 -> В ответе в строке Name: вы увидите dns.google.

  3. Инверсный запрос (Inverse Query / IQUERY)
    А вот здесь кроется технический нюанс, о котором многие забывают. Инверсный запрос - это старый и специфический механизм. В нем клиент просил сервер найти доменное имя, основываясь на любой известной ресурсной записи (не обязательно на IP-адресе).
    Из-за высокой нагрузки на серверы и сложностей в реализации, инверсные запросы были официально признаны устаревшими (deprecated) еще в 2002 году документом RFC 3425. Сегодня в современном интернете они не используются, их место полностью заняли обратные запросы (rDNS).

Дополнение:
По умолчанию утилиты ищут A-запись (IPv4-адрес). Но если вам нужно узнать, какие серверы обрабатывают электронную почту для домена (MX-записи), тип запроса нужно указать явно. Попробуем на примере Яндекса: -> В Windows: -> nslookup -type=MX yandex.ru

В Linux / macOS: -> dig yandex.ru MX +short -> В ответ вы получите список серверов (например, mx.yandex.ru) и их приоритеты - именно туда отправляются письма, когда вы пишете на адрес @yandex.ru.

Часто задаваемые вопросы (FAQ)

1. Почему при переезде сайта на другой хостинг он какое-то время не работает?
Это связано с процессом обновления кэша. На каждом этапе (у провайдеров, на роутерах) DNS-записи кэшируются на определенное время (этот параметр называется TTL - Time to Live). Пока это время не истечет, серверы будут отдавать старый IP-адрес. Полное обновление по всему миру может занимать от пары часов до 48 часов.

2. Что значит "Сбросить DNS-кэш" (Flush DNS)?
Иногда ваш компьютер запоминает устаревший или ошибочный IP-адрес (например, если сайт недавно сменил сервер). Очистка (сброс) кэша заставляет операционную систему забыть старые данные и выполнить глобальный поиск заново, получив актуальный адрес.

3. Зачем люди меняют DNS-серверы на 8.8.8.8 (Google) или 1.1.1.1 (Cloudflare)?
По умолчанию вы используете рекурсивные серверы вашего интернет-провайдера. Иногда они работают медленно, нестабильно или блокируют определенные ресурсы. Переключение на публичные серверы от Google или Cloudflare часто ускоряет загрузку страниц и повышает приватность.

4. Что такое записи типа A, CNAME, MX?
На авторитативном сервере данные хранятся в виде разных записей:

  • A-запись: Связывает домен с IPv4-адресом (самая частая).
  • CNAME: "Псевдоним", связывает один домен с другим (например, www.site.com с site.com).
  • MX-запись: Указывает, какой сервер обрабатывает электронную почту для этого домена.

 

Сокеты и Веб-сокеты: От системных вызовов 80-х до Real-time веба

18.03.26
77

Сетевые сокеты (Berkeley Sockets).
С точки зрения операционной системы, сокет - это дескриптор файла. В Unix-подобных системах "всё есть файл", и сокет не исключение. Это абстракция, которая позволяет программе читать и записывать данные в сеть так же просто, как в текстовый документ на диске.

Техническая формула: Socket = IP Address + Port + Protocol (TCP/UDP)
Дескриптор файла - это маленькое целое число, которое операционная система выдаёт процессу, когда тот открывает файл, сокет, канал, pipe, устройство или любой другой ресурс ввода‑вывода. Это идентификатор, через который программа взаимодействует с ресурсом.

История: Эпоха BSD

История Berkeley Sockets API - это фактически история того, как интернет стал интернетом. До 1983 года мир сетевых технологий напоминал Вавилонскую башню: каждый производитель железа (IBM, DEC, Xerox) имел свои протоколы, которые не умели "разговаривать" друг с другом.

В начале 80-х программирование под сеть было кошмаром. Если вы писали софт для мейнфрейма IBM, вы использовали одни системные вызовы; для машин DEC - другие. Не существовало единой абстракции "соединения".

Разработчики из Computer Systems Research Group (CSRG) в Университете Беркли, работая над релизом 4.2BSD, поставили цель: сделать работу с сетью такой же простой, как работу с файлами в Unix.

"Всё есть файл"

Гениальность Berkeley Sockets заключалась в адаптации концепции Unix "Everything is a file".

  • Чтобы прочитать данные из файла, вы его открываете, читаете и закрываете.
  • Билл Джой и его команда предложили делать то же самое с сетью.

Они ввели понятие дескриптора сокета. Сокет - это "конечная точка" (IP-адрес + Порт). Программисту стало неважно, как именно пакеты летят по проводам; ему достаточно было создать сокет и писать в него данные.

Популярность Berkeley Sockets была обусловлена двумя факторами:

  • Открытость: Код BSD был доступен для изучения и копирования.
  • Финансирование DARPA: Агентство продвигало TCP/IP как основной протокол для своей сети (предшественника интернета), и реализация Беркли была лучшей на рынке.

Как это работает  жизненный цикл сокета(Lifecycle)?

Жизненный цикл сокета - это последовательность системных вызовов, через которые проходит любое сетевое соединение. Каждый шаг меняет состояние сокета в ядре и определяет, что с ним можно делать дальше. Ниже - подробное, но компактное объяснение, ориентированное на разработчика, который хочет понимать, что реально происходит под капотом.

Чтобы понять, как работает жизненный цикл сокета, проще всего представить его как процесс установки телефонной связи в офисе. Есть "телефонный аппарат" (сам сокет), "номер" (IP и порт) и "оператор" (ядро ОС).

1. socket() - Покупка телефона
Процесс начинается с системного вызова socket(). На этом этапе вы просто сообщаете операционной системе: "Мне нужно устройство для связи".

  • Что происходит: ОС выделяет ресурс и возвращает дескриптор (целое число).
  • Параметры: Вы выбираете "тип" связи. Обычно это AF_INET (IPv4) и SOCK_STREAM (TCP, для надежности) или SOCK_DGRAM (UDP, для скорости).

2. bind() - Присвоение номера
У вас есть телефон, но у него нет номера. Вызов bind() привязывает сокет к конкретному адресу сетевой карты и порту.

  • Для сервера: Это обязательно. Сервер должен "сидеть" на известном порту (например, 80 для HTTP), чтобы клиенты знали, куда стучаться.
  • Для клиента: Обычно не вызывается вручную; ОС сама выделяет свободный случайный порт при подключении.

3. listen() - Перевод в режим ожидания (Только сервер)
Этот вызов превращает обычный сокет в пассивный. Сервер говорит системе: "Я готов принимать звонки".

  • Очередь (backlog): В параметрах указывается размер очереди. Если 10 клиентов постучатся одновременно, а сервер занят, listen определит, сколько из них подождут, а кому сразу придет отказ.
  • Что происходит, если очередь заполнена? Пришли 10 клиентов, они сидят в очереди в ядре ОС. Пришёл 11, ОС смотрит "мест нет". ОС либо просто игнорирует пакет (клиент отвалится по таймауту), либо отправляет ему ECONNREFUSED (отказ в соединении).

4. connect() vs accept() - Установка связи
Здесь пути клиента и сервера расходятся:

  • connect() (Клиент): Клиент инициирует "трехэтапное рукопожатие" (TCP Three-way Handshake). Он отправляет запрос серверу.
  • accept() (Сервер): Это блокирующий вызов. Сервер "засыпает" на этой строчке кода, пока не придет клиент. Как только соединение установлено, accept "просыпается" и создает новый отдельный сокет специально для этого клиента.
  • Важно: Основной сокет продолжает слушать других, а новый - используется для общения с конкретным подключившимся пользователем.

5. send() / recv() - Разговор
Когда соединение установлено, начинается обмен данными.

  • Байты, а не объекты: Сокеты ничего не знают о JSON, картинках или тексте. Они передают только сырые байты.
  • Потоковый режим: В TCP данные могут прийти не целиком, а кусками. Разработчику нужно проверять, сколько байт реально получено, и "склеивать" их.

6, close() - Повесить трубку
Когда данные переданы, одна из сторон (или обе) вызывает close(). Это высвобождает дескриптор в ОС и закрывает порт.

WebSockets: Живое общение в браузере

Протокол HTTP (до версии 1.1 включительно) был "молчаливым". Клиент спросил - сервер ответил - соединение закрылось. Чтобы сделать чат, браузеру приходилось каждые 2 секунды отправлять пустые запросы (Polling). Это создавало огромную нагрузку на сервер и дикие задержки.
Протокол WebSocket (RFC 6455)
В 2011 году появился WebSocket. Его главная фишка - Full-Duplex (полный дуплекс). Это значит, что и клиент, и сервер могут одновременно слать данные друг другу по одному открытому каналу.
Почему HTTP не справлялся?

Чтобы понять ценность WebSocket, нужно осознать масштаб проблемы Polling (опроса).

Представьте чат на 1000 человек. При обычном опросе (Short Polling) сервер получает 500 запросов в секунду, даже если никто ничего не пишет. Каждый такой запрос - это:

  • Установление TCP-соединения (3-way handshake).
  • Огромные HTTP-заголовки (Cookies, User-Agent), которые весят больше, чем само сообщение "Привет".
  • Закрытие соединения.

Long Polling (длинные опросы) немного спасали ситуацию: сервер держал запрос открытым, пока не появятся данные. Но это все равно был "костыль", съедающий ресурсы сервера.

Внутри канала: Что такое Фреймы (Frames)?

Когда соединение установлено, данные больше не передаются в виде текста с заголовками. Они упаковываются в бинарные фреймы.

Фрейм - это очень компактный конверт. В нем есть:

  • FIN бит: Указывает, является ли этот кусок данных финальным или за ним последуют еще.
  • Opcode: Тип данных (0x1 - текст, 0x2 - бинарные данные, 0x8 - закрытие соединения, 0x9 - пинг).
  • Payload length: Размер данных. Для маленьких сообщений заголовок фрейма весит всего 2-10 байт. Сравни это с 500+ байтами заголовков HTTP.

Ключевые отличия для IT-специалиста

Сетевой сокет (L4): Это программный интерфейс (API) операционной системы. Когда ты открываешь сокет, ты говоришь ОС: "Выдели мне порт и отправляй все байты с этого IP-адреса моему приложению".

WebSocket (L7): Это протокол прикладного уровня. Он добавляет к "сырому" сокету правила: как поздороваться (Handshake), как зашифровать данные (Masking) и как делить поток байтов на понятные сообщения (Frames).

ХарактеристикаСетевые сокеты (TCP/UDP)WebSockets
Уровень OSIТранспортный (L4)Прикладной (L7), работает поверх TCP
Среда выполненияОС, системные вызовы, backendБраузеры, веб‑серверы
Формат данныхСырые байты. Нет понятия "сообщение", только поток.Фреймы. Есть четкие границы сообщений (текст/бинарные).
API‑сложностьНизкоуровневая (нужно самому склеивать пакеты).Высокоуровневая (события: onmessage, onerror).
ТранспортTCP или UDPТолько TCP (как база для надежности)
БезопасностьПрямой доступ к портам (опасно для браузера).Работает через HTTP Handshake, поддерживает шифрование (WSS).
АдресацияIP-адрес и порт (напр. 192.168.1.1:8080)URL-схема (напр. wss://example.com/chat)
Проход через ProxyЧасто блокируются корпоративными фаерволами.Маскируются под HTTP, легко проходят через прокси.

Когда и что выбирать?

СитуацияЧто использовать?Почему?
Браузерный чат / УведомленияWebSocketsЕдинственный стандартный способ держать живое соединение в JS.
Мобильная игра (Unity/C++)TCP/UDP сокетыМинимальные задержки, нет лишнего оверхеда протокола WebSocket.
Система мониторинга (Веб-панель)WebSocketsУдобство интеграции с React/Vue и простота API.
Передача потокового видео (Real-time)WebRTC (UDP-based)WebSockets могут быть медленными из-за TCP-контроля доставки.

Протоколы TCP и UDP: история, отличия и сферы применения.

17.03.26
90

Немного истории: зачем они были созданы?
В 1970-х годах, когда интернет только зарождался (тогда еще сеть ARPANET), инженеры Винт Серф и Боб Кан разработали протокол TCP (Transmission Control Protocol). Их главная цель заключалась в создании абсолютно надежной системы связи. Если военные или ученые отправляли данные с одного компьютера на другой, протокол должен был гарантировать, что ни один байт информации не потеряется по пути, даже если часть сети выйдет из строя.

TCP отлично справлялся со своей задачей - он бережно доставлял данные, проверял их целостность и собирал в правильном порядке. Но у этой надежности была своя цена: медлительность.

К концу 70-х годов стало понятно, что для некоторых задач (например, для передачи голоса в реальном времени) надежность не так важна, как скорость. Если при телефонном разговоре потеряется доля секунды звука, вы этого даже не заметите, но если голос будет приходить с огромной задержкой из-за проверок, общаться станет невозможно.

Поэтому в 1980 году ученый Дэвид П. Рид разработал UDP (User Datagram Protocol) - протокол, который избавился от всех проверок TCP ради максимальной скорости. Так интернет получил два фундаментальных инструмента: один для безупречной надежности, другой - для молниеносной скорости.

Определения: Что такое TCP и UDP?

TCP (Transmission Control Protocol - протокол управления передачей) - это протокол с предварительной установкой соединения. Перед отправкой данных он "звонит" принимающей стороне, убеждается, что та готова, и только потом начинает передачу - трёхстороннее рукопожатие. Он тщательно следит за тем, чтобы все пакеты данных дошли без потерь и в строгом порядке.

UDP (User Datagram Protocol - протокол пользовательских датаграмм) - это протокол без установки соединения. Он просто берет данные и "выстреливает" ими в сторону получателя без каких-либо предупреждений и проверок. Ему неважно, дошли ли данные, готовы ли их принять и в каком порядке они пришли. Главное - отправить их как можно быстрее.

 

В чем разница?

Чтобы легко понять разницу, представьте два способа доставки посылки:
TCP - это заказное письмо с курьером лично в руки. TCP работает так, будто сеть - это опасная дорога, и протокол обязан гарантировать, что каждая коробка дойдёт в целости и строго по порядку.
Основные механизмы, которые скрыты за образом "курьера":

  • Установление соединения - курьер сначала удостоверяется, что ты дома (3‑way handshake - тройное рукопожатие).
    • SYN (Synchronize) - стук в дверь: Клиент (курьер) обращается к серверу: "Привет! У меня есть для тебя коробки. Я хочу установить защищенное соединение, ты готов?"
    • SYN-ACK (Synchronize-Acknowledge) -  хозяин открывает дверь: Сервер (получатель дома) отвечает: "Привет! Да, я на месте и готов принимать твои данные (ACK). Со своей стороны тоже готов к работе (SYN)."
    • ACK (Acknowledge) - финальное подтверждение: Клиент (курьер) завершает ритуал: "Супер, я увидел, что ты готов (ACK). Начинаю передачу первой коробки!"
  • Подтверждение каждой коробки - получатель отправляет ACK за каждый полученный сегмент.
  • Повторная доставка - если ACK не пришёл, курьер везёт коробку снова.
  • Контроль порядка - если коробки пришли не по порядку, TCP складывает их в буфер и выдаёт тебе в правильной последовательности.
  • Контроль скорости - курьер замедляется, если дорога перегружена (congestion control).

Курьер звонит вам в дверь, просит расписаться за каждую коробку, а если коробка потерялась по пути - возвращается на склад и привозит новую. Это надежно, но долго.
 

 

UDP - это почтальон, который на ходу забрасывает газеты вам на балкон. Он не проверяет, поймали ли вы газету или она упала в лужу. Он просто кидает и едет дальше. Это невероятно быстро.

  • Установление соединения (отсутствует) - почтальон не звонит в дверь и не проверяет, дома ли ты (здесь нет никаких SYN и ACK). Он просто проезжает мимо на полном ходу и не глядя кидает стопку газет тебе на балкон. Клиент сразу начинает передачу данных.
  • Подтверждение получения (отсутствует) - почтальон не ждет, пока ты крикнешь: "Поймал!". Ему абсолютно всё равно, долетела ли газета до балкона или ударилась о стену. Сервер не отправляет никаких подтверждений.
  • Повторная доставка (отсутствует) - если газета упала в лужу, ее сдуло ветром или украла собака (пакет потерялся в сети), почтальон не вернется, чтобы привезти новую. Потерянные данные игнорируются, протокол двигается дальше.
  • Контроль порядка (отсутствует) - газеты могут прилететь в случайном порядке: сначала за среду, потом за понедельник, а во вторник вообще не прийти. UDP не выстраивает их в очередь, разбираться с этой кучей придется самому получателю (конечному приложению).
  • Контроль скорости (отсутствует) - почтальон не притормаживает, даже если весь двор уже завален чужими посылками, а сеть перегружена. Он продолжает "кидать" данные с максимальной скоростью, на которую способен.

Где используются эти протоколы?

Выбор между TCP и UDP всегда сводится к компромиссу: что в данный момент важнее - чтобы все пиксели картинки загрузились без ошибок, или чтобы видеозвонок не тормозил?

Где TCP там, важна надежность:

  • Веб-серфинг (HTTP/HTTPS): Когда вы читаете эту статью, текст должен загрузиться целиком, без пропущенных букв.
  • Электронная почта (SMTP, IMAP): Ваше письмо должно дойти слово в слово.
  • Передача файлов (FTP): Если при скачивании программы потеряется хотя бы один байт, она не запустится.
  • Мессенджеры (текст): Отправка текстовых сообщений всегда идет по TCP, чтобы сообщение точно было доставлено.

Где спасает UDP, там важна скорость:

  • Онлайн-игры: В шутерах или гонках (CS:GO, Dota 2) важнее получить информацию о том, где находится противник прямо сейчас, чем то, где он был секунду назад. Потерянный пакет данных менее критичен, чем задержка (пинг).
  • Стриминг и видеозвонки (Skype, Zoom, YouTube Live): Если во время звонка пропадет пара кадров видео, изображение просто на секунду "дернется", и трансляция пойдет дальше. Если бы использовался TCP, видео постоянно замирало бы на подгрузку ("буферизацию").
  • IP-телефония (VoIP): Передача голоса через интернет.
  • DNS-запросы: Быстрый перевод имени сайта (например, google.com) в IP-адрес.

Часто задаваемые вопросы

1. Можно ли использовать TCP и UDP одновременно?

Да, и многие современные приложения именно так и делают. Например, популярные многопользовательские онлайн-игры могут использовать TCP для надежной загрузки обновлений, авторизации в аккаунте и текстового чата, а для передачи движений персонажей в реальном времени использовать быстрый UDP.

2. Какой протокол лучше?

Нельзя сказать, что один протокол однозначно лучше другого - они созданы для разных задач. Если вам нужна 100% гарантия доставки каждого байта (скачивание файлов, загрузка веб-страниц), то лучше TCP. Если в приоритете максимальная скорость работы и минимальный пинг (стриминг, IP-телефония, онлайн-игры), то победитель - UDP.

3. Можно ли сделать UDP надежным, чтобы он не терял пакеты?

Сам протокол UDP изменить нельзя, но разработчики часто создают собственные надстройки поверх него. Отличный пример - современный протокол QUIC (разработанный Google). Он работает поверх быстрого UDP, но при этом берет на себя функции контроля потерянных пакетов, объединяя лучшие черты обоих миров.

4. Безопасны ли протоколы TCP и UDP?

Сами по себе базовые протоколы TCP и UDP не шифруют данные - они передаются в открытом виде. За безопасность отвечают протоколы более высокого уровня. Например, чтобы защитить данные, передаваемые по TCP, сверху "наслаивается" протокол TLS/SSL (так получается безопасный HTTPS). А для защиты UDP-трафика часто используются VPN-туннели (например, популярный протокол WireGuard работает именно поверх UDP).
 

Обзор Cudy WR300: думал будет проходняк, а оказался топ за свои деньги

15.03.26
81

Недавно мне в руки попал Wi-Fi роутер Cudy WR300. Я брал его сугубо как точку доступа, с мыслью "куплю какое-то барахло на сдачу, лишь бы сеть раздавало". Но реальность превзошла ожидания настолько, что устройство однозначно заслуживает отдельного разбора.

Железо: скромно, но со вкусом

Аппаратная база здесь без претензий на гигабитные скорости, но для своих задач она сбалансирована идеально:

Процессор: MediaTek MT7628 (580 МГц)

Память: 64 МБ ОЗУ (DDR2) и 8 МБ Flash

Интерфейсы: 1x WAN и 3x LAN (все порты стандарта 10/100 Мбит/с)

Беспроводная сеть: Только 2.4 ГГц (802.11n, до 300 Мбит/с), работают две несъемные антенны с усилением 5 дБи.

Дизайн потрясающий - устройство выглядит гораздо дороже своей реальной стоимости. Производитель не поскупился даже на упаковку: красивая коробка, аккуратно уложенная документация - распаковывать действительно приятно.

Программная оболочка: Скрытый OpenWRT

Интерфейс и софт заслуживают твердые 10 из 10. Настраивается роутер практически в автоматическом режиме, что огромный плюс. Но самое интересное кроется под капотом - прошивка базируется на OpenWRT.

Да, она урезана и сильно адаптирована под рядового пользователя, но стабильность ядра OpenWRT никуда не делась. Роутер работает как швейцарские часы и из коробки поддерживает современные VPN-протоколы (WireGuard, L2TP, PPTP).

Киллер-фичи для своей цены

  • MESH из коробки. Был приятно удивлен тем, что этот малыш поддерживает бесшовный роуминг. Если покрытия одной точки не хватит, можно легко докупить еще один роутер Cudy и в пару кликов собрать единую сеть.
  • Умный редирект при обрыве. Если отходит интернет-кабель (как случилось у меня) или пропадает линк от провайдера, роутер не просто оставляет вас перед неработающим браузером. При потере связи он автоматически выкидывает вас на окно авторизации/статуса устройства. Это невероятно удобно для быстрого траблшутинга - сразу понимаешь, на чьей стороне проблема.

 

Результаты:

  • Программная оболочка: 10 из 10
  • Дизайн: 10 из 10
  • Комплектация: 10 из 10

Это превосходный роутер для создания точки доступа, покрытия умного дома или работы на тарифах до 100 Мбит/с. Тот самый случай, когда железка отрабатывает каждый вложенный рубль.