Wireshark сравнить 2 файла

Обновлено: 08.07.2024

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

Все пакеты перехватываются в реальном времени и предоставляются в удобном для чтения формате. Программа поддерживает очень мощную систему фильтрации, подсветку цветом, и другие особенности, которые помогут найти нужные пакеты. В этой инструкции мы рассмотрим, как пользоваться Wireshark для анализа трафика. Недавно разработчики перешли к работе над второй веткой программы Wireshark 2.0, в неё было внесено множество изменений и улучшений, особенно для интерфейса. Именно её мы будем использовать в этой статье.

Основные возможности Wireshark

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

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

Как пользоваться Wireshark

Я предполагаю, что программа у вас уже установлена, но если нет, то вы можете ее установить из официальных репозиториев. Для этого наберите команду в Ubuntu:

sudo apt install wireshark

После установки вы сможете найти программу в главном меню дистрибутива. Запускать Wireshark нужно с правами суперпользователя, потому что иначе она не сможет анализировать сетевые пакеты. Это можно сделать из главного меню или через терминал с помощью команды для KDE:

А для Gnome / Unity:

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


Анализ сетевого трафика

Для начала анализа выберите сетевой интерфейс, например eth0, и нажмите кнопку Start.


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

  • Верхняя часть - это меню и панели с различными кнопками;
  • Список пакетов - дальше отображается поток сетевых пакетов, которые вы будете анализировать;
  • Содержимое пакета - чуть ниже расположено содержимое выбранного пакета, оно разбито по категориям в зависимости от транспортного уровня;
  • Реальное представление - в самом низу отображается содержимое пакета в реальном виде, а также в виде HEX.

Вы можете кликнуть по любому пакету, чтобы проанализировать его содержимое:


Здесь мы видим пакет запроса к DNS, чтобы получить IP-адрес сайта, в самом запросе отправляется домен, а в пакете ответа мы получаем наш вопрос, а также ответ.

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


Фильтры Wireshark

Перебирать пакеты вручную, чтобы найти нужные, очень неудобно, особенно при активном потоке. Поэтому для такой задачи лучше использовать фильтры. Для ввода фильтров под меню есть специальная строка. Вы можете нажать Expression, чтобы открыть конструктор фильтров, но там их очень много, поэтому мы рассмотрим самые основные:

Для указания отношения между полем и значением в фильтре можно использовать такие операторы:

Для объединения нескольких выражений можно применять:

  • && - оба выражения должны быть верными для пакета;
  • || - может быть верным одно из выражений.

Теперь рассмотрим подробнее на примерах несколько фильтров и попытаемся понять все знаки отношений.


А чтобы получить не только отправленные пакеты, но и полученные в ответ от этого узла, можно объединить два условия:

ip.dst == 194.67.215.125 || ip.src == 194.67.215.125


Дальше отберём пакеты с ttl меньше 10:


Также мы можем отобрать переданные большие файлы:

Отфильтровав Content-Type, мы можем выбрать все картинки, которые были загружены; выполним анализ трафика Wireshark, пакеты, которого содержат слово image:

Чтобы очистить фильтр, вы можете нажать кнопку Clear. Бывает, вы не всегда знаете всю необходимую для фильтрации информацию, а просто хотите изучить сеть. Вы можете добавить любое поле пакета в качестве колонки и посмотреть его содержимое в общем окне для каждого пакета.

Например, я хочу вывести в виде колонки ttl (время жизни) пакета. Для этого откройте информацию о пакете, найдите это поле в разделе IP. Затем вызовите контекстное меню и выберите опцию Apply As Column:

Далее вы увидите нужную колонку после обновления:


Таким же образом можно создать фильтр на основе любого нужного поля. Выберите его и вызовите контекстное меню, затем нажмите Apply as filter или Prepare as filter, затем выбираем Selected, чтобы вывести только выбранные значения, или Not selected, чтобы их убрать:


