Книга: Операционная система UNIX

Модуль UDP

Модуль UDP

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

Итак, IP-модуль направляет датаграмму модулю UDP, вызывая функцию udp_input(), адрес которой был получен из соответствующего коммутатора протокола. Сначала функция udp_input() проверяет правильность контрольной суммы и допустимость установленных полей заголовка. Если указанные проверки закончились неудачно, пакет "молчаливо" уничтожается. Далее определяется получатель пакета. Для этого на основании адресов и номеров портов отправителя и получателя производится поиск соответствующего управляющего блока протокола.[89] В системе могут существовать несколько управляющих блоков с одинаковым номером локального порта, но с различными адресами и/или номерами портов отправителя. В этом случае выбирается блок, для которого найдено лучшее совпадение по всем четырем параметрам. Конечно, лучшим является точное совпадение, но если такового не найдено, будет выбран блок с совпадающим номером локального порта, но неуказанным адресом и/или номером порта отправителя. Таким образом, управляющий блок, у которого не указаны часть или все четыре параметра, является получателем всех пакетов, для которых не найдено лучшего совпадения.[90]

Если управляющий блок найден, данные и адрес отправителя помещаются в буфер приема сокета, связанного с управляющим блоком. В противном случае генерируется сообщение ICMP PORT UNREACHABLE.

Передача данных от приложения инициируется системным вызовом sendto(2), который на уровне сокета преобразуется в вызов функции udp_usrreq() с запросом PRU_SEND. Если передача инициирована системным вызовом sendto(), то вместе с данными передается адрес получателя. Если же данные были переданы с помощью системного вызова send(2), то адрес получателя определяется из управляющего блока, где он был сохранен предшествующим вызовом connect(2).[91]

Фактическая передача осуществляется функцией udp_output(), которая формирует заголовок пакета, устанавливает значения его полей и вычисляет контрольную сумму. После этого производится вызов уже рассмотренной ранее функции ip_output().

Оглавление книги

Оглавление статьи/книги

Генерация: 1.804. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз