Неблокирующий UDP-ввод-вывод против блокировки UDP-ввода-вывода в Java

StackOverflow https://stackoverflow.com/questions/569555

  •  05-09-2019
  •  | 
  •  

Вопрос

Неблокирующий TCP/IP SocketChannelы и Selector в NIO помогите мне обработать множество соединений TCP / IP с небольшим количеством потоков.Но как насчет UDP DatagramChannels?(Должен признать, что я не очень хорошо знаком с UDP.)

Операции отправки UDP, похоже, не блокируются, даже если DatagramChannel не работает в режиме блокировки.Действительно ли существует случай, когда DatagramSocket.send(DatagramPacket) блоки из-за перегрузки или что-то подобное?Мне действительно любопытно, существует ли такой случай и какие возможные случаи существуют в производственной среде.

Если DatagramSocket.send(DatagramPacket) на самом деле не блокируется, и я не собираюсь использовать подключенный DatagramSocket и привязываться только к одному порту, нет ли преимущества в использовании неблокирующего режима с DatagramChannel и Selector?

Это было полезно?

Решение

Прошло некоторое время с тех пор, как я использовал Java DatagramSockets, каналы и тому подобное, но я все еще могу оказать вам некоторую помощь.

Протокол UDP не устанавливает соединение, как это делает TCP.Скорее всего, он просто отправляет данные и забывает о них.Если важно убедиться, что данные действительно попадают туда, это ответственность клиента.Таким образом, даже если вы находитесь в режиме блокировки, ваша операция отправки будет блокироваться только на то время, которое потребуется для очистки буфера.Поскольку UDP ничего не знает о сети, он запишет ее при первой же возможности, не проверяя скорость сети или то, действительно ли она попадает туда, куда должна идти.Таким образом, вам кажется, что канал на самом деле немедленно готов к дальнейшей отправке.

Другие советы

UDP не блокируется (он блокируется только во время передачи данных в ОС) Это означает, что если в какой-либо момент следующий переход / коммутатор / компьютер не может буферизировать UDP-пакет, он отбрасывает его.Это может быть желательным поведением в некоторых ситуациях.Но это то, о чем вам нужно знать.

UDP также не гарантирует

  • пакеты доставки в том порядке, в котором они были отправлены.
  • не разбивать большие пакеты.
  • пересылка пакетов через коммутаторы.Часто переадресация UDP между коммутаторами отключена.

Однако UDP поддерживает многоадресную рассылку, поэтому один и тот же пакет может быть доставлен на один или несколько хостов.Однако отправитель понятия не имеет, получает ли кто-нибудь пакеты.

Сложность UDP заключается в том, что он работает большую часть времени, но иногда дает серьезные сбои, которые очень трудно воспроизвести.По этой причине вам не следует предполагать надежность, даже если вы проведете несколько тестов и окажется, что это работает.

Неблокирующий UDP в основном полезен на принимающей стороне.Отправка пакета может быть отложена только из-за местных обстоятельств:инструменты формирования локального трафика, такие как "игровые сетевые карты", которые отдают предпочтение игровому трафику перед другими источниками трафика, или перегруженная сетевая карта (что маловероятно) могут задержать отправку пакета.Оказавшись вне системы.Как только пакет покидает локальный интерфейс, это больше не забота приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top