Почему при обмене 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 нет исправления ошибок. Это все еще ненадежно, даже несмотря на то, что вам удалось много раз передать файл, используя его.
Вероятность ошибки очень мала в современных сетях, особенно в локальной сети или на той же машине. То есть вам может потребоваться отправить файл миллионы раз, прежде чем вы получите сообщение об ошибке.