Сети с нуля 09. TCP, UDP и порты: как программы находят друг друга
Note
Материал сверен с первоисточниками (RFC и официальная документация Microsoft, Wireshark и др.; ссылки — в конце статьи). Примеры вывода — иллюстрации: на вашей системе значения и формат могут отличаться.
IP-адрес приводит пакет на нужный компьютер. Но на компьютере одновременно работают браузер, почтовая программа, удалённый рабочий стол, служба времени. Как пакет узнаёт, какой из них ему нужен? За это отвечает транспортный уровень: протоколы TCP и UDP и номера портов.
В этой статье мы разберём:
- что такое порт и сокет и почему клиент подключается с «случайного» порта;
- как TCP устанавливает соединение, подтверждает доставку и закрывается;
- чем UDP проще и когда его выбирают;
- где в этой картине ICMP, который не использует порты;
- какие порты стоит знать и что значит «порт открыт, закрыт или фильтруется»;
- как посмотреть порты и соединения в Windows:
netstat,Get-NetTCPConnection,Test-NetConnection.
Что нужно знать заранее
- Сети с нуля 01. Что такое сеть: устройства, модель TCP/IP и OSI — где в стеке находится транспортный уровень.
- Сети с нуля 03. IPv4-адреса и маски подсети — что такое IP-адрес.
- Сети с нуля 05. Как пакет находит путь: шлюз, маршруты и ARP — как пакет доходит до нужного узла.
Зачем нужны порты
Представьте бизнес-центр. IP-адрес — адрес здания: по нему вас находит курьер. Но в здании сотни кабинетов, и курьеру нужен номер кабинета. Порт — это «номер кабинета» на компьютере: число, по которому система понимает, какой программе отдать пришедшие данные.
Порты идентифицируют прикладные службы и разделяют отдельные потоки данных между узлами. Номер порта занимает 16 бит, поэтому возможных значений 65 536: от 0 до 65535.
Прикладной браузер, почта, RDP ... "какой программе"
| номер порта
Транспортный TCP или UDP
| IP-адрес
Сетевой IP "какому компьютеру"
Порты TCP и порты UDP — отдельные «нумерации»: TCP-порт 53 и UDP-порт 53 относятся к разным протоколам.
Диапазоны портов
Номера распределяет IANA (Internet Assigned Numbers Authority, организация, которая ведёт реестры номеров протоколов). Реестр делит их на три диапазона:
| Диапазон | Название в реестре IANA | Для чего |
|---|---|---|
| 0–1023 | System Ports (системные) | стандартные службы: 22, 53, 80, 443 |
| 1024–49151 | User Ports (пользовательские) | службы, зарегистрированные в IANA, например 3389 |
| 49152–65535 | Dynamic and/or Private Ports | не назначаются, ими пользуются клиенты |
В старой литературе первые два диапазона называют «общеизвестными» и «зарегистрированными»; смысл тот же.
В Windows временные порты для исходящих подключений по умолчанию берутся из диапазона 49152–65535, как рекомендует IANA (в старых версиях было 1025–5000). Свой диапазон показывает команда netsh int ipv4 show dynamicport tcp.
Клиент, сервер и сокет
Сервер «слушает» заранее известный порт: SRV1 ждёт подключений к порту 445. Клиент постоянный порт не выбирает: система выдаёт ему временный, или эфемерный (ephemeral), порт из динамического диапазона. Допустим, PC1 открывает папку на SRV1:
PC1 192.168.10.101:49733 -------------> SRV1 192.168.10.10:445
временный порт клиента порт службы SMB
Ответ идёт обратно: SRV1:445 -------------> PC1:49733
Пара «IP-адрес и порт» называется сокетом (socket), а соединение TCP определяется парой сокетов. Поэтому PC1 может открыть десять соединений к одному и тому же SRV1:445: у каждого будет свой временный порт, и пары сокетов различаются.
Та же идея лежит в основе PAT (NAT с трансляцией портов), когда PC1 и PC2 выходят в интернет через один адрес: роутер различает их по номерам портов (подробнее в статье 08).
TCP: надёжный разговор с подтверждениями
TCP (Transmission Control Protocol) можно сравнить с телефонным разговором: сначала дозвонились и поздоровались, потом говорят, постоянно подтверждая «слышу», в конце прощаются. TCP предоставляет приложениям надёжную передачу потока байтов в том порядке, в каком они отправлены, и работает с соединением.
Установка соединения: трёхстороннее рукопожатие
Установление соединения называется трёхсторонним рукопожатием (three-way handshake). Сторона A отправляет сегмент с флагом SYN, сторона B отвечает своим SYN и подтверждает полученный, сторона A подтверждает ответ пустым сегментом с флагом ACK. Сегмент — единица данных TCP; SYN (synchronize) и ACK (acknowledgment) — признаки в его заголовке.
PC1 (клиент) SRV1 (сервер)
| --- SYN -------------------> | "хочу соединиться"
| <-- SYN, ACK --------------- | "согласен, я тоже"
| --- ACK -------------------> | "принято"
| соединение установлено: ESTABLISHED
Подтверждения и повторы
Каждому байту данных присваивается порядковый номер (поле Sequence Number), а получатель сообщает, до какого номера всё принято (Acknowledgment Number). Если подтверждения нет, отправитель повторяет передачу, а если ответа нет совсем, сессия в итоге обрывается. Рукопожатие тоже повторяется: при потере SYN система отправляет его снова несколько раз (число повторов зависит от ОС).
Отсюда практический вывод: если порт на сервере закрыт брандмауэром, который молча отбрасывает пакеты, программа не получает отказа, а ждёт, пока кончатся повторы. Так появляется знакомое «зависло» вместо мгновенной ошибки.
Закрытие: FIN и RST
Штатное закрытие идёт через сегменты с флагом FIN (finish): «у меня больше нет данных для отправки». После него сторона, которая закрывала соединение первой, ещё некоторое время (в Windows по умолчанию около 4 минут) держит порт в состоянии TIME_WAIT: так система убеждается, что другая сторона получила подтверждение.
Флаг RST (reset) — аварийный обрыв: ресурсы освобождаются сразу, информация о соединении стирается. RST же приходит в ответ на попытку подключиться туда, где никто не слушает (об этом ниже).
Состояния, которые видит администратор
Команда netstat показывает состояние каждого TCP-соединения. Названия в таблице даны так, как их пишет Windows.
| Состояние | Что значит | На что смотреть |
|---|---|---|
| LISTENING | программа ждёт входящие подключения | список таких строк и есть «открытые порты» компьютера |
| ESTABLISHED | соединение установлено, данные идут | обычная рабочая сессия |
| SYN_SENT | SYN отправлен, ответа ещё нет | много таких строк надолго: ответа от сервера нет |
| TIME_WAIT | соединение закрыто, порт «остывает» | у занятых клиентов их много в норме; тысячи указывают на множество коротких подключений (у таких строк PID обычно 0, см. ниже) |
| CLOSE_WAIT | другая сторона уже закрыла соединение, а локальная программа ещё нет | постоянно растущее число у одного процесса обычно значит, что программа не закрывает свои соединения |
UDP: открытка без уведомления
UDP (User Datagram Protocol) похож на открытку: опустили в ящик и пошли дальше. Протокол создан для «датаграммного режима» передачи: доставка и защита от дублирования не гарантируются. Рукопожатия нет, подтверждений и повторов нет. Заголовок состоит из четырёх полей: порт отправителя, порт получателя, длина и контрольная сумма; минимальная длина датаграммы — 8 байт (только заголовок).
Зачем нужен протокол, который ничего не гарантирует? Затем, что быстрая простая отправка иногда важнее надёжности:
- DNS. Запрос и ответ обычно умещаются в одну датаграмму: обычные запросы идут по UDP, а передача зоны требует TCP; порт один, 53 (подробности в статье 07).
- DHCP. Клиент ещё не имеет адреса и не может «установить соединение»; DHCP использует UDP: сообщения клиента идут на порт сервера 67, ответы — на порт клиента 68 (статья 06).
- NTP. Служба времени использует UDP-порт 123.
- Голос и видео в реальном времени. Как правило, их тоже передают по UDP: запоздавший пакет бесполезен, и повтор только увеличит задержку. Решение зависит от приложения.
Если приложению нужны подтверждения поверх UDP, их придётся реализовать самому приложению.
| TCP | UDP | |
|---|---|---|
| Соединение | устанавливается рукопожатием | не устанавливается |
| Доставка | подтверждается, потерянное повторяется | не гарантируется |
| Порядок данных | сохраняется (поток байтов) | не гарантируется, каждая датаграмма независима |
| Типичные службы | HTTPS, SSH, SMB, RDP, почта | DNS-запросы, DHCP, NTP |
ICMP: служебный протокол без портов
Есть ещё один спутник IP, который не относится ни к TCP, ни к UDP: ICMP (Internet Control Message Protocol, служебный протокол сообщений об ошибках и проверок). У него нет портов, вместо них у сообщений есть тип и код. Нам важны три вида:
- эхо-запрос и эхо-ответ (типы 8 и 0): на них построена команда
ping; - адресат недоступен (тип 3): коды 0 (сеть недоступна), 1 (узел недоступен), 2 (протокол недоступен), 3 (порт недоступен);
- превышено время (тип 11, код 0): время жизни пакета (TTL) истекло по пути; на этом построена команда
tracert.
Практический вывод: ping проверяет доступность узла по ICMP, но ничего не говорит о том, открыт ли порт 443 на сервере. Как этим пользоваться, разобрано в статье 10.
Популярные порты
Номера и имена в таблице взяты из реестра IANA. Реестр резервирует номер сразу и для TCP, и для UDP (иногда ещё и для SCTP, более редкого транспортного протокола), даже если сервис использует только один из них. Столбец «Транспорт» показывает, что используется, как правило.
| Порт | Имя в реестре IANA | Что это | Транспорт |
|---|---|---|---|
| 20 | ftp-data | FTP (File Transfer Protocol), данные по умолчанию | TCP |
| 21 | ftp | FTP, управление | TCP |
| 22 | ssh | SSH (Secure Shell): защищённый удалённый вход | TCP |
| 23 | telnet | Telnet: устаревший удалённый вход | TCP |
| 25 | smtp | SMTP (Simple Mail Transfer Protocol): передача почты между серверами | TCP |
| 53 | domain | DNS | UDP и TCP |
| 67 | bootps | DHCP, сервер | UDP |
| 68 | bootpc | DHCP, клиент | UDP |
| 80 | http | HTTP (Hypertext Transfer Protocol): веб без шифрования | TCP |
| 110 | pop3 | получение почты (POP3, Post Office Protocol 3) | TCP |
| 123 | ntp | NTP (Network Time Protocol): синхронизация времени | UDP |
| 143 | imap | получение почты (IMAP, Internet Message Access Protocol) | TCP |
| 389 | ldap | LDAP (Lightweight Directory Access Protocol): каталог | TCP |
| 443 | https | HTTP поверх TLS | TCP (HTTP/1.1 и HTTP/2); UDP (HTTP/3, QUIC) |
| 445 | microsoft-ds | общий доступ к файлам Windows (SMB, Server Message Block) | TCP |
| 587 | submission | отправка почты почтовой программой | TCP |
| 636 | ldaps | LDAP поверх TLS | TCP |
| 993 | imaps | IMAP поверх TLS | TCP |
| 995 | pop3s | POP3 поверх TLS | TCP |
| 3389 | ms-wbt-server | удалённый рабочий стол Windows (RDP, Remote Desktop Protocol) | TCP |
Обратите внимание на пары: обычная версия протокола и версия поверх TLS (Transport Layer Security, протокол шифрования) живут на разных портах (80 и 443, 143 и 993, 110 и 995, 389 и 636). Когда в адресе страницы порт не указан, браузер использует 80 для http и 443 для https.
QUIC — транспортный протокол поверх UDP, на нём работает HTTP/3. Поэтому правило брандмауэра, разрешающее только TCP 443, HTTP/3 не пропустит; если UDP 443 блокируется, клиенты обычно откатываются на TCP. Для некоторых служб (3389 RDP, 389 LDAP) номер в реестре закреплён и за UDP: учитывайте это в правилах брандмауэра.
Telnet в таблице только для узнавания: его не используют, вместо него применяют SSH.
Номера портов — соглашение, а не закон: веб-сервер можно запустить и на порту 8080. Но клиенты и брандмауэры исходят из стандартных номеров, поэтому отклоняться от них стоит только осознанно.
Брандмауэр и порты
Брандмауэр (межсетевой экран) проверяет каждый пакет по правилам. Windows Firewall фильтрует трафик по IP-адресам источника и получателя, протоколу, портам источника и получателя; правила могут указывать программу, службу, тип интерфейса, тип и код ICMP. По умолчанию он блокирует входящий трафик, если тот не запрошен изнутри и не соответствует правилу, и пропускает исходящий, если нет блокирующего правила.
Поэтому «служба запущена» и «служба доступна по сети» — разные вещи. Чтобы к порту 445 на SRV1 подключились с PC1, нужны два условия: на порту слушает программа, и ни один фильтр на пути не запрещает подключение: это брандмауэры SRV1 и PC1 (а если бы сервер стоял в другой подсети, то и межсетевой экран RTR1). Настройка межсетевых экранов на устройствах — в статьях MikroTik с нуля 04: Firewall для начинающих и Cisco с нуля 08: Списки доступа (ACL).
Порт «открыт», «закрыт» или «фильтруется»
Когда клиент пытается подключиться к TCP-порту, возможны три исхода:
- Порт открыт. Узел достижим, на порту слушает программа, рукопожатие завершается успешно.
- Порт закрыт. Узел достижим, но на порту никто не слушает. На любой входящий сегмент, кроме RST, система отвечает сегментом RST. Клиент сразу получает отказ.
- Порт фильтруется. Ответа нет: брандмауэр молча отбросил пакет. Клиент повторяет SYN и в итоге сдаётся по таймауту.
Правило: быстрый отказ обычно означает «узел жив, программа не слушает», а долгое ожидание — «что-то отбрасывает пакеты» (или узел недоступен). Оно не абсолютно: некоторые брандмауэры сами отвечают отказом.
С UDP иначе. Рукопожатия нет, поэтому «открыт» подключением не подтвердить. Если UDP-датаграмму отправить на порт, который не слушается, получатель, как правило, сразу отвечает ICMP-сообщением «порт недоступен» (Port Unreachable). Тишина же не означает ни «открыт», ни «закрыт»: приложение может не отвечать на эту датаграмму, а ICMP может быть отфильтрован.
Практика: порты в Windows
Все примеры только читают информацию и ничего не меняют.
netstat
Основные ключи: -a (все соединения и прослушиваемые порты), -n (адреса и порты числами, без разрешения имён) и -o (добавить идентификатор процесса, PID). Ключ -b (показать исполняемый файл) медленный и требует достаточных прав, поэтому мы определяем программу по PID.
C:\Users\admin-lab>netstat -ano
Пример вывода (показаны не все строки):
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1104
TCP 192.168.10.101:49733 192.168.10.10:445 ESTABLISHED 4
TCP 192.168.10.101:49790 198.51.100.10:443 ESTABLISHED 7312
TCP 192.168.10.101:49802 198.51.100.10:443 TIME_WAIT 0
UDP 192.168.10.101:123 *:* 1860
Колонки: протокол, локальный адрес и порт, удалённый адрес и порт, состояние (для UDP его нет) и PID процесса. Адрес 0.0.0.0 в локальной колонке означает «слушаю на всех адресах компьютера».
У строк TIME_WAIT PID обычно 0, поэтому по ним процесс не определить. Чтобы найти процесс, который накапливает такие соединения, Microsoft предлагает искать его по состоянию Bound (ключ -q, команда netstat -anobq).
Чтобы найти, что слушает конкретный порт, используйте findstr:
C:\Users\admin-lab>netstat -ano | findstr :445
Чтобы узнать, какой программе принадлежит PID, откройте диспетчер задач (вкладка «Подробности») или выполните в PowerShell:
PS C:\Users\admin-lab> Get-Process -Id 1104
Get-NetTCPConnection
Тот же список в виде объектов PowerShell. Параметры -State, -LocalPort и -OwningProcess позволяют фильтровать на лету:
PS C:\Users\admin-lab> Get-NetTCPConnection -State Listen |
Select-Object LocalAddress, LocalPort, State, OwningProcess
PS C:\Users\admin-lab> Get-NetTCPConnection -State Established
PS C:\Users\admin-lab> Get-NetTCPConnection -LocalPort 445
Пример вывода первой команды:
LocalAddress LocalPort State OwningProcess
------------ --------- ----- -------------
0.0.0.0 3389 Listen 1104
0.0.0.0 445 Listen 4
Значения -State записываются слитно, в стиле PowerShell: основные Listen, Established, TimeWait, CloseWait; полный перечень есть в справке. Командлет показывает только TCP; UDP смотрите командой netstat -ano -p udp.
Test-NetConnection с -Port
Самая полезная команда для проверки порта на удалённом узле: она пытается установить TCP-соединение с указанным портом.
PS C:\Users\admin-lab> Test-NetConnection -ComputerName 192.168.10.10 -Port 445
Пример вывода при успешном подключении:
ComputerName : 192.168.10.10
RemoteAddress : 192.168.10.10
RemotePort : 445
InterfaceAlias : Ethernet
SourceAddress : 192.168.10.101
TcpTestSucceeded : True
Без параметра -Port командлет проверяет узел эхо-запросом ICMP. С -Port он проверяет TCP-порт; если соединение не удалось, в вывод могут добавиться строки PingSucceeded и PingReplyDetails (RTT) — результат дополнительного эхо-запроса. PingSucceeded : True при TcpTestSucceeded : False означает: узел отвечает на ping, а порт закрыт или фильтруется. Решение о порте принимайте только по TcpTestSucceeded.
True означает, что TCP-соединение установлено: порт открыт и путь до него свободен. False означает лишь, что соединение не удалось: порт закрыт, фильтруется или узел недоступен. Причину помогает определить время ответа (быстрый отказ или долгое ожидание) и проверка на самом сервере (Get-NetTCPConnection -LocalPort 445).
Полезные варианты записи:
-CommonTCPPortподставит номер для популярных служб (допустимыHTTP,RDP,SMB,WINRM):Test-NetConnection 192.168.10.10 -CommonTCPPort RDP;-InformationLevel Quietвернёт толькоTrueилиFalse, удобно для скриптов;-InformationLevel Detailedдобавит подробности: разрешение имён, выбранный маршрут и другие.
Командлет проверяет только TCP; для UDP он не подходит.
Упражнение
- Выполните
netstat -anoи найдите строкиLISTENING. Для двух-трёх портов определите процесс черезGet-Process -Id. - Откройте любой сайт в браузере и снова выполните
netstat -ano. Найдите соединенияESTABLISHEDс удалённым портом 443 и убедитесь, что у них разные локальные порты из диапазона 49152–65535. - Выполните
Test-NetConnection -ComputerName 192.168.10.10 -Port 445(замените адрес на сервер в вашей сети), а затем проверьте порт, который в вашей сети вряд ли кто-то использует, например-Port 54321. БыстроеFalse(до секунды) значит, что узел ответил отказом;Falseчерез 20 секунд и более значит, что пакеты отбрасываются (повторы SYN), и это нормально: так ведёт себя «фильтруется». Точное время зависит от системы. - Закройте браузер и посмотрите, как соединения уходят в
TIME_WAITи исчезают.
Типичные ошибки и недоразумения
- «Порт — это разъём на устройстве». Нет, это число в заголовке пакета. Физические порты коммутатора с TCP-портами не связаны.
- «Ping проходит, значит, сервис работает». Ping проверяет только ICMP-доступность узла. Работоспособность службы проверяет подключение к её порту:
Test-NetConnection -Port. - «UDP хуже, а TCP лучше». Это разные инструменты для разных задач; DNS, DHCP и служба времени работают поверх UDP не по недосмотру.
- «Много TIME_WAIT — авария». Само по себе нет: это лишь означает, что процесс создаёт много TCP-соединений. Нужно смотреть, не заканчиваются ли временные порты.
- «Клиент подключается с того же порта, что и сервер». Нет: сервер слушает известный порт, а клиент использует временный.
- «Закрыл порт на роутере — сервис защищён». Фильтрация на периметре — один слой защиты, но не замена обновлений и настроек самой службы.
Проверьте себя
- Почему два компьютера могут одновременно открывать сайты на одном и том же сервере по порту 443? Соединение определяется парой сокетов: у каждого клиента свои IP-адрес и временный порт, поэтому пары различаются.
- В
netstat -anoу одного процесса сотни соединенийCLOSE_WAIT. О чём это говорит? Удалённая сторона закрыла соединение, а программа своё не закрыла: вероятна ошибка в программе, а не в сети. - Подключение к порту сразу завершилось отказом, а другое долго висело и оборвалось по таймауту. Что это может значить? Быстрый отказ: узел достижим, но на порту никто не слушает (получен RST). Долгое ожидание: пакеты, вероятно, отбрасываются, например брандмауэром, или узел недоступен.
- Почему DHCP и DNS-запросы используют UDP? Им не нужно устанавливать соединение: короткий запрос и ответ. DHCP-клиенту до получения адреса соединение установить нечем.
- Что показывает
Test-NetConnection -ComputerName 192.168.10.10 -Port 445и чего не показывает? Удалось ли установить TCP-соединение с портом 445 (TcpTestSucceeded). Причину неудачи он не называет, и UDP не проверяет.
Что дальше
- Сети с нуля 10. Диагностика сети в Windows: ping, tracert, nslookup и другие — методика «снизу вверх», в которой проверка порта — последний шаг.
- Сети с нуля 11. Wireshark для начинающих: первый захват трафика — рукопожатие SYN, SYN-ACK, ACK своими глазами.
- Сети с нуля 08. NAT и частные адреса: как офис выходит в интернет — как роутер использует порты, чтобы раздать один адрес многим узлам.
Источники
- RFC 9293. Transmission Control Protocol (TCP) — порты, сокеты, рукопожатие, состояния, RST.
- RFC 768. User Datagram Protocol — UDP, датаграммный режим без гарантий.
- RFC 792. Internet Control Message Protocol — типы и коды ICMP.
- RFC 1035. Domain Names: Implementation and Specification — DNS на UDP и TCP, порт 53.
- RFC 2131. Dynamic Host Configuration Protocol — DHCP, UDP, порты 67 и 68.
- RFC 5905. Network Time Protocol Version 4 — NTP, UDP-порт 123.
- RFC 9110. HTTP Semantics — порты по умолчанию для http и https.
- RFC 9114. HTTP/3 — HTTP/3 поверх QUIC, откат на TCP при блокировке UDP.
- IANA. Service Name and Transport Protocol Port Number Registry — диапазоны портов, имена и номера служб.
- Microsoft Learn. netstat — ключи и колонки вывода.
- Microsoft Learn. Get-NetTCPConnection — параметры и допустимые состояния.
- Microsoft Learn. Test-NetConnection — проверка TCP-порта, параметры и примеры.
- Microsoft Learn. Get-Process — поиск процесса по PID.
- Microsoft Learn. Windows Firewall Overview — что и как фильтрует брандмауэр, поведение по умолчанию.
- Microsoft Learn. TCP/IP connectivity issues troubleshooting — рукопожатие, повторы SYN, закрытие, ICMP для UDP.
- Microsoft Learn. TCP/IP port exhaustion troubleshooting — временные порты Windows, TIME_WAIT, CLOSE_WAIT, состояние Bound.