Указанное поле и его значение будет применено или во втором случае подставлено в поле фильтра:


Еще одна интересная возможность программы - использование Wireshark для отслеживания определённого сеанса между компьютером пользователя и сервером. Для этого откройте контекстное меню для пакета и выберите Follow TCP stream.


Затем откроется окно, в котором вы найдете все данные, переданные между сервером и клиентом:


Диагностика проблем Wireshark


Окно разделено на такие вкладки, как Errors, Warnings, Notices, Chats. Программа умеет фильтровать и находить множество проблем с сетью, и тут вы можете их очень быстро увидеть. Здесь тоже поддерживаются фильтры Wireshark.


Анализ трафика Wireshark

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


Далее в открывшемся окне вы увидите все доступные перехваченные объекты. Вам достаточно экспортировать их в файловую систему. Вы можете сохранять как картинки, так и музыку.

Дальше вы можете выполнить анализ сетевого трафика Wireshark или сразу открыть полученный файл другой программой, например плеером.

Выводы

В этой статье мы рассмотрели, как пользоваться Wireshark 2 для анализа сетевого трафика, а также примеры решения проблем с сетью. Это очень мощная утилита, которая имеет очень много функций. Всю её функциональность невозможно охватить в одной статье, но приведенной здесь базовой информации будет вполне достаточно, чтобы вы могли сами освоить всё необходимое.

Анализ TCP-пакетов в сети - лучший способ найти и устранить общие проблемы с сетью. Этот навык рано или поздно пригодится каждому инженеру программного обеспечения, не зависимо от специфики задач, которые перед ним стоят. В этом материале мы познакомим вас с инструментарием, который понадобится вам для этой работы, включая Wireshark и другие программные средства!

Генерация дампов TCP

Анализ дампов TCP с помощью Wireshark

Чтобы, к примеру, установить tcpdump (Ubuntu), используйте команду: «apt-get install tcpdump».

Запуск TCPDUMP

Ниже приведены некоторые из наиболее часто используемых команд с аргументами, которые могут быть полезны при создании дампов TCP с различным уровнем информации. Вы можете использовать большинство аргументов для определения необходимого уровня детализации и применения фильтров. Вам также потребуется доступ с правами суперпользователя (root) для запуска следующих команд:

  • «tcpdump -D»: показать все доступные интерфейсы;
  • «tcpdump -i eth0»: захватить трафик на интерфейсе «eth0»;
  • «tcpdump -i any»: захватить трафик на любом интерфейсе;
  • «tcpdump -i wlan0 port 80»: захватить трафик на интерфейсе «wlan0», проходящий через порт 80;
  • «tcpdump -i wlan0 -c 5»: захватить 5 пакетов на интерфейсе «wlan0»;
  • «tcpdump -i wlan0 tcp»: захватить только TCP-трафик на интерфейсе «wlan0»;
  • «tcpdump -i wlan0 src 192.168.1.1»: захватить трафик на интерфейсе «wlan0», источником которого является IP-адрес 192.168.1.1;
  • «tcpdump -i wlan0 dst 192.168.1.1»: захватить трафик на интерфейсе «wlan0», отправляемый по IP-адрес 192.168.1.1;
  • «tcpdump “src port 22” and “dst host 1.2.3.4”»: несколько разных команд tcpdump, объединенные с помощью булевых операторов;
  • «tcpdump -i wlan0 -s 65535»: захватить трафик на интерфейсе «wlan0» размером 65535 байт. Значением по умолчанию на данный момент является 262144 байт (более старые версии tcpdump по умолчанию захватывали всего 68 или 96 байт);
  • «tcpdump -i wlan0 -w dump.pcap»: захватить трафик на интерфейсе «wlan0» и записать результат в файл библиотеки libpcap (расширение «.pcap»);
  • «tcpdump -r dump.pcap»: прочитать захваченный файл (более предпочтительно для анализа файлов «.pcap» использовать Wireshark).

