Протокол NETBIOS
В NetWare протокол NETBIOS является надстройкой над протоколом IPX и используется для организации обмена данными между рабочими станциями.
Протокол NETBIOS реализован в виде резидентной программы NETBIOS.EXE, входящей в комплект поставки NetWare. Для обмена данными между этими резидентными программами используются пакеты IPX с номером гнезда 0х0455 и типом пакета 20.
Для идентификации рабочей станции протоколы IPX и SPX используют номер сети, адрес станции в сети и номер гнезда. Адрес станции определяется на аппаратном уровне и представляет собой число длиной 6 байтов. Номер сети занимает 4 байта. Номер гнезда выделяется динамически протоколом IPX или может быть получен в фирме Novell. Номер гнезда занимает 2 байта.
Протокол NETBIOS использует другой механизм адресации станций и программ. Для адресации станций используются имена размером 16 байтов. Каждая станция имеет одно постоянное имя (permanent name), которое образуется из аппаратного адреса добавлением к нему слева десяти нулевых байтов. Кроме постоянного имени имеются обычные имена и групповые имена, которые протокол NETBIOS позволяет добавлять (и удалять). Обычные имена служат для идентификации рабочей станции, групповые имена могут служить для посылки пакетов одновременно нескольким станциям в сети. Постоянное имя удалять нельзя, так как оно полностью определяется аппаратным обеспечением станции.
При добавлении обычного имени протокол NETBIOS опрашивает всю сеть для проверки уникальности имени. Групповое имя может быть одинаковым для нескольких станций, поэтому при добавлении группового имени опрос сети не выполняется.
После добавления новому имени присваивается так называемый номер имени (name number), который используется для передачи данных по сети.
Сравнивая методы адресации, используемые протоколами IPX/SPX и NETBIOS, можно заметить, что метод адресации протокола NETBIOS более удобен. Вы можете адресовать данные не только одной станции (как в IPX и SPX) или всем станциям сразу (как в IPX), но и группе станций, имеющим одинаковое групповое имя.
Чтобы выполнить функцию NETBIOS, в прикладной программе необходимо
Формат блока NCB представлен на рисунке 2.17.
1 | Cmd | - | код команды | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | CCode | - | код ошибки до выполнения команды | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | LocalSessionNumber | - | номер канала | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | NetworkNameNumber | - | номер имени | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | Buffer | - | дальний указатель на буфер данных | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | Size | - | длина буфера | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16 | CallName | - | имя станции-получателя | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16 | OurName | - | имя станции-отправителя | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | ReceiveTimeout | - | время ожидания завершения приёма пакета | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | SendTimeout | - | время ожидания завершения передачи пакета | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4 | PostRoutine | - | адрес POST-программы | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | AdapterNumber | - | номер сетевого адаптера | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | FinalCCode | - | код ошибки после выполнения команды | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14 | Reserved | - | рабочий буфер протокола NETBIOS |
Рассмотрим назначение полей блока NCB.
Поле Cmd содержит код команды, которую необходимо выполнить.
Поле CCode содержит код ошибки, возвращаемый после проверки параметров до выполнения команды.
Поле LocalSessionNumber содержит номер канала, установленного с другой программой. Оно используется только при выдаче команд передачи данных через каналы.
Поле NetworkNameNumber содержит номер имени, который присваивается при добавлении обычного или группового имени. Это поле должно быть заполнено при приёме датаграмм.
Поле Buffer представляет собой дальний указатель на буфер, который должен содержать данные перед выполнением передачи, или на буфер, который будет использован для приёма данных.
Поле Size определяет размер буфера, используемого для приёма или передачи данных.
В поле CallName указывается имя станции-получателя.
Поле OurName содержит имя станции-отправителя. Обычно используется в командах создания имени станции или создания канала.
Поля ReceiveTimeout и SendTimeout содержат интервал времени (измеряемый в 1/2с), в течение которого ожидается завершение соответственно команд приёма и передачи.
Поле PostRoutine - ноль или указатель на программу (POST-программу), которая получает управление после завершения команды.
Поле AdapterNumber используется, если на рабочей станции установлено несколько сетевых адаптеров (в сетях Ethernet этого обычно не бывает). В этом поле указывается номер адаптера, для которого предназначена команда. Первый адаптер имеет номер 0, второй -1 и т. д.
Поле FinalCCode содержит во время выполнения команды значение 0хFF. После завершения выполнения команды в это поле записывается ноль или код ошибки, который относится к выполнению команды в целом (в отличие от кода в поле CCode ).
Поле Reserved зарезервировано для использования протоколом NETBIOS.
Перед выполнением команды её код должен быть записан в поле Cmd блока NCB. Каждая команда NETBIOS реализована в двух вариантах: с ожиданием и без ожидания окончания выполнения команды.
Все команды NETBIOS можно разделить на несколько групп:
1. Для работы с именами:
2. Для приёма и передачи датаграмм:
3. Для работы с каналами:
4. Для приёма и передачи данных через каналы:
5. Другие команды: