Чтобы продемонстрировать различия между TCP и UDP, я передаю содержимое файла через сетевое соединение и записываю взаимодействие с Wireshark. В TCP все выглядит нормально, но в UDP все становится немного странно.
Я настраиваю прослушивание на машине А с
netcat -ul 5000
Затем отправьте файл с машины B с помощью:
netcat -u <ip address> 5000 < file.txt
Когда я просматриваю журнал Wireshark, я получаю половину сообщения через UDP-пакеты, а половину, по-видимому, через IPv4 вообще без дейтаграммы (см. Снимок экрана ниже).
Это просто Wireshark странно отображает данные, или половина сообщения действительно проходит без чего-либо от UDP? И почему?
Вы получаете один UDP-пакет, размер которого равен размеру отправляемого вами файла. Затем пакет UDP фрагментируется стеком IP на несколько пакетов IP.
Wireshark показывает как исходные фрагментированные пакеты IPv4, так и фрагменты дефрагментированных пакетов UDP.
Это стандартное рабочее поведение на уровне IP, если верхний уровень отправляет пакеты большего размера, чем позволяет MTU протокола L2.
В протоколе TCP протокол определяет наибольший MTU нефрагментируемого пути между хостами и использует этот размер для отправки пакетов правильного размера, поэтому фрагментация на уровне IP не требуется. Это дает преимущества для работы протокола.
Обновить:
IPv4 - это протокол L3 (интернет-уровня), который обрабатывает часть маршрутизации сетевых операций. UDP - это протокол L4 (уровень передачи), который работает поверх IPv4.
И конкретный ответ на ваш вопрос:
Это обычный способ отображения фрагментированных данных в Wireshark, показывая оба уровня протокола. Если у вас есть HTTP-запросы, вы увидите в Wireshark декодированные запросы IPv4 + TCP + HTTP, что тоже нормально.
Половина сообщения не приходит ниоткуда, это одни и те же данные на разных уровнях стека протоколов.