Протокол IPX

Протокол IPX является протоколом третьего уровня без поддержки соединения, предназначенным для передачи дейтаграмм. Компания Novell адаптировала его из старого протокола межсетевых дейтаграмм (протокол IDP) стека Xerox (XNS).
Протокол без соединения
Поскольку он является протоколом без поддержки соединения, то когда процесс, выполняющийся на определенном узле, использует IPX для коммуникации с процессом на другом узле, между двумя узлами не устанавливается соединение. Таким образом, пакеты IPX адресуются и посылаются к своему месту назначения, но нет гарантии или проверки успешной доставки. Любое подтверждение пакета или управление соединением обеспечиваются протоколами выше IPX, такими как SPX. Термин дейтаграмма означает, что каждый пакет интерпретируется как отдельная сущность, не имеющая логической или последовательной связи с любым другим пакетом.
Работа на сетевом уровне модели 0SI
Как протокол сетевого уровня IPX адресует и маршрутизирует пакеты из одного местоположения в другое при межсетевом обмене IPX. IPX принимает решения о маршрутизации, просматривая поля адресов заголовка и на основе информации, которую он получает из RIP или NLSP. IPX использует эту информацию для пересылки пакетов в их узел назначения или следующему маршрутизатору, предоставляющему путь к узлу назначения.
Структура пакета
Так как протокол IPX был адаптирован из старого протокола XNS ГОР, не удивительно, что их структуры похожи. Пакет IPX состоит из двух частей. Первая часть является 30-байтовым заголовком, который содержит адреса сети, узла и сокета для машин источника и места назначения. Вторая часть является разделом данных, который иногда содержит заголовок протокола более высокого уровня, такого как SPX. Минимальный пакет IPX имеет 30 байтов (не считая заголовок MAC). Максимальный размер маршрутизированных пакетов IPX обычно имеет только 576 байтов, включая заголовок IPX и нагрузку данных. Однако при использовании IPX II это число возрастает до 1500 байтов.
Как было отмечено в главе 2 о TCP, сетевой уровень следует за заголовком MAC, поэтому IPX помещается после заголовка MAC и перед полезной нагрузкой. На рис. 3.2 показано, что заголовок IPX помещается внутри протокола MAC таким же образом, как описано в главе 2.

Структура заголовка IPX

Рассмотрим структуру заголовка IPX. Он состоит из следующих полей:
контрольная сумма (checksum) длина пакета (packet length)
• управление транспортом (transport control)
• тип пакета (packet type)
• сеть назначения (destination network)
• узел назначения (destination node)
• сокет назначения (destination socket)
• сеть источника (source network)
• узел источника (source node)
• сокет источника (source socket)
Контрольная сумма Поле контрольной суммы используется для обеспечения целостности пакета. Контрольная сумма используется новыми версиями Netware, так как 3.x и более ранние версии задают поле как OxFFFF и не используют контрольную сумму.
Длина пакета Поле длины пакета является длиной заголовка IPX плюс длина данных в байтах. Длина пакета должна быть не менее 30 байтов, чтобы предоставить достаточно места для заголовка IPX.
Управление транспортом Управление транспортом является числом маршрутизаторов, которые пересек пакет на пути к месту назначения. Посылающие узлы при создании пакета IPX всегда задают это поле как ноль. Когда маршрутизатор получает пакет, требующий дальнейшей маршрутизации для достижения конечного места назначения, значение поля увеличивается на единицу и пакет передается дальше.
Тип пакета Поле типа пакета указывает вид службы, которая либо предлагается, либо требуется пакету. В таблице 3.2 перечислены некоторые часто используемые типы пакетов, которые могут встретиться в трассировках сетей.
Сеть назначения Сеть назначения является номером сети, к которой присоединен узел назначения. Когда посылающий компьютер задает это поле как 0x0, предполагается, что узел назначения находится в том же сетевом сегменте, что и посылающий узел.
Существует особый случай, когда рабочая станция посылает широковещательные запросы протоколов маршрутизации SAP — Get Neareast Server (Найти ближайший сервер) и RIP — Get Local Target (Найти локального получателя) (или Route Request — Запрос маршрута) во время инициализации. Так как рабочая станция еще не знает, к какой сети принадлежит, она задает поля сети источника и сети назначения как 0 для этих запросов. Когда маршрутизатор получает один из этих запросов, он посылает ответ непосредственно посылающей рабочей станции, заполняя поля сети источника и сети назначения соответствующими сетевыми номерами.
В дополнение к сетевому номеру 0 номера OxFFFFFFFF и OxFFFFFFFE зарезервированы для специальных целей. В связи с этим они не должны назначаться никакой сети IPX. Дополнительную информацию о зарезервированных сетевых номерах можно найти ниже в разделе о зарезервированных номерах.
Узел назначения Поле узла назначения содержит физический адрес узла назначения. Узел в сети Ethernet будет использовать все шесть байтов этого поля для определения своего адреса. Некоторые другие методы доступа к сети могут использовать здесь меньше шести байтов. Адрес узла OxFFFFFFFFFFFF (т.е. шесть байтов по OxFF) посылает пакет всем узлам в сети назначения.
Сокет назначения Поле сокета назначения является адресом сокета процесса назначения пакета. Эти сокеты будут направлять пакеты в различные процессы внутри одной машины.
Сеть источника Поле сети источника является номером сети, к которой присоединен узел источника. Если посылающий узел задает это поле равным нулю, это означает, что локальная сеть машины источника неизвестна. Для маршрутизаторов правила, применяемые к полю сети назначения, также применимы к полю сети источника, за исключением того, что маршрутизаторы могут пересылать полученные пакеты, у которых это поле задано как ноль.

