Что означает 0.0.0.0 в netstat. различные виды нотаций в netstat и ss
0.0.0.0 — это самый первый IP адрес. Но он относится к IP специального назначения (как например 127.0.0.1) и выполняет разные функции.
Обозначение 0.0.0.0 может иметь разное значение в зависимости от того, где используется. Когда говорят о прослушиваемых портах, это обозначение в Linux символизирует заполнитель, то есть означает «любой IP адрес».
Чем это отличается от * (звёздочки) или от записи :::, которые также встречаются в выводе рассматриваемых программ? В программе ss IPv6 адрес 0:0:0:0:0:0:0:0 (который является аналогом IPv4 адреса 0.0.0.0) обозначается звёздочкой (*).
В программе netstat также используется запись 0.0.0.0:* которая также обозначает «любой IPv4 адрес с любого порта».
Но в netstat для обозначения «любой IPv6 адрес с любого порта» используется :::*
Помните об этих различиях, чтобы не запутаться. А также помните о том, что если показано, что прослушивается протокол tcp6 (IPv6), то одновременно может прослушиваться порт и на tcp (IPv4) — при этом данные в выводимой информации отсутствуют!
В Windows в качестве Local Address (Локального адреса), когда прослушивается любой IP адрес на определённом порту, используется запись вида 0.0.0.0:80 (в этом примере прослушивается любой IP адрес, доступный в системе, на 80 порту). Для IPv6 адресов в этом случае используется запись вида [::]:80.
В качестве внешнего адреса, когда доступно подключения с любого IP и с любого порта, для TCP протокола пишется 0.0.0.0:0, а для UDP протокола в этих же условиях пишется *:*. Что тоже не особо логично и сбивает с толку. Точнее говоря такое различие в обозначениях вытекает из разницы протоколов TCP и UDP.
Если информация относится к IPv6, то для TCP когда имеется ввиду любой адрес на любом порту, используется запись вида [::]:0. А для UDP используются одинаковые нотации как для IP, так и для IPv6, то есть *:*
Нужно помнить, что некоторые из этих обозначений пересекаются с нотациями из Linux, где они имеют своё собственное значение.
Чтобы чуть облегчить жизнь, я составил такую табличку, которую можно использовать в качестве шпаргалки:
Определённый локальный IPv4 адрес на определённом порту | Любой локальный IPv4 адрес на определённом порту | Определённый локальный IPv6 адрес на определённом порту | Любой локальный IPv6 адрес на определённом порту | Любой внешний IPv4 адрес на любом порту | Любой внешний IPv6 адрес на любом порту | |
---|---|---|---|---|---|---|
Netstat (Windows) | 127.0.0.1:9050 | 0.0.0.0:80 | [2a02:f680:1:1100::3d5f]:80 | [::]:443 | Для TCP: 0.0.0.0:0 Для UDP: *:* | Для TCP: [::]:0 Для UDP: *:* |
Netstat (Linux) | 2a02:f680:1:1100::3d:80 | :::443 | 0.0.0.0:* | :::* | ||
ss (Linux) | [2a02:f680:1:1100::3d5f]:80 | *:443 | 0.0.0.0:* | *:* ИЛИ [::]:* |
10-страйк: сканирование сети
Бесплатная программа
«10-Страйк: Сканирование Сети» — а это программа, включающая в себя функции двух предыдущих утилит. Т.е. с ее помощью можно не только получать различные сведения об устройствах и сетевых хостах, но и определять номера открытых портов. Программа «10-Страйк:
Основные функциональные возможности программы «10-Страйк: Сканирование Сети»:
- Получение различных сведений обо всех видах сетевых устройств — компьютеры, мобильные устройства, маршрутизаторы (проводные/беспроводные роутеры), принтеры и др. Программа способна получать информацию по SNMP, NetBios и UPnP протоколам.
- Встроенные инструменты для пингования (1) и трассировки (2) хостов:
- Встроенный инструмент сканирования TCP и UDP-портов.
- Удаленное управление устройствами посредством SNMP-протокола (на удаленном устройстве должно быть установлено соответствующее программного обеспечение — SNMP-агент).
Отдельно следует отметить наличие в программе «10-Страйк: Сканирование Сети» удобного «Мастера сканирования сети», с помощью которого задаются настройки для последующего сканирования:
- Задаем диапазон IP-адресов для сканирования (можно несколько диапазонов)
- Выбираем протоколы и порты для сканирования.
- Видим список обнаруженных сетевых устройств в указанном диапазоне IP-адресов.
Кроме того, в программе «10-Страйк: Сканирование Сети» присутствует полезная функция мониторинга локального сетевого трафика. Откуда конкретно приходит трафик и уходит исходящий трафик функция не отображает, зато помогает понять, через какой из сетевых интерфейсов Windows осуществляется прием/передача данных и с какой скоростью все это происходит.
Все остальные функции программы «10-Страйк: Сканирование Сети» на самом деле являются функциями других — платных — программ от того же разработчика.
Lansweeper
И последняя программа в нашем обзоре — Lansweeper. Это IP-сканер нового поколения с множеством удобных сетевых функций. Вообще, Lansweeper нельзя назвать просто IP-сканером — это целый большой набор административных сетевых инструментов. И работает программа не как обычная Windows-программа.
Управление приложением осуществляется через веб-консоль (веб-интерфейс), в которую можно попасть из любого современного браузера. Войти в веб-интерфейс можно не только с локального компьютера (на котором установлена программа), но и удаленно — из любой точки мира через интернет.
При всем этом приложение не требует мощного компьютера, а его размер после установки не превышает 400 Мб. Для нормальной работы достаточно мощностей ПК, который справляется с запуском Windows 7. Русский язык на данный момент не поддерживается. Программу можно использовать бесплатно, но с ограничениями по количеству сканируемых IP-адресов/хостов (максимум 1000 единиц).
У системы администрирования Lansweeper довольно обширные функциональные возможности. Вот лишь их малая часть:
- Многофункциональный сканер с гибкими настройками (вкладка «Scanning»). Среди множества режимов сканирования присутствует и нужный нам — сканирование IP-адресов в заданном диапазоне. Процедура (как, впрочем, и большинство других) может быть запущена немедленно либо в заданное пользователем время (по дням недели, по часам или рекурсивно — каждые несколько минут/часов).
- Получение всей доступной информации об обнаруженных в процессе сканирования устройствах/хостах, вывод списка общедоступных сетевых ресурсов и многое другое. Эти сведения размещаются во вкладке «Assets» после завершения сканирования.
Lizardsystems network scanner
Условно-бесплатная программа
LizardSystems Network Scanner — еще один IP-сканнер с расширенным функционалом по работе с общедоступными сетевыми ресурсами. Но в отличие от MyLanViewer, данная программа способна также “прозванивать” интересующие пользователя сетевые порты удаленного устройства/хоста.
Network Scanner — условно-бесплатная программа с пробным периодом использования в течение 10 дней. Интерфейс приложения частично русифицирован (отсутствует перевод некоторых элементов интерфейса). Программа поддерживается операционными системами Windows 7/8/8.1/10, а также полностью совместима с серверными ОС Windows Server 2008R2/ 2022/2022R2/2022.
В число основных функций программы LizardSystems Network Scanner входят:
- Возможность добавления IP-адресов для сканирования разными способами. Программа поддерживает конструкции типа «192.168.0.1-254» или «192.168.0,10,50-60». Можно также импортировать список IP-адресов из заранее подготовленного (наполненного IP-адресами) текстового файла. Можно также задать диапазон для сканирования по имени хоста (например, адреса сайта) — программа сама получит IP-адрес, пользователю останется лишь указать конечный IP. Созданные подобным образом списки IP-диапазонов можно сохранить для быстрого запуска процедуры сканирования в будущем.
- Обнаружение открытых TCP-портов. Функцию следует включить в настройках программы, указав номера “прозваниваемых” сетевых портов через запятую.
- Фильтрация обнаруженных в сети компьютеров/устройств/хостов по различным критериям: по состоянию, типу доступных ресурсов, правам доступа.
- Вывод списка общедоступных сетевых ресурсов со всех просканированных устройств/хостов с возможностью поиска папок/файлов по имени и/или их фильтрации путем применения пользовательских фильтров (наборы ключевых слов).
- Возможность экспорта всех обнаруженных при сканировании общедоступных ресурсов (имена каталогов, файлов и т.д.) в текстовые файлы различных форматов для последующего изучения.
- Вызов стандартных средств администрирования Windows и отправка различных сетевых команд (поддерживаются команды «Wake-on-LAN») применительно к выбранным сетевым устройствам/хостам. Пользователь также может создать свой собственный список инструментов/сетевых команд с использованием внешних программ.
По истечению 10-дневного пробного периода для продолжения использования программы потребуется приобрести лицензию. На момент написания обзора ее стоимость составляла $79,95.
Mylanviewer
Условно-бесплатная программа
MyLanViewer — довольно мощный IP-сканер, обладающий множеством вспомогательных функций. От предыдущих программ MyLanViewer отличается, в т.ч., наличием функционала по сканированию и мониторингу беспроводных (Wi-Fi) сетей.
Утилита распространяются по условно-бесплатной модели (бесплатное использование возможно в течение 15 дней с момента установки без функциональных ограничений), интерфейс выполнен на английском языке, работает во всех версиях Windows, начиная с Win 2000.
Основные функциональные возможности программы MyLanViewer:
- Сканирование одного/диапазона IP-адресов с определением MAC-адресов устройств/сетевых карт компьютеров и всех общедоступных ресурсов на хосте — файлы, папки, развернутые FTP-серверы, доступные для подключения веб-интерфейсы и т.д.
- Отправка на удаленный компьютер/хост различных сетевых команд и подключение к ним по различным сетевым протоколам при использовании внешних программ. В настройках MyLanViewer можно самостоятельно создать собственный список команд, привязав их к любым внешним приложениям. Доступные по умолчанию сетевые команды выполняются при использовании стандартных средств Windows.
- Отображение всех открытых для общего доступа папок и файлов со всех обнаруженных в процессе сканирования устройств/хостов. Также возможен поиск файлов по имени с использованием маски («*.mp3»). Кроме того, программа позволяет управлять доступам к общим ресурсам компьютера, где выполняется MyLanViewer. Пользователь может открывать/закрывать доступ к общедоступным папкам/файлам с указанных IP/MAC-адресов.
- Сканирование и мониторинг локальной Wi-Fi-сети. Программа MyLanViewer способна отображать список всех подключенных к Wi-Fi-роутеру устройств (включая компьютеры, подключенные к роутеру по сетевому кабелю), выводя на экран всю доступную информацию о них. Если задействовать функцию автоматического мониторинга сети, тогда программа будет оповещать при обнаружении новых подключенных устройств (это поможет, к примеру, выявить случаи подключения к Wi-Fi-сети «непрошенных» пользователей и заблокировать их через роутер).
- Наличие встроенного TCP/UDP-мессенджера с функцией передачи файлов. Чат работает только между пользователями программы MyLanViewer. Собеседников можно добавлять по IP-адресу (возможен их поиск в указанном IP-диапазоне).
Из дополнительных функций программы MyLanViewer отметим:
- Просмотр различных сетевых параметров компьютера и сетевой статистики (вывод списка запущенных на компьютере процессов, использующих активное сетевое подключение).
- Функция поиска доступных в локальной сети DHCP-серверов с выводом DNS-серверов, использующихся активным интернет-подключением.
- Многофункциональный «Wake-on-LAN-менеджер», позволяющий отправлять различные сетевые команды посредством NetBIOS на удаленные компьютеры: включение/выключение/перезагрузка, блокировка учетной записи, гибернация/сон и другие.
Для снятия 15-дневного ограничения на использование программы MyLanViewer требуется приобрести лицензию. Ее стоимость на момент написания обзора составляла $29.
Netstat – отображение статистики протокола и текущих сетевых подключений tcp/ip.
Команда NETSTAT предназначена для получения сведений о состоянии сетевых соединений и слушаемых на данном компьютере портах TCP и UDP, а также, для отображения статистических данных по сетевым интерфейсам и протоколам.
Формат командной строки:
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p протокол] [-r] [-s] [-t] [интервал]
Параметры командной строки:
-a – Отображение всех подключений и ожидающих портов.
-b – Отображение исполняемого файла, участвующего в создании каждого подключения, или ожидающего порта. Иногда известные
исполняемые файлы содержат множественные независимые компоненты. Тогда отображается последовательность компонентов, участвующих в создании подключения, либо ожидающий порт. В
этом случае имя исполняемого файла находится снизу в скобках [], сверху – компонент, который им вызывается, и так до тех пор, пока не достигается TCP/IP. Заметьте, что такой подход
может занять много времени и требует достаточных разрешений.
-e – Отображение статистики Ethernet. Может применяться вместе с параметром -s.
-f – Отображение полного имени домена (FQDN) для внешних адресов.
-n – Отображение адресов и номеров портов в числовом формате.
-o – Отображение кода (ID) процесса каждого подключения.
-p протокол – Отображение подключений для протокола, задаваемых этим параметром. Допустимые значения: TCP, UDP, TCPv6 или UDPv6. Используется вместе с параметром -s для отображения статистики
по протоколам. Допустимые значения: IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP или UDPv6.
-r – Отображение содержимого таблицы маршрутов.
-s – Отображение статистики протокола. По умолчанию статистика отображается для протоколов IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP и UDPv6. Параметр -p позволяет указать подмножество выводимых данных.
-t – Отображение текущего подключения в состоянии переноса нагрузки с процессора на сетевой адаптер при передаче данных ( “offload” ).
-v – Подробный вывод информации, если это возможно.
интервал – Повторный вывод статистических данных через указанный интервал в секундах. Для прекращения вывода данных нажмите клавиши CTRL C. Если параметр не задан, сведения о текущей
конфигурации выводятся один раз.
На практике, утилиту netstat.exe удобно использовать в цепочке с командами
постраничного вывода (more), перенаправления стандартного вывода в файл ( > )
и поиска текста в результатах вывода ( find ).
netstat -a | more – отобразить все соединения в постраничном режиме
вывода на экран.
netstat -a -n| more – то же, что и в предыдущем примере, но с отображением номеров портов и IP-адресов в числовом формате.
В отличие от предыдущего примера, команда netstat с параметром -t отрабатывает намного быстрее.
netstat -a -f | more – то же, что и в предыдущем примере, но с отображением полных DNS-имен узлов, участвующих в соединениии.
netstat -a > C:netstatall.txt – отобразить все соединения с
записью результатов в файл C:netstatall.txt.
netstat -a | find /I “LISTENING” – отобразить все соединения со
статусом LISTENING, т.е. отобразить список сетевых интерфейсов и портов, ожидающих
входящие соединения ( “слушаемых” портов ). Ключ /I в команде find указывает, что при поиске текста, не нужно учитывать регистр символов.
netstat -a | find /I “listening” > C:listening.txt – отобразить все
соединения со статусом LISTENING с записью результатов в
файл C:listening.txt.
Пример отображаемой информации:
Активные подключения
Имя TCP TCP TCP TCP . . . | Локальный адрес 0.0.0.0:80 0.0.0.0:445 192.168.0.3:5401 127.0.0.1:56635 | Внешний адрес 0.0.0.0:0 0.0.0.0:0 17.11.13.23:551 127.0.0.1:443 | Состояние LISTENING LISTENING ESTABLISHED ESTABLISHED |
Имя – название протокола.
Локальный адрес – локальный IP-адрес участвующий в соединении или связанный со службой, ожидающей входящие соединения (слушающей порт). Если в качестве адреса отображается 0.0.0.0 , то это означает – “любой адрес”, т.е в соединении могут использоваться все IP-адреса существующие на данном компьютере. Адрес 127.0.0.1 – это петлевой интерфейс, используемый в качестве средства IP протокола для взаимодействия между процессами без реальной передачи данных.
Внешний адрес Внешний IP-адрес, участвующий в создании соединения.
Состояние – состояние соединения. Состояние Listening
говорит о том, что строка состояния отображает информацию о сетевой службе,
ожидающей входящие соединения по соответствующему протоколу на
адрес и порт, отображаемые в колонке “Локальный адрес “. Состояние
ESTABLISHED указывает на активное соединение. В колонке “Состояние”
для соединений по протоколу TCP может отображаться текущий этап TCP-сессии
определяемый по обработке значений флагов в заголовке TCP – пакета (Syn, Ask,
Fin … ). Возможные состояния:
CLOSE_WAIT – ожидание закрытия соединения.
CLOSED – соединение закрыто.
ESTABLISHED – соединение установлено.
LISTENING – ожидается соединение (слушается порт)
TIME_WAIT – превышение времени ответа.
Имя программного модуля, связанного с данным соединением отображается, если
задан параметр -b в командной строке при запуске netstat.exe.
netstat -a -b – получить список всех сетевых соединений и связанных с ними программ.
TCP 192.168.0.3:3389 89.22.52.11:5779 ESTABLISHED
CryptSvc
[svchost.exe]
В данном примере отображается информация о соединении, в создании которого участвуют
программные компоненты CryptSvc и svchost.exe.
netstat -ab – параметры командной строки можно объединять. Параметр -ab эквивалентен -a -b
netstat -e – получить статистические данные для обмена по протоколу Ethernet. Отображается суммарные значения принятых и полученных байт для всех сетевых адаптеров Ethernet.
Статистика интерфейса
Байт | Получено 3572722456 | Отправлено 516793893 |
netstat -e -v – кроме суммарной статистики, отображается информация об обмене данными через отдельные сетевые интерфейсы.
netstat -e -s – дополнительно к статистике Ethernet, отображается статистика для протоколов IP , ICMP , TCP , UDP
Статистика интерфейса
Байт | Получено 3748575434 | Отправлено 1576644689 |
Статистика IPv4
Получено пакетов Получено ошибок в заголовках Получено ошибок в адресах Направлено датаграмм Получено неизвестных протоколов Отброшено полученных пакетов Доставлено полученных пакетов Запросов на вывод Отброшено маршрутов Отброшено выходных пакетов Выходных пакетов без маршрута Требуется сборка Успешная сборка Сбоев при сборке Успешно фрагментировано датаграмм Сбоев при фрагментации датаграмм Создано фрагментов | = 10877781 = 0 = 27307 = 0 = 0 = 448 = 11384479 = 11919871 = 0 = 1517 = 6 = 0 = 0 = 0 = 5918 = 0 = 11836 |
Статистика IPv6
Получено пакетов Получено ошибок в заголовках Получено ошибок в адресах Направлено датаграмм Получено неизвестных протоколов Отброшено полученных пакетов Доставлено полученных пакетов Запросов на вывод Отброшено маршрутов Отброшено выходных пакетов Выходных пакетов без маршрута Требуется сборка Успешная сборка Сбоев при сборке Успешно фрагментировано датаграмм Сбоев при фрагментации датаграмм Создано фрагментов | = 0 = 0 = 0 = 0 = 0 = 0 = 391 = 921 = 0 = 0 = 14 = 0 = 0 = 0 = 0 = 0 = 0 |
Статистика ICMPv4
Сообщений Ошибок ‘Назначение недостижимо’ Превышений времени Ошибок в параметрах Просьб “снизить скорость” Переадресовано Ответных пакетов Эхо-сообщений Отметок времени Ответы на отметки времени Масок адресов Ответов на маски адресов Маршрутизатор Маршрутизатор | Получено 11892 0 10461 613 0 0 0 818 0 0 0 0 0 0 0 | Отправлено 1374 0 528 0 0 0 0 0 846 0 0 0 0 0 0 |
ICMPv6 Статистика
Сообщений Ошибок ‘Назначение недостижимо’ Пакет слишком велик Превышений времени Ошибок в параметрах Эхо-сообщений Ответных пакетов MLD-запросы MLD-отчеты MLD выполнено Маршрутизатор Маршрутизатор Окружение Окружение Переадресовано Перенумер. маршрутизатора | Получено 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | Отправлено 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 |
Статистика TCP для IPv4
Активных открыто Пассивных открыто Сбоев при подключении Сброшено подключений Текущих подключений Получено сегментов Отправлено сегментов Повторно отправлено сегментов | = 225128 = 12675 = 108237 = 1871 = 42 = 8606912 = 8138192 = 403595 |
Статистика TCP для IPv6
Активных открыто Пассивных открыто Сбоев при подключении Сброшено подключений Текущих подключений Получено сегментов Отправлено сегментов Повторно отправлено сегментов | = 64 = 64 = 10164 = 4 = 4 = 3341 = 3341 = 0 |
Статистика UDP для IPv4
Получено датаграмм Отсутствие портов Ошибки при получении Отправлено датаграмм | = 4714809 = 448 = 0 = 5332065 |
Статистика UDP для IPv6
Получено датаграмм Отсутствие портов Ошибки при получении Отправлено датаграмм | = 419 = 0 = 0 = 391 |
netstat -s -p icmp – получить статистику только по протоколу ICMP
Пример отображаемых статистических данных:
Статистика ICMPv4
Сообщений Ошибок ‘Назначение недостижимо’ Превышений времени Ошибок в параметрах Просьб “снизить скорость” Переадресовано Ответных пакетов Эхо-сообщений Отметок времени Ответы на отметки времени Масок адресов Ответов на маски адресов Маршрутизатор Маршрутизатор | Получено 12092 0 10654 619 0 0 0 819 0 0 0 0 0 0 0 | Отправлено 1375 0 528 0 0 0 0 0 847 0 0 0 0 0 0 |
Для циклического опроса состояния сетевых соединений используется запуск программы с указанием интервала вывода статистических данных в секундах.
netstat -e 3 – отображать статистику по Ethernet с интервалом 3 секунды.
netstat –f 10 – каждые 10 секунд отображать статистику сетевых соединений с использованием полных DNS-имен узлов.
netstat -n 5 | find /i “Established” – каждые 5 секунд отображать статистику по установленным соединениям.
Весь список команд CMD Windows
Виды сканирований nmap
Мы рассмотрели механизм рукопожатия TCP, напомним его структуру:
- Клиент: SYN
- Сервер: SYN-ACK
- Клиент: ACK
Знаменитый сканер портов Nmap по умолчанию выполняет сканирования с использованием полуотрытых соединений, или его ещё называют SYN сканированием. На самом деле, это не что иное, как отправленный пакет с включённым флагом SYN — то есть Nmap инициирует рукопожатие TCP.
Такой метод, с одной стороны, является универсальным — любой открытый порт обязательно должен ответить пакетом с флагами SYN-ACK, поскольку это стандарт транспортного протокола TCP. Но при этом Nmap не завершает рукопожатие, то есть не создаётся полноценное соединение и приложение, которое прослушивает просканированный порт, никогда не узнает об этом неудачном TCP рукопожатии, и этот факт не отобразиться в журналах этого приложения.
Пример сканирования портов:
sudo nmap -p 70-90 185.117.153.79
На следующем скриншоте мы можем видеть отправленные и полученные пакеты:
Первая группа пакетов (выделена прямоугольником) — пинг хоста, чтобы определить, доступен ли он. Также на этапе доступности хоста делается запрос к портам 80 и 443 (хотя порт 443 не указан для сканирования), видимо, также для подтверждения того, что хост онлайн.
Если от порта получен пакет SYN-ACK (сервер готов к установке соединения), то Nmap отвечает пакетом с флагом RST для обрыва начатого рукопожатия.
Вторая группа — они отмечены серым и зелёным — это непосредственно сканирование портов — это пакеты с флагом SYN. Серым отмечены те, которые прислали ответ RST-ACK (порт закрыт), а зелёным т е, которые прислали ответ SYN-ACK (порт открыт).
Пакеты RST-ACK, а также пакеты RST (от Nmap) помечены красным.
Как можно увидеть, техника очень простая и использует самые базовые возможности трансопртного протокола TCP.
Кроме этого метода, Nmap поддерживает ещё несколько типов сканирования:
-sS/sT/sA/sW/sM: TCP SYN/с использованием системного вызова Connect()/ACK/Window/Maimon сканирования -sU: UDP сканирование -sN/sF/sX: TCP Null, FIN и Xmas сканирования --scanflags <флаги>: Задать собственные TCP флаги
Заголовок tcp
Сдвиг | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Биты | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 0 | Порт источника, Source port | Порт назначения, Destination port | ||||||||||||||||||||||||||||||
4 | 32 | Порядковый номер, Sequence Number (SN) | |||||||||||||||||||||||||||||||
8 | 64 | Номер подтверждения, Acknowledgment Number (ACK SN) (если установлен ACK) | |||||||||||||||||||||||||||||||
12 | 96 | Длина заголовка, (Data offset) | Зарезервировано 0 0 0 | NS | CWR | ECE | URG | ACK | PSH | RST | SYN | FIN | Размер Окна, Window Size | ||||||||||||||||||||
16 | 128 | Контрольная сумма, Checksum | Указатель важности, Urgent pointer (если установлен флаг URG) | ||||||||||||||||||||||||||||||
20 … | 160 … | Опции (необязательное, но используется практически всегда) (если data offset > 5. добивается до конца “0” байтами при необходимости) … Поле Заполнение (Padding) | |||||||||||||||||||||||||||||||
160/192 | Данные |
- Порт источника — биты 0-15. Это порт источника пакета. Исходный порт изначально был связан напрямую с процессом в отправляющей системе. Сегодня мы используем хеш между IP-адресами и портами назначения и порта источника для достижения этой уникальности, которую мы можем привязать к одному приложению или программе.
- Порт назначения — биты 16-31. Это порт назначения пакета TCP. Как и в случае с портом-источником, он изначально был напрямую связан с процессом в принимающей системе. Сегодня вместо этого используется хеш, который позволяет нам иметь больше открытых соединений одновременно. Когда пакет получен, порты назначения и исходные порты возвращаются в ответе обратно к первоначально отправляющему хосту, так что порт назначения теперь является портом источника, а порт источника является портом назначения.
Порт источника и порт назначения не обязаны быть одинаковыми: к примеру, если делается запрос к 80-му порту сервера, то этот запрос может прийти, например, с порта 34054.
Номера портов на сервере могут использоваться как стандартные, так и произвольные.
- Порядковый номер (Sequence number) — биты 32-63. Поле порядкового номера используется для установки номера в каждом TCP-пакете, чтобы можно было правильно упорядочить поток TCP (например, пакеты приводятся к правильному порядку). Затем в поле ACK возвращается порядковый номер, чтобы подтвердить, что пакет был принят правильно.
Указывает на количество переданных байт, и каждый переданный байт полезных данных (payload) увеличивает это значение на 1.
Если установлен флаг SYN (идёт установление сессии), то поле содержит изначальный порядковый номер — ISN (Initial Sequence Number). В целях безопасности это значение генерируется случайным образом и может быть равно от 0 до 232-1 (4294967295). Первый байт полезных данных в устанавливающейся сессии будет иметь номер ISN 1.
В противном случае, если SYN не установлен, первый байт данных, передаваемый в данном пакете, имеет этот порядковый номер.
- Номер подтверждения (Acknowledgment Number (ACK SN)) — биты 64-95. Это поле используется, когда мы подтверждаем определённый пакет, полученный хостом. Например, мы получаем пакет с одним установленным порядковым номером, и если с пакетом все в порядке, мы отвечаем пакетом ACK с номером подтверждения, равным оригинальному порядковому номеру.
Если установлен флаг ACK, то это поле содержит порядковый номер октета, который отправитель данного сегмента желает получить. Это означает, что все предыдущие октеты (с номерами от ISN 1 до ACK-1 включительно) были успешно получены.
Каждая сторона подсчитывает свой Sequence number для переданных данных и отдельно Acknowledgement number для полученных данных. Соответственно Sequence number каждой из сторон соответствует Acknowledgement number другой стороны.
- Длина заголовка (смещение данных) — биты 96-99. В этом поле указывается длина заголовка TCP пакета и где начинаются фактические данные (полезная нагрузка). Поле имеет размер в 4 бита и указывает заголовок TCP в 32-битных словах. Заголовок должен всегда заканчиваться чётной 32-битной границей, даже с различными установленными опциями (опции могут отсутствовать вовсе, либо их количество может различаться). Это возможно благодаря полю Padding в самом конце заголовка TCP.
Минимальный размер заголовка составляет 5 слов, а максимальный — 15 слов, что даёт минимальный размер 20 байтов и максимум 60 байтов, что позволяет использовать до 40 байтов опций в заголовке. Это поле получило такое имя (смещение данных) из-за того, что оно также показывает расположение фактических данных от начала сегмента TCP.
Итак, длина заголовка определяет смещение полезных данных относительно начала сегмента. Например, Data offset равное 1111 говорит о том, что заголовок занимает пятнадцать 32-битных слова (15 строк*32 бита в каждой строке/8 бит = 60 байт).
Заголовок udp
Можно сказать, что заголовок UDP представляет собой очень упрощённый заголовок TCP. Он содержит порты назначения, порты источника, длину заголовка и контрольную сумму, как показано на рисунке ниже.
Сдвиги | Октет | 0 | 1 | 2 | 3 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Октет | Бит | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
0 | 0 | Исходоный порт | Порт назначения | ||||||||||||||||||||||||||||||
4 | 32 | Длина | Контрольная сумма | ||||||||||||||||||||||||||||||
8 | 64-… | Данные |
- Исходный порт — биты 0-15. Это порт источника пакета, описывающий, куда должен быть отправлен ответный пакет. Он может фактически быть установлено на ноль, если значение порта не применимо. Например, иногда нам не требуется ответный пакет, то тогда пакет может быть установлен на нулевой порт источника. В большинстве реализаций он установлен на некоторый номер порта.
- Порт назначения — биты 16-31. Порт назначения пакета. Это требуется для всех пакетов, в отличие от порта источника пакета.
Как и с протоколом TCP — для сервера обычно используется один из стандартных портов (например, порт 53 для DNS серверов), а порт источника выбирается произвольно для каждого соединения, обычно это номера портов с большим номером (десятки тысяч).
- Длина — биты 32-47. Поле длины указывает длину всего пакета в октетах, включая заголовок и части данных. Самый короткий возможный пакет может быть длиной 8 октетов.
Поле, задающее длину всей датаграммы (заголовка и данных) в байтах. Минимальная длина равна длине заголовка — 8 байт. Теоретически, максимальный размер поля — 65535 байт для UDP-датаграммы (8 байт на заголовок и 65527 на данные). Фактический предел для длины данных при использовании IPv4 — 65507 (помимо 8 байт на UDP-заголовок требуется ещё 20 на IP-заголовок).
- Контрольная сумма — биты 48-63. Контрольная сумма — это та же контрольная сумма, что и в заголовке TCP, за исключением того, что она содержит другой набор данных. Другими словами, это дополнение к сумме дополнительных частей заголовка IP, всего заголовка UDP, данных UDP и дополнения нулями в конце, когда это необходимо.
Поле контрольной суммы используется для проверки заголовка и данных на ошибки. Если сумма не сгенерирована передатчиком, то поле заполняется нулями. Поле не является обязательным для IPv4.
Канальный уровень (data link) – передача данных с устройства на устройство
Операционная система не имеет ничего против. Но есть одна загвоздка: TCP пакеты нельзя просто передать по сети. Как если бы вы своё письмо маме написали на бумаге и пришли на почту отправлять – первое, что вас попросят, это запечатать ваше письмо в конверт.
Но тут же мы сталкиваемся со следующей загвоздкой: Ethernet кадры в качестве адреса получателя и отправителя используют MAC-адреса. Имя сайта мы знаем, IP адрес знаем, даже знаем страницу, которую запросил пользователь, а вот MAC-адреса у нас нет…
И дело здесь не в какой-то прихоти. Мы подходим к моменту, когда данные будут переданы с устройства на другое устройство. Чтобы это сделать, нужно знать физический адрес этого другого устройства – тот самый MAC-адрес.
Допустим, нужно отправить TCP пакеты на IP адрес 192.168.0.175. Операционная система начинает с того, что определяет, принадлежит ли запрашиваемый IP к локальной сети или нет. Если принадлежит к локальной сети, то она смотрит в ARP таблицу, есть ли там информация об 192.168.0.175:
Если есть, то она смотрит MAC адрес устройства, у которого IP 192.168.0.175. Пакет TCP заворачивается в Ethernet кадр, в этом кадре есть область с теми самыми данными, которые нужно передать, а также есть заголовок, в этом заголовке сказано для какого MAC-адреса предназначается пакет и какой MAC-адрес у отправителя. Ethernet кадр отправляется на сетевой интерфейс. Пока не будем следовать за ним, а рассмотрим другие варианты.
Если нужный IP не найден в ARP таблице, то по локальной сети делается широковещательный запрос «у кого IP 192.168.0.175?». В ответ устройство с IP 192.168.0.175 присылает свой MAC-адрес. Когда приходит ответ, полученный MAC добавляется в ARP таблицу (а вдруг ещё пригодится) и делается уже знакомый нам Ethernet кадр, который отправляется на сетевой интерфейс.
Если же IP, куда нужно отправить TCP пакет, не в локальной сети, то операционная система смотрит адрес шлюза по умолчанию. На этот шлюз отправляются все пакеты, которые не принадлежат к локальной сети и для которых не прописаны специальные маршруты. Так вот, операционная система смотрит IP шлюза по умолчанию, затем ищет этот IP в ARP таблице – получает MAC-адрес шлюза по умолчанию. После этого TCP пакет заворачивается в Ethernet кадр.
Напомню, мы ещё только пытаемся отправить первый TCP пакет нашего запроса к веб-серверу…
Итак, наконец-то Ethernet кадр попал в локальную сеть. Если его встречает свитч (устройство, которое вообще не понимает IP адреса, да и которому это не нужно) – оно смотрит на MAC-получателя и перенаправляет Ethernet кадр в сторону получателя. Допустим, что веб-сервер не в нашей локальной сети, тогда наш путешественник Ethernet кадр в конечном счёте попадает на роутер. Первое, что делает роутер, это разворачивает Ethernet кадр, то есть достаёт из него TCP пакет.
Протокол tcp
Transmission Control Protocol (TCP, протокол управления передачей) — один из основных протоколов передачи данных интернета, предназначен для управления передачей данных.
Из-за перегрузки сети, балансировки нагрузки трафика или непредсказуемого поведения сети, IP-пакеты могут быть потеряны, дублированы или доставлены не в неправильном порядке. TCP обнаруживает эти проблемы, запрашивает повторную передачу потерянных данных, переупорядочивает неупорядоченные данные и даже помогает минимизировать перегрузку сети, чтобы уменьшить возникновение других проблем.
Если данные все ещё остаются недоставленными, источник уведомляется об этом сбое. После того, как получатель TCP собрал последовательность первоначально переданных октетов, он передаёт их принимающему приложению. Таким образом, TCP абстрагирует связь приложения от базовых сетевых деталей.
TCP широко используется во многих интернет-приложениях, включая World Wide Web (WWW), электронную почту, протокол передачи файлов, Secure Shell, одноранговый обмен файлами и потоковое мультимедиа.
Протокол TCP оптимизирован для точной доставки, а не для своевременной доставки, и может вызывать относительно длительные задержки (порядка секунд) при ожидании сообщений, вышедших из строя или повторных передач потерянных сообщений. Поэтому он не особенно подходит для приложений реального времени, таких как передача голоса по IP.
Итак, механизм TCP предоставляет поток данных с предварительной установкой соединения, осуществляет повторный запрос данных в случае потери данных и устраняет дублирование при получении двух копий одного пакета, гарантируя тем самым, в отличие от UDP, целостность передаваемых данных и уведомление отправителя о результатах передачи.
Алгоритм работы TCP следующий:
- Устанавливается трёхэтапное рукопожатие между двумя узлами. На этом этапе узлы согласуют два числа — начальные номера первого пакета для каждого из узлов.
- При отправке пакетов узлы последовательно номеруют их, то есть каждому сетевому пакету присвоен один из последовательных номеров.
- В дополнении к номеру, для каждого пакета рассчитывается контрольная сумма. Получив пакет, вновь рассчитывается контрольная сумма для полученных данных — если она не совпадает, значит пакет был повреждён при передаче.
- Итак, поскольку все пакеты имеют последовательные номера, то становится видно если какие-то из них отсутствуют. В этом случае отправляется запрос на повторную отправку пакета.
- Если для какого-то пакета не совпала контрольная сумма, то отправляется запрос на повторную отправку пакета.
В общем, используя два простых механизма — контрольную сумму и последовательную нумерацию каждого пакета — удаётся достичь надёжности передачи данных и возможности организовать их в правильную последовательность независимо от того, в каком порядке они доставлены.
Всё это возможно с помощью заголовков TCP пакета.
Сессия tcp
Рукопожатие TCP (установление подключения TCP)
Для установления соединения TCP использует трёхэтапное рукопожатие.
Подключение можно выполнить только если вторая сторона прослушивает порт, к которому будет выполняться подключение: к примеру, веб-сервер прослушивает порты 80 и 443. То есть это не охватывается рукопожатием, но прежде чем клиент попытается соединиться с сервером, сервер должен сначала подключиться к порту и начать прослушивать его, чтобы открыть его для соединений: это называется пассивным открытием.
Первый этап, отправка пакета с включённым флагом SYN: активное открытие выполняется клиентом, отправляющим SYN на сервер. Клиент устанавливает порядковый номер сегмента на случайное значение A.
Обратите внимание, что по умолчанию Wireshark показывает относительное значение порядкового номера (Sequence number), чуть ниже вы также можете видеть реальное значение (показано как raw).
Второй этап, отправка пакета с включённым флагом SYN-ACK: В ответ сервер отвечает SYN-ACK. Номер подтверждения установлен на единицу больше принятого Порядкового номера (Sequence number), то есть A 1. Поскольку сервер также будет отправлять данные, то для себя он тоже выбирает Порядковый номер (Sequence number) первого пакета с данными, который будет другим случайным числом B.
Третий этап, отправка пакета с включённым флагом ACK: наконец, клиент отправляет ACK обратно на сервер. Порядковый номер устанавливается равным полученному значению подтверждения, то есть A 1, а номер подтверждения устанавливается на единицу больше, чем принятый порядковый номер, то есть B 1.
На этом этапе и клиент, и сервер получили подтверждение соединения. Шаги 1, 2 устанавливают параметр соединения (порядковый номер) для одного направления, и оно подтверждается. Шаги 2, 3 устанавливают параметр соединения (порядковый номер) для другого направления, и он подтверждается. Таким образом устанавливается полнодуплексная (двухсторонняя) связь.
Передача данных в TCP
Сравнение udp и tcp
TCP — ориентированный на соединение протокол, что означает необходимость «рукопожатия» для установки соединения между двумя хостами. Как только соединение установлено, пользователи могут отправлять данные в обоих направлениях.
- Надёжность — TCP управляет подтверждением, повторной передачей и тайм-аутом сообщений. Производятся многочисленные попытки доставить сообщение. Если оно потеряется на пути, сервер вновь запросит потерянную часть. В TCP нет ни пропавших данных, ни (в случае многочисленных тайм-аутов) разорванных соединений.
- Упорядоченность — если два сообщения последовательно отправлены, первое сообщение достигнет приложения-получателя первым. Если участки данных прибывают в неверном порядке, TCP отправляет неупорядоченные данные в буфер до тех пор, пока все данные не могут быть упорядочены и переданы приложению.
- Тяжеловесность — TCP необходимо три пакета для установки сокет-соединения перед тем, как отправить данные. TCP следит за надёжностью и перегрузками.
- Потоковость — данные читаются как поток байтов, не передается никаких особых обозначений для границ сообщения или сегментов.
UDP — более простой, основанный на сообщениях протокол без установления соединения. Протоколы такого типа не устанавливают выделенного соединения между двумя хостами. Связь достигается путём передачи информации в одном направлении от источника к получателю без проверки готовности или состояния получателя.
В приложениях для голосовой связи через интернет-протокол (Voice over IP, TCP/IP) UDP имеет преимущество над TCP, в котором любое «рукопожатие» помешало бы хорошей голосовой связи. В VoIP считается, что конечные пользователи в реальном времени предоставят любое необходимое подтверждение о получении сообщения.
- Ненадёжный — когда сообщение посылается, неизвестно, достигнет ли оно своего назначения — оно может потеряться по пути. Нет таких понятий, как подтверждение, повторная передача, тайм-аут.
- Неупорядоченность — если два сообщения отправлены одному получателю, то порядок их достижения цели не может быть предугадан.
- Легковесность — никакого упорядочивания сообщений, никакого отслеживания соединений и т. д. Это небольшой транспортный уровень, разработанный на IP.
- Датаграммы — пакеты посылаются по отдельности и проверяются на целостность только если они прибыли. Пакеты имеют определенные границы, которые соблюдаются после получения, то есть операция чтения на сокете-получателе выдаст сообщение таким, каким оно было изначально послано.
- Нет контроля перегрузок — UDP сам по себе не избегает перегрузок. Для приложений с большой пропускной способностью возможно вызвать коллапс перегрузок, если только они не реализуют меры контроля на прикладном уровне.
- Широковещательные рассылки (Broadcasts) — при отсутствии соединения, UDP может делать широковещательные рассылки — отправленные пакеты могут быть адресованы для приёма всеми устройствами в подсети.
- Многоадресная рассылка (Multicast) — поддерживается многоадресный режим работы, при котором один пакет дейтаграмм может быть автоматически направлен без дублирования группе подписчиков.
Связанные статьи:
Сходства и различия tcp и udp
В первой части «Как работают компьютерные сети» мы узнали, что для передачи информации используются транспортные протоколы TCP и UDP. В физическом смысле эти протоколы представляют собой сетевые пакеты. Каждый сетевой пакет передаёт небольшой фрагмент информации, поэтому данные разбиваются на много пакетов.
Каждый сетевой пакет обоих протоколов TCP и UDP состоит из двух частей:
- заголовок
- непосредственно данные
В заголовке содержится «служебная информация» (можно сказать, что это метаданные) — порты пункта назначения и исходного узла, номер пакета в потоке, тип пакета и так далее.
Различие между протоколами TCP и UDP в том, что протокол TCP имеет механизм контроля полноты переданных данных — если какой-либо пакет был потерян или повреждён, то предусмотрен механизм для проверки этого факта и повторной отправки пакета. В протоколе UDP такого механизма нет — то есть если потерян пакет протокола UDP, то узел, который его отправил, никогда об этом не узнает, а принимающая сторона никогда не узнает, что ей был отправлен потерянный пакет UDP.
Может возникнуть вопрос, зачем вообще нужен такой ненадёжный протокол UDP, если есть надёжный протокол TCP? Платой за надёжность протокола TCP является то, что в бухгалтерии называется «накладные расходы» (overheads) — суть в том, что для обеспечения механизма контроля доставки пакетов в протоколе TCP отправляется много данных, которые не содержат полезной информации, а служат только для установки и контроля соединения.
К примеру, чтобы отправить хотя бы одни пакет с полезными данными в TCP нужно завершить трёхступенчатое рукопожатие, которое заключается в отправке 1 особого пакета от источника к пункту назначения, получения 1 пакета о возможности установить соединения и отправки ещё 1 специального пакета от источника с подтверждением, что всё готово к отправке — за это время с помощью протокола UDP можно было бы отправить уже несколько пакетов с полезными данными.
Фильтры wireshark для tcp
Чтобы увидеть только трафик TCP:
tcp
Показать трафик, источником или портом назначения которого является определённый порт, например 8080:
tcp.port==8080
Показать трафик, источником которого является порт 80:
tcp.srcport == 80
Показать трафик, который отправляется службе, прослушивающей порт 80:
tcp.dstport == 80
Показать TCP пакеты с включённым флагом SYN:
tcp.flags.syn==1
Показать TCP пакеты с включённым флагом SYN и отключённым флагом ACK:
tcp.flags.syn==1 && tcp.flags.ack==0
Аналогично и для других флагов:
tcp.flags.syn==1
tcp.flags.ack==1
tcp.flags.reset==1
tcp.flags.fin==1
tcp.flags.cwr==1
tcp.flags.ecn==1
tcp.flags.urg==1
tcp.flags.push==1
tcp.flags.ns==1
Также можно использовать синтаксис вида tcp.flags == 0x0XX, например:
- FIN это tcp.flags == 0x001
- SYN это tcp.flags == 0x002
- RST это tcp.flags == 0x004
- ACK это tcp.flags == 0x010
- Установленные одновременно ACK и FIN это tcp.flags == 0x011
- Установленные одновременно ACK и SYN это tcp.flags == 0x012
- Установленные одновременно ACK и RST это tcp.flags == 0x014
Длина заголовка (смещение данных):
tcp.hdr_len == 32 tcp.hdr_len == 52 tcp.hdr_len > 32
Пакеты с установленными зарезервированными битами:
tcp.flags.res == 1
Размер окна:
tcp.window_size_value == 11 tcp.window_size_value == 4468 tcp.window_size_value > 65000 tcp.window_size_value < 100
Вычесленный размер окна:
tcp.window_size == 45056 tcp.window_size == 11
Фактор масштабирования размера окна:
tcp.window_size_scalefactor == 4096
tcp.window_size_value — это необработанное значение размера окна, считываемое непосредственно из заголовка TCP, тогда как tcp.window_size — это вычисленный размер окна, который основан на том, применимо ли масштабирование окна или нет.
Если масштабирование окна не используется или коэффициент масштабирования равен 1 или неизвестно, применимо ли масштабирование окна или нет, потому что трёхэтапное рукопожатие TCP не было захвачено, тогда эти два значения будут одинаковыми.
С помощью tcp.window_size_scalefactor вы можете определить, какое из этих условий применимо — если его значение равно -1, то оно неизвестно, если его значение равно -2, тогда масштабирование окна не используется, а все остальные значения представляют фактический размер фактора масштабирования окна.
Чтобы показать пакеты, содержащие какую либо строку, например, строку hackware:
tcp contains hackware
Следовать потоку TCP с номером X:
tcp.stream eq X
Фильтровать по номеру потока:
tcp.seq == x
Показать повторные отправки пакетов. Помогает прослеживать замедление производительности приложений и потери пакетов:
tcp.analysis.retransmission
Этот фильтр выведен проблемные пакеты (потерянные сегменты, повторную отправку и другие. Этот фильтр проходят пакеты TCP Keep-Alive, но они не являются показателем проблем.
tcp.analysis.flags
Фильтры для оценки качества сетевого подключения.
Следующие характеристики относятся к TCP фреймам. Причём они не основываются на заголовках фрейма — рассматриваемые характеристики (пропуск данных, дубли) присвоены программой Wireshark исходя из анализа.
Фильтр выводит информацию о фреймах с флагом ACK, которые являются дублями. Большое количество таких фреймов может говорить о проблемах связи:
tcp.analysis.duplicate_ack_num == 1
Фильтр показа фреймов для которых не захвачен предыдущий сегмент:
tcp.analysis.ack_lost_segment
Это нормально в начале захвата данных — поскольку информация перехватывается не с самого начала сессии.
Для показа фреймов, которые являются ретрансмиссией (отправляются повторно):
tcp.analysis.retransmission
Вывод фреймов, которые получены не в правильном порядке:
tcp.analysis.out_of_order