Могут ли данные UDP быть доставлены поврежденными? - PullRequest
20 голосов
/ 07 сентября 2008

Возможно ли, что данные UDP приходят к вам поврежденными? Я знаю, что это может быть потеряно.

Ответы [ 6 ]

21 голосов
/ 07 сентября 2008

UDP-пакеты используют 16-битную контрольную сумму. Для пакетов UDP не может быть повреждения, но это довольно маловероятно. В любом случае он не более подвержен коррупции, чем TCP.

14 голосов
/ 10 декабря 2008

Прежде всего, упомянутая выше «контрольная сумма IP» является только контрольной суммой заголовка IP. Это не защищает полезную нагрузку. См. RFC 791

Во-вторых, UDP разрешает транспортировку с контрольной суммой NO, что означает, что 16-битная контрольная сумма установлена ​​в 0 (т. Е. Отсутствует). См. RFC 768. (Значение контрольной суммы переданного нуля означает, что преобразователь не сгенерировал контрольной суммы)

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

6 голосов
/ 07 сентября 2008

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

5 голосов
/ 07 сентября 2008

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

3 голосов
/ 14 октября 2008

Распространенной формой «повреждения», которая затрагивает ничего не подозревающих программистов, является усечение дейтаграмм . См. «Сетевое программирование Unix» Стивенса для получения дополнительной информации (стр. 539 во 2-м изд.)

Вы можете проверить флаг MSG_TRUNC ...

0 голосов
/ 13 января 2019

Краткий ответ: ДА.

Подробный ответ:

Около 7 лет назад (может быть, в 2011 году?). Мы обнаружили, что дейтаграммы UDP непреднамеренно изменяются при обмене дейтаграммой UDP между компьютером в Китае и другим в Корее. Конечно, контрольная сумма в заголовке пакета UDP также пересчитывается в отношении изменения полезной нагрузки. На двух компьютерах не было вредоносного программного обеспечения.

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

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

Я точно не причина, но я примерно предполагаю, что это Китайский Золотой Щит .

Итак, мы добавили алгоритм обработки дейтаграмм в наше программное обеспечение ProudNet, и проблема исчезла. Это не сложно реализовать. Просто закодируйте или запутайте первые несколько байтов вашей дейтаграммы.

...