Узел источника

Поле узла источника — это адрес MAC узла источника. Адреса широковещания недопустимы.
Сокет источника Сокет источника — это адрес процесса, передающего пакет. Процессам, общающимся при равноправном соединении узлов, не требуется посылать и получать один и тот же номер сокета. В сети рабочих станций и серверов сервер обычно "ожидает" на определенном сокете запросы на обслуживание. В таком случае сокет источника не обязательно тот же самый или вообще имеет значение. Важно только, чтобы сервер ответил сокету источника. Например, все файловые серверы NetWare имеют один и тот же адрес сокета, но запрос к ним может исходить из сокета с любым номером.
Номера сокетов источников следуют тем же соглашениям, что и сокеты места назначения.
Заголовки протоколов более высокого уровня Заголовки протоколов более высокого уровня принадлежат таким Протоколам, как NCP или SPX. Они часто встречаются в части данных пакета IPX.
Адресация IPX
Теперь рассмотрим адресацию IPX. Как показано в таблице 3.3, IPX имеет свою собственную адресацию узлов (для внутрисетевой работы) и внутриуз-ловую адресацию. Для адресации узла IPX использует адрес MAC, который был присвоен карте сетевого интерфейса производителем самой карты.
Сетевой адрес IPX уникальным образом идентифицирует сервер IPX в сети IPX и отдельные процессы внутри сервера. Адрес IPX является 12-байтовым шестнадцатеричным числом, которое можно разделить на три части. Первая часть адреса IPX — самая длинная, это шестибайтовый аппаратный адрес сетевого адаптера. Последняя часть является двухбайтным номером сокета, который используется для ссылки на реальный выполняющийся на машине процесс. В таблице 3.3 показано, как выглядит этот адрес.
Каждый номер в адресе IPX содержится в поле в заголовке IPX и представляет сеть источника или места назначения, узел или сокет. Сетевой номер используется только для операций сетевого уровня, а именно, маршрутизации. Номер узла используется для локальной (или в том же сегменте) передачи пакетов. Номер сокета направляет пакет в процесс, действующий внутри узла.
Каждый адресный компонент описывается в следующих разделах.

Как работает маршрутизация IPX

Когда соединяются различные сетевые сегменты IPX, инструкции для маршрутизации пакетов между этими сегментами приходят из протокола IPX. IPX выполняет эти функции уровня 3 с помощью RIP, SAP и NLSP.
Если две рабочие станции находятся в одном сетевом сегменте, посылающая рабочая станция посылает пакеты прямо по физическому адресу рабочей станции назначения (т.е. по адресу MAC). Если две рабочие станции находятся в двух различных сетевых сегментах, то первая рабочая станция должна найти маршрутизатор в своем собственном сегменте, который знает, как переслать пакеты внешнему сегменту.
Чтобы найти этот крайне важный маршрутизатор, рабочая станция будет посылать широковещательный пакет RIP, запрашивающий самый быстрый маршрут к сегменту назначения. Маршрутизатор того же сегмента с самым коротким путем к сегменту назначения ответит на запрос. В пакете ответа маршрутизатор включит в заголовок IPX свой собственный сетевой и узловой адрес.
Очевидно, что если посылающим узлом является маршрутизатор, а не рабочая станция, то ему не нужно будет посылать широковещательное сообщение RIP, чтобы получить эту информацию. Вместо этого маршрутизатор берет информацию из внутренней таблицы маршрутизации.
Когда посылающая рабочая станция получит адрес маршрутизатора, она посылает пакеты рабочей станции назначения, помещая полный адрес IPX места назначения (т.е. сеть, узел и номер сокета) в поле места назначения заголовка IPX, как это было показано ранее в этой главе.
Затем посылающая рабочая станция помещает свой собственный полный адрес IPX в соответствующее поле источника заголовка IPX. Посылающая рабочая станция заполнит также все другие поля в заголовке. Например, она поместит адрес узла маршрутизатора, который ответил на запрос RIP в поле адреса места назначения заголовка MAC. Она поместит свой собственный адрес в поле адреса источника заголовка MAC.
Посылающая рабочая станция отправляет, наконец, пакет маршрутизатору, который должен теперь выполнить несколько задач. В первую очередь маршрутизатор просматривает поле контроля транспорта заголовка пакета IPX. Маршрутизатор RIP будет отбрасывать пакет, если это поле больше 16. Маршрутизатор NLSP будет отбрасывать полученный пакет, если это число больше, чем ограничение числа переходов.
После этого маршрутизатор проверяет поле типа пакета заголовка IPX. Если он видит в этом поле 20 (0x14), это указывает на пакет NetBIOS. Он должен также посмотреть поле контроля транспорта. Если это значение равно восьми или больше, маршрутизатор отбрасывает пакет, так как пакет NetBIOS ограничен восьмью переходами (или сетями).
Затем маршрутизатор сравнивает сетевой номер в пакете с сетевым номером сегмента, в который прибыл пакет. Если маршрутизатор обнаружит совпадение, то он отбрасывает пакет, чтобы избежать зацикливания. Если сетевой номер не совпадает, то он помещает сетевой адрес в следующее доступное поле сетевого номера. Он увеличивает поле контроля транспорта и посылает пакет всем напрямую соединенным сетевым сегментам, которые не присутствуют в полях сетевых номеров.
Теперь маршрутизатор проверяет поля адреса назначения, чтобы определить, как направить пакет. Если пакет адресован маршрутизатору, соответствующий процесс сокета обработает его внутренне; иначе маршрутизатор пересылает пакет. В дополнение к пакетам, непосредственно адресованным маршрутизатору, он должен также иметь дело с OxFFFFFFFFFFFF, которые обычно являются пакетами RIP, SAP или диагностики.
Если пакет необходимо переслать, маршрутизатор помещает адрес места назначения из заголовка IPX в поле адреса места назначения заголовка MAC. Затем маршрутизатор помещает свой собственный адрес в поле адреса источника заголовка MAC, увеличивает поле контроля транспорта заголовка IPX и пересылает пакет в сегмент назначения. Если, однако, поле контроля транспорта равно максимально допустимому числу переходов до того, как поле будет увеличено, маршрутизатор отбрасывает пакет. Для маршрутизаторов RIP это число равно 16, для маршрутизаторов NLSP это ограничение задается в диапазоне от 8 до 127.
Широковещательные пакеты никогда повторно не посылаются в сетевые Сегменты, из которых они были получены. Если маршрутизатор не связан напрямую с сегментом, в котором находится узел конечного места назначения, он посылает пакет следующему маршрутизатору на пути к узлу назначения, помещая адрес узла следующего маршрутизатора в поле адреса места назначения заголовка MAC. Маршрутизатор берет эту информацию в своей информационной таблице маршрутизации и затем помещает адрес своего собственного узла в поле адреса источника заголовка MAC, увеличивает поле контроля транспорта в заголовке IPX и пересылает пакет следующему маршрутизатору.
NCP Каждый NCP известен прежде всего по своему номеру, который состоит из трех полей. Например, номер для изменения пароля объекта связывания равен 0x2222 23 64.
• Первое двухбайтовое поле "0x2222" является полем категории службы.
• Второе число "23" является номером функции, который идентифицирует, где в таблице коммутации существует базовая функция.
• Третье поле "64" идентифицирует специальную функцию NCP, которая выполняется.
Номера NCP делятся на широкие функциональные категории. Например, большинство функций номера 23 являются NCP учета, связывания, соединения или файлового сервера. В таблице 3.6 перечислены некоторые из категорий служб NCP.
Категория NCP запроса службы (0x2222) и категория NCP ответа службы (0x3333) используются наиболее часто. Существуют две категории служб, которые не требуют создания пакетов ответа службы (0x3333). Это разрушение служебного соединения (0x5555) и запрос разбиения пакета (0x7777).
Если клиенту посылается сообщение, что предыдущий запрос все еще обрабатывается (0x9999), это означает, что клиент сделал другой запрос или снова послал тот же запрос, в то время как сервер все еще обрабатывает последний, сделанный тем же клиентом, запрос.
Клиент посылает через соединение с сервером сообщение, которое содержит все параметры NCP, используя сетевой протокол, например IPX. Сервер выполняет процедуру и возвращает результаты клиенту. Каждое дополнительное сообщение увеличивает идентификационные номера в пакете. Когда от клиента получен запрос NCP, создается ответ NCP. Это протокол, действующий по принципу один запрос — один ответ.

Редиректор клиентской машины

Основная функция редиректора клиентской машины — форматирование удаленных запросов таким образом, который будет понятен машине места назначения, и отправка их по сети. Редиректор использует структуру БМВ в качестве стандартного средства перемещения для отправки и ответа на запросы редиректора. Каждый заголовок БМВ содержит код команды (определяющий задачу, выполнение которой редиректор хочет поручить удаленной станции) и несколько полей окружения и параметров (которые определяют, как команда должна выполняться). Кроме того, в заголовке SMB последнее поле в SMB может содержать до 64Кбайт данных, посылаемых на удаленную станцию.
Read SMB (запрос) Команда read SMB (иногда называемая командой чтения диапазона байтов) приказывает серверу прочитать определенный диапазон байтов из дискового файла. Она также включает дескриптор фаи ла, число байтов для чтения и т.д. Сдвиг файла основывается на "указателе поиска", который хранится редиректором локально для файла. Серверный указатель поиска для этого дескриптора файла недействителен в данном случае, так как множество процессов удаленных рабочих станций могут обращаться к одному серверу, используя системный дескриптор файла.
Параметр "est'd total" (оценка общего числа байтов для чтения, включая прочитанные этим запросом) является необязательным. Сервер может использовать эту информацию для упреждающего чтения или для оптимизации выделения буферов.
Read SMB (ответ) Ответ на Read SMB несет с собой запрошенные данные. Мультиплексный идентификатор (MID) помечает ответ SMB для соответствующего запроса SMB.
Вот как работает этот процесс:
• Программа посылает запрос ввода-вывода операционной системе через вызов интерфейса прикладного программирования (API).
• Операционная система (или редиректор с помощью прерывания "int21") определяет, что запрос предназначен для удаленного ресурса, и передает его редиректору.
• Редиректор форматирует запрос ввода-вывода как запрос SMB и посылает его по сети на сервер.
• Сервер получает SMB и посылает запрос ввода-вывода локальной операционной системе сервера.
• Сервер форматирует данные ответа SMB. Данные возвращаются, если выполнена операция чтения, или возвращается код, если выполнена операция записи. Сервер посылает их по сети запрашивающей рабочей станции.
• Редиректор передает ответ в операционную систему.
• Операционная система передает ответ вызывающему приложению.