Мультиплексирование и демультиплексирование без установления логического соединения

Вспомним о том, что в программе на языке Java, выполняющейся на оконечной системе, создание UDP-сокета производится командой

DatagramSocket mySocket = new DatagramSocket();

При выполнении этой команды транспортный уровень автоматически связывает номер порта с создаваемым сокетом. Номером порта является любое число от 1024 до 65 535, не используемое в текущий момент другим UDP-портом. Номер порта может быть задан явно:

DatagramSocket mySocket = new DatagramSocket(19157);

В этом случае UDP-сокету будет сопоставлен номер порта 19 157. Явное указание номера порта необходимо в случаях, когда разработчик создает приложение, поддерживаемое каким-либо популярным протоколом, занимающим один из «хорошо известных» номеров порта. Обычно на клиентской стороне приложения транспортный уровень связывает сокет с номером порта автоматически, в то время как на серверной стороне требуется явное указание последнего.

После того как номера портов UDP-сокетов определены, мы можем точно описать процедуру мультиплексирования и демультиплексирования протокола UDP. Предположим, что процесс с номером сокета 19 157, выполняющийся на хосте А, пытается передать массив данных процессу с номером сокета 46 428, выполняющемуся на хосте В. Транспортный уровень хоста А создает сегмент, включающий данные процесса, номер порта отправителя (19 157), номер порта получателя (46 428), а также две другие величины, которые сейчас не представляют для нас интереса и будут рассмотрены позже. Сформированный сегмент передается сетевому уровню, который создает IP-дейтаграмму и «по-возможности» доставляет ее хосту В. В случае успешного получения сегмента хостом-получателем последний анализирует значение поля номера порта получателя и направляет сегмент сокету с номером 46 428. Обратите внимание, что на хосте В могут одновременно выполняться несколько процессов, каждый из которых обладает сокетом с уникальным номером порта. Каждый получаемый сегмент анализируется и направляется тому сокету, номер порта которого совпадает со значением поля номера порта получателя сегмента.

34.png

Отметим, что любой UDP-сокет однозначно идентифицируется совокупностью IP-адреса хоста назначения и номера порта. Таким образом, если два UDP-сегмен-та имеют разные IP-адреса и/или номера портов отправителя, но одинаковые IP-адреса и номера портов получателя, оба сегмента будут переданы одному и тому же процессу.

Не удивительно, если у вас сразу возник вопрос: для чего нужен номер порта отправителя? Как показано на рис. 3.4, номер порта отправителя используется как часть «обратного адреса». Если у получателя возникнет необходимость в отправке ответа, он скопирует значение поля номера порта отправителя полученного сегмента в поле номера порта получателя ответного сегмента (мы назвали номер порта частью «обратного адреса» потому, что полный адрес также включает IP-адрес отправителя). В качестве примера обратимся к серверной программе UDPServer.java, созданной в разделе «Разработка простого web-сервера». В ней используется специальный метод для извлечения номера порта отправителя из принятого сегмента; извлеченный номер порта служит в качестве номера порта получателя для создаваемого ответного сегмента.

Данная статья "Мультиплексирование и демультиплексирование без установления логического соединения" размещена на сайте Компьютерные сети и многоуровневая архитектура интернета (conlex.kz) в ознакомительных целях.

Уточнения, корректировки и обсуждения статьи "Мультиплексирование и демультиплексирование без установления логического соединения" - под данным текстом, в комментариях.

Ответственность, за все изменения, внесённые в систему по советам данной статьи, Вы берёте на себя.

Копирование статьи "Мультиплексирование и демультиплексирование без установления логического соединения", без указания ссылки на сайт первоисточника Компьютерные сети и многоуровневая архитектура интернета (conlex.kz), строго запрещено.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *