6

Я написал простое приложение, которое взаимодействует с использованием сокетов UDP (на языке C). Приложение простое: клиенты отправляют цифры на сервер, а сервер вычисляет их сумму.

Теперь я знаю, как я могу перехватить пакеты, которыми обмениваются клиент и сервер, но мне интересно, как я могу, используя Wireshark, наблюдать разницу между порядком байтов с прямым и младшим порядком байтов для моих пакетов?

3 ответа3

4

На протоколах, не распознаваемых Wireshark, вы увидите только пакеты TCP или UDP с полем "не проанализированный". если протокол "распознается" Wireshark (BOOTP, DHCP, DNS, SMB, HTML и т. д.), вы увидите, что Wireshark "формирует" область полезной нагрузки TCP/UDP, отображая соответствующие распознанные поля протокола более высокого уровня.

Wireshark включает в себя множество dissectors для хорошо известных протоколов, и вы можете создать свой собственный, если хотите отобразить свою конкретную полезную нагрузку протокола в отформатированном виде; посмотреть здесь. https://www.wireshark.org/docs/wsdg_html_chunked/ChDissectAdd.html

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

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

2

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

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

Помните, что, как говорит Википедия о протоколе пользовательских дейтаграмм :

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

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

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

Самое простое решение для отслеживания входящих сообщений состоит в том, чтобы ваш сервер дополнительно печатал информацию на консоли. Это может контролироваться параметром, указанным при вызове, или директивой препроцессора отладки (#ifdef для C/C++).

0

Обратите внимание на значения в разделе, который описывает разбивку для вас и сравните с необработанным гексом. Посмотрите на поле, которое больше одного байта, и посмотрите, есть ли в необработанном шестнадцатеричном коде младший или старший порядок байтов. Т.е. val(16) в разбивке и в hexdump (так как это 2-байтовое поле) показывает: 00 10 для старшего байта и будет 10 00 для младшего байта. Надеюсь, это поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .