Неблокируемый ввод / вывод UDP против блокирования ввода / вывода UDP в Java - PullRequest
16 голосов
/ 20 февраля 2009

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

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

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

Ответы [ 3 ]

15 голосов
/ 20 февраля 2009

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

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

8 голосов
/ 21 февраля 2009

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

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

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

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

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

0 голосов
/ 10 апреля 2013

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

...