Как предотвратить дублирование или сброс пакетов через UDP в C? - PullRequest
0 голосов
/ 01 декабря 2018

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

Чтобы настроить ненадежную сеть, мой преподаватель заставил нас запустить sudo tc qdisc add dev lo root netem delay 100ms 20ms 25% loss 0.5% duplicate 1% reorder 25% 50% в нашем терминале, чтобы создать эмулированныйненадежная сеть.

Я просто не могу обернуть голову, чтобы избежать дублирования или отбрасывания моих пакетов.Я не опубликовал код, потому что не хочу, чтобы он выглядел так, будто я прошу ответы.Я пытаюсь понять методологию, лежащую в основе этого, поскольку я не очень опытен в сокетном или сетевом программировании.Есть ли способ предотвратить дублирование или сброс моих пакетов в ненадежной сети?

1 Ответ

0 голосов
/ 01 декабря 2018

В этом случае вы должны использовать собственный протокол, я могу подумать об этом
сначала у нас должен быть номер в наших пакетах, который помогает нам отслеживать то, что отправлено и получено, давайте назовем его PacketId,
отправитель отправляет пакет со своим уникальным идентификатором, сохраняет его и запускает таймер, ожидающий ACK, если ACK для этого определенного идентификатора был получен, он удаляется из очереди, и мы отправляем следующий пакет, если нет и переполнение таймера, этот пакет отправляется снова,
И последнее, что касается идентификатора, это то, что он должен увеличиваться на единицу для каждого пакета.
На принимающей стороне вы ожидаете только определенный идентификатор, допустим, что при запуске вы ожидаете идентификатор 0, любой другойполученный пакет игнорируется до тех пор, пока этот конкретный идентификатор не будет обнаружен, затем вы увеличиваете ожидаемый идентификатор на единицу и идете вперед.
Может быть случай, когда ACK потерян и сервер отправит обратно предыдущий пакет, поэтому вам следует также подтвердить эти пакетыдаже если они не ожидаются, и убедитесь, что не обрабатывали эти пакеты дважды.

Это базовая схема, которая пришла мне в голову, она только отправляет пакет за один раз, с небольшой настройкой, она может адаптироваться для отправки нескольких пакетов одновременно и ждать ACK

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...