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

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

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

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

person Keenan Gebze    schedule 03.01.2011    source источник
comment
Дейтаграмма не является четко определенным термином - вы имеете в виду пакет UDP/IP? Кроме того, почему это помечено как java? У вас есть какой-то код Java, с которым у вас проблемы? Если это так, пожалуйста, напишите об этом.   -  person Jon Bringhurst    schedule 03.01.2011
comment
И что вы подразумеваете под офлайн? Приложение не запущено? Компьютер выключен? Не подключен к интернету?   -  person psmears    schedule 03.01.2011
comment
все они, psmears, о, извините, да, извините, я пометил это как java, потому что я все еще изучаю учебник по java, да, я имею в виду UDP-пакет.   -  person Keenan Gebze    schedule 04.01.2011


Ответы (4)


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

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

person Noel M    schedule 03.01.2011
comment
Это верно, но в ряде случаев, когда пакет сбивается с пути, ICMP-пакет отправляется обратно (обычно это один из случаев недостижимости, но также возможно превышение времени, если проблема связана с маршрутизацией). Хорошие стеки IP могут информировать клиентское приложение об этом статусе — например, так некоторые инструменты зондирования могут определить, открыт порт UDP или нет. - person psmears; 03.01.2011

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

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

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

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

person Peter Lawrey    schedule 03.01.2011

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

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

person Gondim    schedule 03.01.2011
comment
TCP не может гарантировать доставку в случае разрыва сети. Это гарантирует доставку во время обычных операций, которые UDP не делает. Он сообщит отправителю, что соединение не удалось, но не скажет, какие именно данные были получены. - person Peter Lawrey; 03.01.2011
comment
Что ж, мой учитель должен мне объяснить... Спасибо, @Peter Lawrey. - person Gondim; 03.01.2011

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

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

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

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

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

    • пакет UDP заблокирован, и отправитель не получает никаких указаний, или

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

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

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

person Stephen C    schedule 09.11.2014