Примечание. Если вы планируете анализировать пакеты с помощью Wireshark, вам необходимо записывать их в файл «.pcap» с помощью аргумента «-w».

Ниже приведена команда, которую мы можем вам рекомендовать использовать в тех случаях, когда вы не планируете использовать слишком много фильтров и хотите проанализировать захваченные пакеты с помощью Wireshark:

Предварительная обработка и анализ с помощью Wireshark

Предварительная обработка и анализ с помощью Wireshark

После создания файла «.pcap» с помощью утилиты tcpdump вы можете для анализа вашего трафика использовать богатый инструментарий графического пользовательского интерфейса программы-анализатора трафика Wireshark. Более подробно о том, как использовать Wireshark, читайте в этом разделе. Но прежде, чем перейти непосредственно к анализу, необходимо провести предварительную обработку собранных вами результатов. Среди важных вещей, которые требуют вашего внимания, следующие:

Чтобы изменить формат даты и времени в WireShark используйте «View -> Time Display Format» («Вид» -> «Формат отображения времени»).

Способ, с помощью которого Wireshark отображает временные отметки, поначалу может сбить с толку. Если вы анализируете TCP-пакеты и хотите сравнить результаты с какими-либо другими лог-файлами сервера, вам необходимо скоррелировать временные метки, и для этого важно понимать, как сдвигать время в пакетах.

Например, у вас есть сервер ESB WSO2, работающий в часовом поясе UTC-7:00. Ваши лог-файлы ESB-системы будут сгенерированы по времени этого часового пояса, как и дампы TCP, так как будут созданы на этом же сервере. Затем вы пытаетесь проанализировать дампы TCP из часового пояса UTC+2:00.

Теперь предположим, что некий TCP-пакет прошел через ESB-сервер в 8 часов утра 7 января 2019 года. Но когда вы откроете этот дамп TCP в своей часовой зоне для анализа времени этого пакета, оно будет отображаться как 5 часов вечера 7 января 2019 года. Это связано с тем, что Wireshark корректирует время пакета в соответствии с вашим часовым поясом.

Но когда вы захотите сравнить эти данные, например, с лог-файлами ESB-сервера, который находиться не в вашей временной зоне, а в часовом поясе UTC-7:00, вы не сможете сделать это корректно. Поэтому сначала вам нужно сдвинуть время в TCP-пакетах на 9 часов, после чего вы сможете связать его с временными метками лог-файла сервера WSO2 ESB.

Таким образом, при работе с инструментарием editcap для выше озвученного нами примера вам стоит ввести: «editcap -t 32400 mytcpdump.pcap», что будет соответствовать увеличению временных меток в вашем файле «mytcpdump.pcap» на 32400 секунд, то есть на необходимые нам +9 часов.

Выводы

Анализ TCP с помощью Wireshark и других программ

Если вы столкнулись с необходимостью устранить общие проблемы с сетью, то лучший способ сделать это — проанализировать поток TCP-пакетов в сети. Инструментарий для такого анализа доступен совершенно бесплатно и не сложен в работе. Для тех, кто хочет узнать больше, в статье вы найдёте ссылки, по которым сможете почерпнуть больше информации по всем вопросам, которые возникнут у вас в процессе работы!

Подписывайтесь на рассылку, делитесь статьями в соцсетях и задавайте вопросы в комментариях!

Когда вы видите это приглашение, это означает, что помеченный пакет не захвачен. В качестве примера возьмем пакет № 4 на рисунке 1. Он имеет общую длину 171 байт, но были захвачены только первые 96 байт, поэтому Wireshark дал это приглашение.


Эта ситуация обычно вызвана перехватом пакетов. В некоторых операционных системах по умолчанию tcpdump захватывает только первые 96 байтов каждого кадра. Мы можем использовать параметр "-s", чтобы указать количество байтов, которые мы хотим захватить.

2.[TCP Previous segment not captured]

В процессе передачи по TCP сегмент данных, отправляемый одним и тем же хостом, должен быть непрерывным, то есть номер Seq последнего пакета равен Seq Len предыдущего пакета (три рукопожатия и четыре колебания являются исключениями). Если Wireshark обнаружит, что номер Seq следующего пакета больше, чем Seq Len предыдущего пакета, он знает, что часть данных отсутствует в середине. Если пропущенные данные не найдены во всем сетевом пакете (то есть неупорядоченные исключены), он выдаст запрос [Предыдущий сегмент TCP не захвачен]. Например, в примере на фиг.2 номер 1449 Seq пакета 6 больше, чем Seq Len = 1 0 = 1 пакета 5, что указывает на то, что пакет, несущий 1448 байтов в середине, не был перехвачен, это "Seq = 1, Len = 1448" .


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


3.[TCP ACKed unseen segment]

Указывает, что пакет TCP ACK был перехвачен, но фактические данные, полученные и подтвержденные, не были перехвачены. Это, вероятно, самый распространенный совет Wireshark, но, к счастью, он почти всегда незначителен. Взяв рисунок 3 в качестве примера, Seq Len = 6889 1448 = 8337 для пакета 32, указывая, что следующий пакет, отправленный сервером, должен быть Seq = 8337. То, что мы видим, является Seq = 11233 пакета 35, что означает, что данные с 8337 по 11232 не были захвачены. Этот фрагмент данных должен был появиться до 34-го числа, поэтому Wireshark запросил [TCP ACKed unseen segment].


Нетрудно представить, что вы часто будете видеть это приглашение в начале сетевого пакета, потому что перехватывается только обратный Ack, а передний пакет не перехватывается.

Во время передачи TCP (исключая трехстороннее рукопожатие и четырехстороннюю волну) пакеты данных, отправленные одним и тем же хостом, должны быть непрерывными, то есть номер Seq последнего пакета равен Seq Len предыдущего пакета. Можно также сказать, что Seq последнего пакета будет больше или равно Seq предыдущего пакета. Когда Wireshark обнаружит, что номер Seq следующего пакета меньше, чем Seq Len предыдущего пакета, он будет считаться неупорядоченным, поэтому будет выдан запрос [TCP Out-of-Order]. Как показано на рисунке 4, Seq = 2685642 для пакета 3362 меньше, чем Seq = 2712622 для пакета 3360, поэтому он вышел из строя.


Беспорядок малого промежутка имеет небольшой эффект: например, если исходный порядок равен 1, 2, 3, 4 и 5, а пакеты разбиты на 2, 1, 3, 4, 5, все будет хорошо. Однако непоследовательность с большим промежутком может инициировать быструю повторную передачу, например, когда она перетасовывается в 2, 3, 4, 5, 1, будет запущено достаточное количество Dup ACK, что приведет к повторной передаче пакета 1.

В случае нарушения порядка или потери пакетов получатель получит некоторые пакеты с номерами Seq, превышающими ожидаемые. Он будет подтверждать ожидаемое значение Seq каждый раз, когда получает такой пакет, таким образом, чтобы напомнить отправителю, поэтому он генерирует некоторый дубликат Ack. Wireshark пометит [TCP Dup ACK] на этом повторном подтверждении.


6.[TCP Fast Retransmission]

Когда отправитель получает 3 или более [TCP Dup ACK], он понимает, что ранее отправленный пакет может быть потерян, поэтому он быстро ретранслирует его (это правило RFC). Взяв рисунок 6 в качестве примера, клиент получает 4 Ack = 991851, поэтому он повторно передает Seq = 991851 в пакете 1177.


