А. Робачевский - Операционная система UNIX (1114671), страница 88
Текст из файла (страница 88)
Соответственно модуль IP имеет возможность непосредст!венно вызвать функцию pr_inputтребуемого протокола следующегоуровня.В случае, когда полученная датаграмма не содержит ошибок, но не адре!сована данному хосту, она, возможно, должна быть передана на другойсетевой интерфейс для последующей передачи фактическому адресату. Этапроцедура носит название шлюзования (forwarding) и включает выполнениеследующих шагов:О Производится проверка разрешенияВ случае отрица!тельного результата хост не может выполнять функции шлюза иданные уничтожаются.Возможность передачи на другой интерфейс определяется установкой соответствующегофлага при конфигурации сетевой подсистемы (модуля IP). Например, в операционнойсистеме SCO UNIX за это отвечает настраиваемый параметр ядраwww.books-shop.comсети в BSD UNIXПроизводится проверка адреса получателя.
Если адресне принадлежит адресному пространству сетей класса А, В или С,такие данные не могут бытьОпределяетсямаршрут передачи датаграммы.Если дальнейший путь датаграммы проходит через тот же интер!фейс, с которого она была получена, и хост!отправитель расположенв той же сети, ему отправляется сообщениеREDIRECT.Производится вызов функции ip_outputвыполняющей передачудатаграммы хосту!адресату или соседнему шлюзу для дальнейшейпередачи.При выполнении этих функций модуль IP может обнаружить несколькоошибочных ситуаций, например, отсутствие маршрута для датаграммы илиневозможность передачи данных из!за переполнения в сети.
В этих случа!ях модуль формирует соответствующее сообщение ICMP и передает егоотправителю датаграммы. Эти сообщения ICMP и причины их отправкиприведены в табл. 6.9.Таблица 6.9. Сообщения ICMPСообщениеПричинаDESTINATION UNREACHABLEНевозможно доставитьПричин можетбыть несколько:Отсутствует маршрут к сети2. Отсутствует маршрут к хосту3. Для передачи необходима фрагментация, но взаголовке установлен флаг(Don't Fragment)SOURCE QUENCHПереполнение сети. Шлюз передает это сообще%ние, запрашивая отправителя на уменьшение ско%рости передачи данныхТайм%аут.
Причины могут быть две:Истекло время жизни датаграммы в сети2. Произошел тайм%аут реассемблирования, т. е.через определенный промежуток времени полу%чены не все фрагменты датаграммыTIME EXCEEDEDПри вызове функциией передаетсякоторуюнеобходимо отправить, указатель на маршрут (структура route, хранящая!ся в управляющем блоке), а также флаги (например, указание не исполь!зоватьтаблицы).
Передача маршрута не является обя!Адреса сетей класса D — групповые (multicast) адреса — используются для создания специ!альных наложенных сетей (Multicast backbone,предназначенных для таких при!ложений, как видео!, аудиоконференции и т. п.
Обработка таких датаграмм выполняется,как правило, специальными демонами отдельно от стандартных функций шлюзования.Если в системе включена поддержка групповых адресов, данные с указанными адресамибудут передаваться этим демонам, которые и выполнят логическое шлюзование/передачу.www.books-shop.com468Глава 6. Поддержкав операционной системе UNIXзательной. Если функции не передан указатель на маршрут, будет исполь!зован маршрут из таблицы маршрутизации. В противном случае будетпроизведена проверка переданного маршрута, и при необходимости егозначение будет обновлено для последующего использования.Функцияможет быть вызвана и модулем транспортногопротокола (UDP или TCP).
Каким образом это происходит, описано вследующем разделе.Модуль UDPВернемся к рассмотрению ситуации, когдаадресована нашемухосту, не содержит ошибок (по крайней мере, с точки зрения IP) и должнабыть передана транспортному протоколу. Поскольку целью данного разде!ла является иллюстрация схемы взаимодействия между модулями, рас!смотрим более простой протокол UDP.Итак, IP!модуль направляетмодулю UDP, вызывая функциюudp_inputадрес которой был получен из соответствующего коммутаторапротокола.
Сначала функцияпроверяет правильность кон!трольной суммы и допустимость установленных полей заголовка. Если ука!занные проверки закончились неудачно, пакет "молчаливо" уничтожается.Далее определяется получатель пакета. Для этого на основании адресов иномеров портов отправителя и получателя производится поиск соответст!вующего управляющего блокаВ системе могут существоватьнесколько управляющих блоков с одинаковым номером локального порта,но с различными адресами и/или номерами портов отправителя.
В этомслучае выбирается блок, для которого найдено лучшее совпадение по всемчетырем параметрам. Конечно, лучшим является точное совпадение, но еслитакового не найдено, будет выбран блок с совпадающим номером локаль!ного порта, но неуказанным адресом и/или номером порта отправителя. Та!ким образом, управляющий блок, у которого не указаны часть или все четы!ре параметра, является получателем всех пакетов, для которых не найденолучшегоЕсли управляющий блок найден, данные и адрес отправителя помещаютсяв буфер приема сокета, связанного с управляющим блоком. В противномслучае генерируется сообщениеPORT UNREACHABLE.Функции udp_input передается целиком датаграмма, включающая заголовокзаго!ловоки данные протоколов верхнего уровня (приложений).
Помимо того что этаинформация необходима для определения адресата, по заголовку IP вычисляется кон!трольная сумма UDP. Такой подход гарантирует максимальную точность доставки данныхнужному приложению.Возможность создания таких получателей "по умолчанию" используется в сетевом супер!сервере inetd, который прослушивает все запросы и при необходимости запускает требуе!мый сервис (например FTP или Telnet). Это позволяет избежать запуска серверов без не!обходимости и тем самым сократить потребление ресурсов.www.books-shop.comсети в BSD UNIX469Передача данных от приложения инициируется системным вызовомsendto(2), который на уровне сокета преобразуется в вызов функциис запросом PRU_SEND. Если передача инициирована сис!темным вызовомто вместе с данными передается адрес получате!ля.
Если же данные были переданы с помощью системного вызова send(2),то адрес получателя определяется из управляющего блока, где он был со!хранен предшествующим вызовомФактическая передача осуществляется функциейкотораяформирует заголовок пакета, устанавливает значения его полей и вычисля!ет контрольную сумму. После этого производится вызов уже рассмотрен!ной ранее функции ip_outputКак следует из предшествующего описания TCP, этот транспортный про!токол обеспечивает гораздо более высокое качество передачи, чем UDP.Соответственно, его реализация также является гораздо более сложной. Впредыдущих разделах уже встречались различные алгоритмы, используе!мые при реализации протокола. В этом разделе мы остановимся на одномважном механизме TCP — его таймерах.Поскольку корректное функционирование протокола во многом зависитот порядка обмена управляющими сегментами, каждый канал обслужива!ется набором таймеров, позволяющих восстановить работу по тайм!ауту вслучае потери управляющих пакетов.
Эти таймеры хранятся в соответст!вующем управляющем блоке протокола TCP и, при их установке, обслу!каждые 500 миллисекунд функциейДля обеспечения передачи данных используются два таймера. Первый изних — таймер повторной передачи (retransmit timer). Этот таймер запуска!ется при передаче сегмента, если он уже не был запущен.
Если подтвер!ждение получено, и отсутствуют неподтвержденные данные — таймер ос!танавливается. Если же такие данные существуют, значение таймера при!сваивается равным начальному, и таймер запускается снова. Если значе!ние таймера становится равным нулю, наиболее старые неподтвержденныеданные передаются повторно (как минимум один полный сегмент), а тай!мер запускается снова, но уже с большим значением.
Скорость увеличениязначения таймера (timer backoff) определяется по специальной таблице иимеет экспоненциальный характер.Протоколне предусматривает предварительного установления связи с получателемданных. Поэтому, в отличие от TCP, вызовне приводит к формированиюуправляющих сообщений и обмену ими между сторонами. В данном случае он служитлишь для сохранения адреса получателя в управляющем блоке.Обслуживание таймера заключается в уменьшении установленного значения и уведомле!нии модуля, когда значение таймера становится равным нулю.Ⱦɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com470Глава 6.сети в операционнойUNIXВторой таймер — это(таймер сохранения). Этот таймер обеспе!чивает защиту от потери управляющих сообщений, содержащихзначения окна.
В случае, если отправитель готов передать данные, но анонси!рованное получателем окно слишком мало (равно нулю или меньше опреде!ленного значения), и отсутствуют неподтвержденные данные (т. е. таймер по!вторной передачи не включен), включается таймер сохранения. Если таймерсрабатывает (его значение становится равным нулю), а обновленное значениетак и не получено, отправитель передает максимально допустимый объемданных, определяемый текущим окном. Если же в этом случае значение те!кущего окна равно нулю (нулевое окно), то передается пробный сегмент(window probe), содержащий один октет данных, и таймер запускается снова.Если сообщение с обновленным значением окна было утеряно, или получа!тель по!прежнему отказывается изменить его размер, будет получено под!тверждение, содержащее текущее значение окна.
Такая ситуация, когда полу!чатель не может принимать дополнительные данные, может продлиться доста!точно долго. Например, пользователь может приостановить терминальныйвывод и уйти на обед. В этом случае отправитель будет периодически посы!лать пробные сегменты, а его окно будет по!прежнему закрыто.Следующий таймер, который мы рассмотрим, —Этоттаймер предназначен для мониторинга каналов, по которым не передают!ся данные, и которые возможно в действительности прекратили свое су!ществование, например, из!за аварийного останова одной из систем.
Еслиза определенный промежуток времени данные по каналу переданы не были,модуль TCP отправляет пробный сегмент keepalive, ожидая в ответ либоподтверждения (это означает, что задержка в передаче данных временная),либо сообщения сброса канала (RST). Если получен сегмент RST, каналбудет закрыт. Если после нескольких попыток, не будет получен отклик,канал будет уничтожен.Последний таймер из рассматриваемых, это(2MSL — двойноемаксимальное время жизни сегмента в сети). Модуль TCP запускает этоттаймер, когда производится завершение связи, и уже отправлено подтвер!ждение полученному сегменту FIN.