Я знаю, как открыть UDP-сокет в C++, и я также знаю, как отправлять пакеты через него. Когда я отправляю пакет, я правильно его получаю на другом конце, и все работает нормально.Эффективно отправлять поток UDP-пакетов
EDIT: Я также построил полностью работающую систему подтверждения: пакеты пронумерованы, контрольную сумму и признал, так что в любой момент я знаю, сколько из пакетов, которые я послал, скажем, в течение последнего второго фактически было получено от другой конечной точки. Теперь данные, которые я отправляю, будут доступны для чтения только тогда, когда ВСЕ получаются пакеты, поэтому мне действительно не нужно упорядочивать пакеты: мне просто нужно, чтобы они все пришли, чтобы они могли прибыть в случайные последовательности, и это все равно будет быть в порядке, поскольку их последовательное упорядочение все равно будет бесполезным.
Теперь мне нужно перенести большой кусок данных (скажем, 1 ГБ), и мне нужно, чтобы он был перенесен как можно быстрее. Таким образом, я разбил данные, скажем, на 512 байтов и отправил их через сокет UDP.
Теперь, поскольку UDP является бесконтактным, он, очевидно, не обеспечивает никакой диагностики скорости или передачи эффективности. Поэтому, если я просто попробую отправить тонну пакетов через мой сокет, мой сокет будет просто принимать их, тогда они будут отправлены сразу, и мой маршрутизатор отправит первую пару, а затем начнет их отбрасывать. Таким образом, это НЕ самый эффективный способ сделать это.
То, что я тогда делал цикл:
- сна на некоторое время
- Отправить кучу пакетов
- Сон снова и так далее
Я пытался сделать некоторые и я достиг довольно хороших скоростей передачи, однако у меня есть поток, который непрерывно отправляет пакеты в маленькие пучки, но у меня нет ничего, кроме экспериментальной идеи о том, какой должен быть интервал и каков размер букет должен быть. В принципе, я могу представить, что спать на очень малое время, а затем отправлять только один пакет за раз было бы лучшим решением для маршрутизатора, однако это совершенно невозможно в плане производительности процессора (мне, вероятно, придется заняться подождите, так как время между двумя последовательными пакетами будет действительно небольшим).
Так есть ли какое-либо другое решение? Любое широко принятое решение? Я предполагаю, что у моего маршрутизатора есть буфер или что-то в этом роде, так что он может принимать НЕКОТОРЫЕ пакеты сразу, а затем для их обработки требуется некоторое время. Насколько велик этот буфер?
Я не эксперт в этом, поэтому любое объяснение было бы замечательным.
Обратите внимание, что по техническим причинам вообще нет Я могу использовать TCP.
начать играть с [iperf] (https://iperf.fr/). посмотрите, насколько далеко вы находитесь от скорости, которую вы можете получить с помощью iperf. Это с открытым исходным кодом, чтобы вы могли видеть, что они сделали. – MehrZ
Хм .. может быть, вам нужен какой-то протокол контроля потока. Вы можете использовать его в сообщениях ACK, возвращаемых одноранговым узлом, чтобы скорость отправки дейтаграммы могла быть уменьшена, если общие потери превысили некоторое значение. Такие небольшие, 512 байт, датаграммы не кажутся очень эффективными :( –
Вы думали о создании своего сокета 'SOCK_SEQPACKET'? – Freddy