Wireshark - как с помощью Wireshark я могу наблюдать разницу порядка байтов в порядке байтов?

6

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

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

mirx
источник
Ну, во-первых, что вы подразумеваете под порядком байтов с прямым и младшим порядком байтов для ваших пакетов?
user20574
@ user20574: Я думаю, что пользователь Фердинанд Бейер очень хорошо объяснил это здесь: stackoverflow.com/questions/701624/... , Что бы я хотел сделать, чтобы увидеть это на практике. У меня уже есть код для отправки простых сообщений UDP / TCP, но мне интересно, как я могу использовать Wireshark, чтобы увидеть эту разницу в реальной жизни.
mirx
Тебе не нужна проволочная акула? Просто используйте htonl или так далее, чтобы преобразовать число, а затем посмотрите на число.
user20574
1
Если исходный код вашего клиента и сервера придерживается Network Byte Order протоколы, то вся эта вещь с порядком байтов становится неактуальной (что является смыслом того, чтобы эти протоколы были в первую очередь). См. например stackoverflow.com/q/19207745/31326
Peter M
1
заголовки интернет-пакетов всегда в сетевом порядке байтов, то есть big-endian. Например, самый старший байт IP-адреса (например, 192 в 192.68 ...) отправляется первым. Байты вашей полезной нагрузки otoh находятся в том порядке, в котором они находятся в вашем буфере, когда вы их отправляете. Если в вашем буфере содержится беззнаковое длинное значение, и вы находитесь на машине с прямым порядком байтов, тогда u-long будет отправлен сначала с его младшим значащим байтом (если только вы не использовали на нем htonl, что обычно следует делать, если вы ') переписываю стандартно-совместимое приложение).
Jamie Hanrahan

Ответы:

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

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

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

Pat
источник
2

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

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

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

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

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

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

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

harrymc
источник
1
Ниппик: UDP-пакеты не более подвержены повреждению, чем битовый поток TCP. Оба используют относительно слабую 16-битную контрольную сумму в Интернете. Вы правы в проблеме потери пакетов, хотя.
juhist
@juhist: UDP-пакет может содержать несколько пользовательских или даже частичных пользовательских данных - ответственность за правильность несут отправитель и получатель.
harrymc
Разрабатывать комментарии к данным можно только одним способом, например, меткой порядка байтов. Например, файлы UTF-16 будут начинаться с 0xFFFE или 0xFEFF в зависимости от их порядкового номера.
Muh Fugen
0

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

chris
источник