Java: возможно ли повреждение данных с помощью UDP в Java

1

Я пишу сетевой тест, который отправляет UDP-пакеты разных размеров (до 50 килобайт). Я хочу измерить ping и потерю пакетов. Должен ли я также проверять переданные данные или упал пакет, если он содержит поврежденные данные?

  • 0
    Что говорит Javadoc?
  • 0
    @Kayaman "Доставка пакетов не гарантируется." Там нет никакого смысла о поврежденных данных.
Показать ещё 2 комментария
Теги:
networking
udp

1 ответ

1
Лучший ответ

Прежде всего, пакет протоколов TCP/IP (включая UDP) реализован во всех современных операционных системах. Реализация часто упоминается как сетевой стек. Сама виртуальная машина Java использует обычные сокеты уровня пользователя для своей сети, поэтому использует сетевой стек операционной системы. Все, что вы можете сделать с Java, - это установить параметры сокета, указать источник и пункт назначения и предоставить данные для отправки. Поэтому я не стал бы беспокоиться о создании некорректных пакетов с Java. Сегмент (уровень 4), пакет (уровень 3) и кадр (уровень 2) созданы для вашего приложения ОС. Ничто, что вы можете сделать с обычными сокетами, может изменить это, если вы не используете сырые сокеты.

Во-вторых, в каждом пакете TCP/IP имеется несколько кодов обнаружения ошибок. UDP и TCP имеют 16-битный код контрольной суммы, который проверяет заголовок, полезную нагрузку пакета и несколько полей заголовка IP. У самих пакетов IP есть контрольная сумма заголовка, и как Ethernet (802.3), так и Wi-Fi (802.11) имеют свои собственные механизмы обнаружения ошибок на уровне кадра. Поведение по умолчанию, которое я видел как в сетевом оборудовании, так и в конечных операционных системах при обработке ошибочных пакетов, бросает их. Таким образом, очень мало шансов получить ошибки в вашем слоте пользовательского уровня.

Редактировать:

Один момент, который стоит упомянуть о UDP, заключается в том, что в отличие от потокового TCP, UDP-сокеты работают на основе пакета. Таким образом, все, что вы send() с использованием сокета UDP, будет отправлено как один пакет UDP. Я бы посоветовал убедиться, что вы не ставите что-либо слишком большое в любой точке. Не пытайтесь отправить большой кусок 4KiB как один пакет, потому что это приведет к фрагментации уровня IP. Приложите все усилия, чтобы убедиться, что отправленные пакеты не меньше, чем на 20 байтов, чем минимальный MTU по пути от вашего компьютера до вашего места назначения (20 байтов - это потому, что заголовок IP обычно имеет длину 20 байтов). Если есть сомнения, ограничьте количество данных, отправленных на пакет, примерно до 1000-1200 байт, что значительно ниже общего предела MTU ~ 1400-1500.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню