Скачиваний:
14
Добавлен:
01.05.2014
Размер:
317.44 Кб
Скачать

4. Протокол NetBios

На сетевом уровне обмен производится без подтверждения с помощью структур данных, называемых датаграммами.

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

К наиболее распространенным протоколам сетевого уровня относятся следующие протоколы:

IPX (Internetwork Packet Exchange) среды Novell. В прошлые годы до 70% сетей реализовали протоколы этой среды. Фактически стандартный протокол.

IP (Internet Protocol) используется в различных вычислительных средах. Очень широко распространенный протокол. История его распространения идет от сетей UNIX.

NetBIOS поддерживается в сетях IBM, Novell, Microsoft. Особенно популярен в сетях IBM.

Непосредственно передачу и прием информации осуществляют сетевые карты, установленные в компьютере.

Прикладной программе нет необходимости работать с сетевой картой напрямую. Работа осуществляется через специальные программы-драйверы.

Для вызова драйвера среда предоставляет специальный программный интерфейс в виде прерывания (int 5Ch (MSDOS)) или адреса точки входа в драйвер.

В регистры записываются данные согласно протоколу, а затем вызывается нужное прерывание или процедура.

В среде Windows используется вызов:

UCHAR Netbios(

PNCB pncb

);

Программа не формирует пакеты, которые передаются непосредственно в канал. Эти пакеты формирует коммуникационная среда, а именно, драйвер. Но он формирует их на основе информации, предоставляемой прикладной программой.

Информация драйверу предоставляется в виде структуры данных, называемой, обычно, "управляющий блок".

В управляющий блок входит:

  1. адресная информация;

  2. характер команды;

  3. адрес буферов данных;

  4. результирующие поля.

Драйвер читает содержимое управляющего блока, выполняет предписанные действия и возвращает результат выполнения операции.

Работа прикладной программы, осуществляющей обмен по сети, содержит следующие типовые этапы:

  1. инициализация;

  2. обмен данными;

  3. деинициализация.

Характер 1)-го и 3)-го этапов определяется видом протокола.

Рассмотрим в качестве примера компоненты прикладных программ, обменивающихся данными по протоколу NetBIOS. Общие идеи останутся такими же и при других протоколах.

Основой протокола NetBIOS является структура данных, называемая NCB - Network Control Block. (В протоколе IPX есть структура, служащая тем же целям ECB - Event Control Block.)

Паскалевское описание структуры NCB имеет следующий вид:

Type

TNCB = Record

Cmd : Byte; command code

CCode : Byte; error code

LocalSessionNumber : Byte; session number

NetworkNameNumber : Byte; name number

Buffer : Pointer; data buffer pointer

Size : Word; data buffer size

CallName : Array[0..15] Of Char;

OurName : Array[0..15] Of Char;self name

ReceiveTimeout : Byte; receive timeout

SendTimeout : Byte; send timeout

PostRoutine : Pointer; post-procedure addr

AdapterNumber : Byte; adapter number

FinalCCode : Byte; final error code

Reserved : Array[0..13] Of Char;reserved

End TNCB;

Cmd - код команды;

CCode - код ошибки, выдаваемый до выполнения команды;

LocalSessionNumber - номер канала для транспортного уровня;

NetworkNameNumber - номер имени станции;

Buffer - адрес буфера данных;

Size - размер буфера данных;

CallName - имя станции назначения;

OurName - собственное имя станции;

ReceiveTimeout - интервал ожидания выполнения команды приема;

SendTimeout - интервал ожидания выполнения команды передачи;

PostRoutine - адрес процедуры обратного вызова;

AdapterNumber - номер сетевой карты;

FinalCCode - код завершения команды;

Reserved - резерв для внутренних целей протокола.

В соответствие с технологией организации удаленного вызова процедур RPC все функции могут выполняться как в режиме с ожиданием, так и в асинхронном режиме.

В первом случае, вызвав процедуру драйвера, программа находится в ней до завершения операции.