Если пакет действительно потерян, и нет последующего пакета, который может вызвать [Dup Ack] в приемнике, он не будет повторно передан быстро. В этом случае отправитель должен ждать тайм-аута для повторной передачи, и такие пакеты повторной передачи будут помечены [TCP Retransmission] Wireshark. Взяв рисунок 7 в качестве примера, после того, как клиент отправил исходный пакет (номер пакета 1053), он не может ждать соответствующего Ack, поэтому он может быть повторно передан только после более чем 100 миллисекунд (пакет номер 1225).


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

«Win =» в пакете TCP представляет размер окна приема, которое указывает, сколько буферной области отправитель этого пакета может в настоящее время принимать данные. Когда Wireshark находит в пакете «win = 0», он помечает его как «нулевое окно TCP», указывая, что область буфера заполнена и больше не может принимать данные. Например, на рисунке 8 показано, что буфер сервера заполнен, поэтому уведомите клиента, чтобы он больше не отправлял данные. Мы даже можем видеть, как процесс его окна постепенно уменьшается с 3258 до 3263 пакетов, то есть с win = 15872 до win = 1472.


9.[TCP window Full]


10.[TCP segment of a reassembled PDU]

Когда вы получаете это приглашение, вы должны включить функцию Разрешить субсектору повторную сборку потоков TCP в меню Правка -> Параметры -> Протоколы -> TCP. Это означает, что Wireshark может виртуализировать TCP-пакеты, принадлежащие одному и тому же PDU прикладного уровня (например, SMB's Read Response и Write Request). Как показано на рисунке 10, этот ответ чтения SMB завершается пакетами с 39 по 48, поэтому Wireshark фактически собирает все пакеты в последнем пакете. Преимущество этого заключается в том, что вы можете щелкнуть правой кнопкой мыши поле внизу рисунка 10 и выбрать «Копировать -> Байты -> Только для печати», чтобы скопировать весь PDU прикладного уровня. Студенты, занимающиеся исследованиями и разработками, могут нуждаться в этой функции больше.


Вы видите это приглашение, указывающее, что Разрешить субсектору повторную сборку потоков TCP была закрыта в меню Edit -> Preferences -> Protocols -> TCP. Например, пакеты на рисунке 10 становятся похожими на рисунок 11, когда они закрыты.


Если вы внимательно сравните рисунок 10 и рисунок 11, вы обнаружите, что ответ Read считан в заголовке пакета № 48 на рисунке 10 и рассчитан в заголовке пакета № 39 на рисунке 11. Это приведет к странному результату: время отклика на чтение, показанное на рисунке 10, составляет 2,528 миллисекунды (разница во времени между пакетами 38 и 48), а время отклика на чтение, показанное на рисунке 11, составляет 2,476 миллисекунды (разница во времени между пакетами 38 и 39). ). Который правильный? На этот вопрос сложно ответить. Если вас интересует фактическая общая производительность, посмотрите на первое, если вы хотите проигнорировать потерю протокола TCP / IP и посмотреть на скорость ответа сервера, то посмотрите на второе. В некоторых особых случаях разница между ними очень велика, поэтому ее необходимо уточнить.

12.[Time-to-live exceeded (Fragment reassembly time exceeded)]

ICMP сообщает о многих видах ошибок, которые нетрудно понять, поэтому мы возьмем только одну из них в качестве примера. [Превышено время повторной сборки фрагмента] указывает, что отправитель этого пакета уже получил некоторые фрагменты, но по какой-то причине он не смог собрать. Например, на рисунке 12 некоторые пакеты, отправленные из Шанхая в Пекин, передаются фрагментами, а некоторые из них теряются в пути, поэтому пекинская сторона не может собрать его, поэтому она должна использовать эту ошибку ICMP для информирования шанхайской стороны.


2. Анализ результатов захвата пакетов

(tcp.flags.syn == 1) && (tcp.analysis.retransmission) Отфильтровать запросы на повторную передачу рукопожатия


Отслеживание потока tcp


10.21.4.33:58964 просит 10.11.2.17:8080 отключиться.

