Возможны разные ошибки:
- Неправильный порядок пакетов
- Потеря пакетов
- Поврежденные данные внутри пакета
- Фантомные пакеты (получатель получает пакеты, которые никогда не отправлялись)
UDP предоставляет только механизм для преодоления повреждения данных (это дополнительная функция в IPv4, обязательная в IPv6).
Повреждение данных
UDP защищен только от повреждения данных внутри пакетов, если в заголовке каждого пакета используется поле контрольной суммы. В основном он берет заголовок, содержимое пакета и некоторую дополнительную информацию (например, IP-адреса), интерпретирует это как длинный список 16-битных слов в одном дополнении и суммирует их контрольная сумма UDP .
TCP использует аналогичный подход для решения проблемы повреждения данных.
Все остальные проблемы
TCP имеет так называемые порядковые номера для каждого пакета. Порядковый номер адресует байты, поэтому, если отправитель говорит «это пакет с порядковым номером 102», он говорит, что отправленный им пакет начинается с байта 102 потока. Затем получатель отправляет и подтверждение получателю. Например, если пакет имеет длину 10 байтов, получатель отправит и подтвердит с порядковым номером 112, что означает «я ожидаю, что следующий пакет будет получен, начиная с порядкового номера 112». Каждый пакет с другим порядковым номером является либо дубликатом (слишком низким), либо потерянным пакетом (слишком большой принятый порядковый номер) или фантомом (общее несоответствие ожидаемого порядкового номера и полученного). Таким образом, во всех случаях несовпадения порядкового номера получатель знает, что что-то идет не так, и может реагировать (отличается от разных версий TCP).
Отправитель ожидает подтверждения от получателя. Если он не получит ожидаемое подтверждение в течение определенного времени, он будет ретранслировать пакеты, потому что он предполагает, что пакеты были потеряны в пути.
Это только очень краткое объяснение. Тема несколько больше, чем описано здесь;)