Что происходит, когда UDP-сокет считывается недостаточно быстро?

#.net #sockets #udp

#.net #сокеты #udp

Вопрос:

Могут произойти две вещи:

  • старые данные перезаписываются новыми с помощью некоторого алгоритма циклического перебора
  • новые данные просто отбрасываются, оставляя старые данные в буферах

Или происходит что-то еще?

Редактировать:

Я бы действительно хотел получить некоторый практический опыт в этом, советы по TCP или просто предположения — вот что я также могу предоставить самому себе 🙂

Комментарии:

1. Зависит от того, что вам нужно, но если вам действительно нужна надежная передача, используйте TCP. Тестирование UDP через 10-15 переходов в Интернете дает очень-очень приблизительно потерю 1 пакета на каждые 100, и это всего лишь один пакет в секунду.

2. @Erik — транспортный поток редко используется таким образом — только в закрытых системах «сервер-телеприставка» и локальных сетях.

3. С другой стороны, я никогда не терял UDP-пакет в локальной сети. Тем не менее, это может произойти.

Ответ №1:

Новые пакеты начинают отбрасываться, как только буфер сокета заполняется.

Ответ №2:

Это также зависит от аппаратного буфера. Если он заполнен, пакет также просто игнорируется (= то же самое, как если бы он никогда не достиг устройства, и эквивалентно тому, как если бы программный буфер в стеке IP считывался недостаточно быстро). Оба буфера могут заполниться независимо. Другими словами, вы можете потерять дейтаграмму на двух уровнях.

Ответ №3:

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

(Вы можете либо просто потерять данные, и все будет в порядке, либо реализовать свой собственный протокол подтверждения для повторной отправки пакетов, но тогда TCP выглядит как ответ)