10.11.2.17: 8080 возвращает ACK для подтверждения 10.21.4.33: 58964.

10.11.2.17: 8080 запросил отключение от 10.21.4.33: 58964, tcp повторно передан.

10.21.4.33: 58964 и 10.21.4.33: 8080 происходит переподключение.

(tcp.flags.reset == 1) && (tcp.seq == 1) фильтрует запросы на повторное соединение


Отслеживание потока tcp


10.11.2.17: 8080 запрос на отключение от 10.21.4.33: 57614 не получил подтверждение ACK 10.21.4.33: 57614, что привело к непрерывной повторной передаче tcp.

Я хочу использовать iperf для отправки некоторых пакетов и получения их на клиенте (который мог бы пройти через различные обработки уровня OSI). Я хочу проверить, что отправленные пакеты такие же, как и полученные.

  1. Могу ли я использовать Wireshark для захвата потоков?
  2. Есть ли какой-нибудь способ сравнить их с wireshark?

Или есть какой-то другой лучший способ сделать это?

2 ответа

Я пытаюсь написать функцию, которая сравнивает содержимое двух файлов. Я хочу, чтобы он возвращал 1, если файлы одинаковы, и 0, если разные. ch1 и ch2 работают как буфер, и я использовал fgets , чтобы получить содержимое моих файлов. Я думаю, что что-то не так с указателем eof , но я не уверен.

Я использую wireshark версии 1.10.1 . в отличие от более старой версии, история моих последних фильтров захвата не сохраняется. Поэтому, если я закрою wireshark и открою его снова, мне снова придется снова входить в фильтры захвата!

Вы можете использовать Wireshark для выполнения захвата, выбора пакетов каждого потока и экспорта в текстовые файлы (по одному на поток):

Затем выполните diff с помощью обычных текстовых инструментов , таких как gnu diff, WinMerge или gvimdiff.

NB :Я сам удивляюсь,что делаю такой полезный инструмент, кроме того, это в Wireshark wishlit.

Похожие вопросы:

Мне нужен фильтр захвата для wireshark, который будет соответствовать двум байтам в полезной нагрузке UDP. Я видел фильтры с UDP[8:4] в качестве критериев соответствия, но не было никакого.

Как бы я задал фильтр захвата Wireshark только для захвата ICMP (как для IPv4, так и для IPv6) и ARP и пакетов протокола обнаружения соседей?

У меня есть два текстовых файла с 2.4M. Мне нравится сравнивать, в чем заключаются различия в этих двух текстовых файлах. Я использовал Компаре. Это сработало, но это медленно для большого размера.

Я пытаюсь написать функцию, которая сравнивает содержимое двух файлов. Я хочу, чтобы он возвращал 1, если файлы одинаковы, и 0, если разные. ch1 и ch2 работают как буфер, и я использовал fgets .

Я использую wireshark версии 1.10.1 . в отличие от более старой версии, история моих последних фильтров захвата не сохраняется. Поэтому, если я закрою wireshark и открою его снова, мне снова.

Я хочу написать карту reduce для сравнения двух больших файлов в hdfs. любые мысли о том, как этого добиться. Или если нет другого способа сделать сравнение, потому что размер файла очень велик.

Есть ли способ очистить окно захвата в Wireshark без перезапуска захвата или повторного применения фильтра? Трудно отличить один набор трафика от другого, не глядя очень внимательно на timestamp.

Я новичок в использовании wireshark, и у меня возникли проблемы с фильтром захвата. С помощью Wireshark 2.2.5, я могу на главной панели apply a display filter и писать ip.addr == xxx.xxx.xxx.xxx(.

У меня есть два файла wireshark pcap от отправителя и получателя. Я транслирую живое видео от отправителя к получателю по разным протоколам-TCP, UDP, RTMP и RTSP. Есть ли способ получить потерю.

Читайте также: