Куда делись пакеты дейтаграмм, когда их пункт назначения находится в автономном режиме? - PullRequest
0 голосов
/ 03 января 2011

Эти пакеты просто исчезают?или они ждут пункта назначения?Или пакет, возвращающийся назад, затем генерирует исключение?

И в java, в чем разница между байтом [] и длиной в конструкторе DatagramPacket?

DatagramPacket dp = new DatagramPacket(new byte[...], length);

Ответы [ 4 ]

3 голосов
/ 03 января 2011

Из Википедия :

UDP - это ... Ненадежно - когда сообщение отправлено, оно не может знать, достигнет ли оно пункта назначения;это может потеряться по пути.Не существует понятия подтверждения, повторной передачи или тайм-аута.

1 голос
/ 03 января 2011

Даже если пункт назначения находится в сети, нет гарантии, что пакет UDP будет доставлен, доставлен в отправленном заказе или не будет фрагментирован. (Я полагаю, что пакеты размером менее 532 байтов не будут фрагментированы) Можно иметь все три; фрагментирован, не в порядке и не завершен для одного и того же пакета.

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

Вам решать, что делать, если пакет потерян, и как его обнаружить.

Если вам нужна широковещательная и надежная доставка сообщений, я предлагаю вам взглянуть на JMS Topics или Queues, например ActiveMQ.

0 голосов
/ 09 ноября 2014

Эти пакеты просто исчезают? или они ждут пункта назначения? Или пакет возвращается назад, затем выдает исключение?

Что происходит, зависит от характера статуса «оффлайн».

  • Если UDP-сообщение достигает хоста, но приложение не прослушивает, оно, как правило, отбрасывается без уведомления. Это определенно не будет стоять в очереди в ожидании приложения для прослушивания. (Это было бы бессмысленно и потенциально опасно.)

  • Если UDP-сообщение не может попасть на хост, поскольку сам хост отключен, сообщение будет отброшено без уведомления. (Если пакеты могут достигать локальной сети хоста назначения, то кроме самого хоста нет ничего, что могло бы определить, действительно ли хост получил пакеты.)

  • Если сеть не знает, как маршрутизировать IP-пакеты на UDP-сервер (и несколько других сценариев), отправителю ICMP-пакета может быть отправлен пункт назначения недоступен *1017*. и это обычно сообщается как исключение Java. Однако это не гарантируется. Итак, возможные результаты:

    • пакет UDP имеет черную дыру, и отправитель не получает указаний, или

    • пакет UDP имеет черную дыру, и отправитель получает исключение Java.

  • Если UDP-пакет заблокирован брандмауэром, поведение трудно предсказать. (Брандмауэры часто «врут» в своих ответах на нежелательный трафик.)

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

0 голосов
/ 03 января 2011

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

Протокол TCP, это гарантирует, что клиент получит пакет.Даже если он в автономном режиме, как только он подключится, этот пакет будет получен.

...