Маршрут пакета UDP в Java

У меня есть вопрос относительно жизни/маршрута udp-пакета. У меня есть простая схема UDP клиентского сервера с вызовом отправки на стороне клиента и вызовом приема на стороне сервера. Допустим, вызывается метод отправки, и пакет фактически поступает на другую сторону, НО выполнение кода сервера еще не достигло вызова метода приема. Что происходит с пакетом за это время. Теперь я попытался остановить выполнение перед вызовом получения с помощью простой подсказки ввода команды, немного подождал, а затем продолжил и заметил, что пакет получен. Можете ли вы объяснить, ПОЧЕМУ это происходит, например, это буферизуется на другом уровне OSI?

Заранее спасибо.


person user2788573    schedule 29.03.2014    source источник


Ответы (2)


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

NB osi не имеет к этому никакого отношения. TCP/IP не подчиняется модели OSI. У него есть своя, предыдущая модель.

person user207421    schedule 29.03.2014
comment
Это предполагает, что он уже настроил DatagramSocket (то есть DatagramSocket server = new DatagramSocket(port), который, я полагаю, у него уже есть, и в этом случае должен быть приемный буфер, как вы сказали. - person Jared; 30.03.2014
comment
@ Джаред Очевидно. Если бы он не создал сокет, данные нигде не ставились бы в очередь, и вопрос не существовал бы. Что касается вашего собственного несколько спекулятивного ответа, UDP получит прерывание от сетевой карты, вытащит данные, увидит, что это для несуществующего порта, выбросит их и выдаст сообщение об ошибке ICMP. - person user207421; 30.03.2014

Вызов метода "receive" не получает пакет. Если для этого порта есть сокет UDP, «открытый», это означает, что выделено буферное пространство, и именно туда сетевая карта + ОС помещает данные. Когда вы вызываете "receive", он просто смотрит туда, и если там что-то есть, то делает вид, что только что получил это.

Я должен добавить, что если буфер пуст, то вызов приема переходит в состояние блокировки, ожидая уведомления ОС о том, что что-то поступило.

person cpurdy    schedule 30.03.2014