Почему при обмене UDP-сокетом не возникает ошибка?

Я студент, изучающий компьютерные сети. Я сделал очень простую программу связи между сервером и клиентом на языке C на Ubuntu, используя протокол UDP. Я прочитал в книге, что UDP - ненадежный протокол передачи данных, в то время как TCP - надежный протокол передачи данных. Причина в том, что UDP просто отправляет пакеты, в то время как TCP отправляет и ожидает получения соответствующего подтверждающего сообщения.

Во всяком случае, я много раз пытался отправить файл изображения (около 1 МБ) с клиента на сервер, используя сокет UDP. Тем не менее, файл изображения был успешно передан без каких-либо ошибок.

Есть ли в библиотеке сокетов схема исправления ошибок, хотя используется настройка UDP?

PS) Моя программа почти такая же, как обычный код сокета эха в C. Просто другое дело не эхо, а копирование. То есть клиент передает данные, а сервер получает и копирует их.

Для справки) Я использовал заголовок sys / socket для функций сокета. Я использовал fopen, fread и fwrite для копирования файлов.

2 ответа

Решение

Во всяком случае, я много раз пытался отправить файл изображения (около 1 МБ) с клиента на сервер, используя сокет UDP. Тем не менее, файл изображения был успешно передан без каких-либо ошибок.

Если это сделано на одном хосте с помощью обратной петли, пакет не будет потерян (за исключением случаев, когда вы включите некоторую функцию тестирования потери пакетов). Это связано с тем, что сетевой уровень современных ОС только передает указатели на дескрипторы пакетов. Итак, когда вы делаете send() или же write() на сокете структура дескриптора пакета построена вокруг ваших данных; этот тип структуры "живет" в процессе написания, и только тот, на кого он указывает, передается тому, кто его получит. Если это другой процесс, это эффективно приводит к IPC (и если вы используете правильные операции с сокетами, это идет даже до передачи данных с нулевой копией). Только если этот дескриптор пакета окажется в драйвере сетевого интерфейса, будет передаваться не только указатель.

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

Чтобы потеря пакетов стала заметной, вы должны либо использовать высококонкурентную сеть с общей средой (например, W-LAN с большим количеством клиентов, борющихся за нее), либо пройти хотя бы один маршрутизатор, близкий к пропускной способности.

Есть ли в библиотеке сокетов схема исправления ошибок, хотя используется настройка UDP?

Нет.

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

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

Другие вопросы по тегам