Во втором случае из вызова процедуры драйвера управление сразу же возвращается в программу, а об окончании операции свидетельствует вызов коммуникационной средой процедуры обратного вызова.

Процедура обратного вызова должна удовлетворять требованиям к процедурам обработки прерываний. В принципе процедура обратного вызова может вернуть адрес NCB, по которому завершена операция, но лучше будет, если к каждому NCB привязать свою процедуру, устанавливающую флаг завершения операции.

Procedure PostProc; Interrupt;

Begin

Flag := 1;

End PostProc;

Инициализация

Инициализация включает в себя проверку наличия интерфейса NetBIOS и добавление имени станции в таблицу локальных имен.

Здесь уместно сказать о принципе адресации в протоколе NetBIOS.

Для адресации используются имена, представляющие собой строки символов размером до 16 байтов.

Для добавления имени надо передать строку с именем в поле OurName NCB и выдать команду "Добавить имя", т.е. вызвать драйвер. Драйвер выполняет команду и возвращает так называемый "номер имени", который в дальнейших операциях используется как собственный адрес.

(В протоколе IPX, например, инициализация заключается в открытии "сокета" - некоего виртуального разъема, через который осуществляется операция обмена данными.)

После добавления локального имени на каждой из станций может быть начат обмен данными.

Обмен данными

Обмен данными осуществляется с помощью команд "передать датаграмму" и "принять датаграмму".

Для передачи данных готовится NCB, в котором указаны:

  1. код команды;

  2. адрес и размер буфера с данными;

  3. номер имени;

  4. имя станции назначения;

  5. адрес процедуры обратного вызова.

Далее производится вызов драйвера, которому передан адрес этого NCB.

Для приема данных готовится NCB, в котором указаны

  1. код команды;

  2. адрес и размер буфера для приема данных;

  3. номер имени;

  4. адрес процедуры обратного вызова.

Далее производится вызов драйвера, которому передан адрес этого NCB.

Когда операция приема закончится, в поле CallName будет записано имя станции, от которой получена датаграмма.

Деинициализация

Деинициализация заключается в удалении имени из таблицы локальных имен станции.

Для этого готовится NCB, в котором указаны:

  1. код команды;

  2. удаляемое имя;

  3. адрес процедуры обратного вызова.

Далее производится вызов драйвера, которому передан адрес этого NCB. (В протоколе IPX выполняется закрытие сокета.)

Если программа, выполняемая на передающей станции, выдаст команду "передать датаграмму" раньше, чем программа, выполняемая на приемной станции, выдаст команду "принять датаграмму", то переданная датаграмма будет потеряна. Более того, приемная программа "зависнет" в ожидании приема.

Передать датаграмму

ПРД ---|----------------------

Датаграмма будет потеряна

Принять датаграмму

ПРМ --------|-----------------

Передать датаграмму

ПРД --------------|-----------

Датаграмма будет принята

Принять датаграмму

ПРМ ---|----------------------

Т.е. здесь встают те же вопросы синхронизации, что и в теории процессов, рассмотренной ранее.

Как синхронизировать выполнение двух программ, выполняющихся на различных компьютерах?

Выдавать команду передачи, если на приемной стороне не выдана команда приема бессмысленно.

Решение состоит в том, что программа должна иметь архитектуру без ожидания и всегда находиться в состоянии приема.

Шаблон такой программы может выглядеть следующим образом.

Flag := 0;

AddName;

While Flag = 0 Do ; добавление имени завершено

Flag := 0;

ReceiveDatagram;

While True Do Begin

If Flag = 1 Then Begin прием завершен

Flag := 0;

< Анализ того, что принято;>

ReceiveDatagram; снова начать прием

End If;

< Другие действия по алгоритму приложения;>

If KeyPressed Then Begin пример передачи и

Сh := ReadKey; завершения работы

Case Ch Of

's' : SendDatagram;

#27 : Break;

Else

End Case;

End If;

End While;

Flag := 0;

DeleteName;

While Flag = 0 Do ; удаление имени завершено

Программой-сервером принято называть программу, которая грузится первой из всех других программ, а затем находится в режиме ожидания приема так, как это изображено выше.

Обмен данными на транспортном уровне гарантирует прием пакетов, причем в той же очередности, что и передача пакетов.

Допускается многократная передача пакета до получения квитанции о правильном приеме.

Для обмена данными на транспортном уровне станций создается канал - логическое соединение двух станций.

Примерами протоколов транспортного уровня являются следующие: SPX (Sequenced Packet Protocol) среды Novell – надуровень протокола IPX;

TCP (Transmission Control Protocol) - надуровень протокола IP;

NetBIOS - ранее описанный протокол может быть использован и на транспортном уровне.

Работа на транспортном уровне требует к инициализации, выполняемой на сетевом уровне, добавить процедуры создания канала, а к деинициализации добавить процедуры разрушения канала.

Например, по протоколу NetBIOS инициализация должна включать следующие действия:

  1. проверка наличия NetBIOS;

  2. добавление имени к таблице локальных имен станции;

  3. создание канала.

Для создания канала программа-сервер готовит NCB и вызывает функцию "Listen", выполнение которой завершается, когда программа-клиент после проверки наличия NetBIOS и добавления имени вызовет функцию "Call".

(Аналогичные функции существуют и в протоколе SPX.)

Завершаясь, функции Listen и Call, каждая на своей стороне, возвращают в NCB в поле LocalSessionNumber номер канала, присвоенный коммуникационной средой. Этот номер используется при последующих операциях обмена данными.

Деинициализации, описанной на сетевом уровне, предшествует закрытие канала на транспортном уровне.

Для этого готовится NCB, в котором указан логический номер закрываемого канала, и вызывается функция "HangUp".

После закрытия канала удаляется имя станции и программа завершает свою работу.

Передача и прием данных осуществляются с помощью вызова специальных функций Send и Receive, в принципе, аналогично передаче и приему на уровне датаграмм.

Но существуют некоторые отличия, связанные с синхронизацией.

При создании канала устанавливаются времена таймаута, по истечению которых завершаются операции приема и передачи данных.

Причем, если при операции приема в течение таймаута не будет принят блок, например, потому, что программа на другой станции не вызывала операцию передачи блока, то операция приема заканчивается по истечению времени ожидания со специальным кодом ошибки. Но это не опасная ситуация, т.к. блок не принят потому, что он и не передавался.

Но если в течение таймаута операция Send не смогла передать блок, потому что на другой стороне не вызвана операция Receive, то эта операция Send заканчивается с такой ошибкой, что после этого дальнейшая передача становится невозможной, т.к. нарушается протокол канала (очередность доставки блоков).

Хотя вызов операции Send программой одной станции может быть теперь произведен чуть раньше, чем вызов операции Receive программой другой станции.

Структура программы, осуществляющей обмен по транспортному каналу, может выглядеть следующим образом:

Flag := 0;

AddName;

While Flag = 0 Do ; добавление имени завершено

Flag := 0;

Listen; для сервера, загружаемого первым

Call; для клиента, загружаемого вторым

While Flag = 0 Do ; создание канала завершено

Flag := 0;

Receive;

While True Do Begin

If Flag = 1 Then Begin прием завершен

Flag := 0;

< Анализ того, что принято; >

Receive; снова начать прием

End If;

< Другие действия по алгоритму приложения; >

If KeyPressed Then Begin пример передачи и

Сh := ReadKey; завершения работы

Case Ch Of

's' : Send;

#27 : Break;

Else

End Case;

End If;

End While;

Flag := 0;

HangUp;

While Flag = 0 Do ; закрытие канала завершено

Flag := 0;

DeleteName;

While Flag = 0 Do ; удаление имени завершено

К приведенным программам следует относиться как к фрагментам. В них не учитываются некоторые тонкости, например, попытка выполнить операцию с NCB, для которого не завершена предыдущая операция, приведет к ошибке.

Тем не менее, мы рассмотрели вопросы коммуникаций по протоколу NETBIOS, сделав акцент на проблеме синхронизации программ.

Соседние файлы в папке Материалы к курсу