Смекни!
smekni.com

Интранет сети (стр. 2 из 8)

2.3. Алгоритм маршрутизации.

Сетевая операционная система NetWare использует распределенный

адаптивный алгоритм передачи пакетов в интерсети. NetWare быстро и

эффективно реагирует на динамические изменения в топологии интер-

сети, предоставляя новые эффективные маршруты практически немед-

ленно. Управление потоком обеспечивается Протоколом Обмена После-

довательными Пакетами (Sequenced Packet Exange Protocol), рассмат-

риваемым далее.

Алгоритм маршрутизации NetWare включает в себя: 1) процесс из-

мерения и идентификации для отслеживания за топологией интерсети,

и 2) протокол рассеивания информации о сетевых характеристиках со-

ответствующего узла. Маршрутизатор выполняет измерения посредством

записи числа точек сети интернет, через которые должен пройти па-

кет от маршрутизатора (измерителя) по всем остальным маршрутизато-

рам интерсети с отметками интервала времени прохождения между ни-

ми. Таким образом отмечается количество серверов и маршрутизато-

ров, которые пакет возвращает измерителю. Серверы и маршрутизаторы

следят друг за другом посредством периодической посылки информации

о своем состоянии.

Во время инициализации каждый маршрутизатор запрашивает инфор-

мацию о маршрутах от всех других маршрутизаторов интерсети. Табли-

цы маршрутизаторов строятся во время инициализации и обновляются

по мере приема информации.

После инициализации маршрутизатор посылает широковещательно ин-

формацию о всех сетях и серверах, о которых он имеет сведения. Се-

тевая информация включает в себя номер сети, удаленность и пример-

ное время передачи 576-байтового пакета от данного маршрутизаторра

до целевой сети.

В дополнение к данной информации, маршрутизатор передает обнов-

ляющую информацию, как только изменится информация в таблице. Эти

изменения включают в себя все удаления и включения других маршру-

тизаторов и серверов в таблицу, а также изменения в расстоянии

между серверами и маршрутизаторами. Как только изменение в таблице

обнаружено, сервер/маршрутизатор немедленно отсылает информацию об

изменении во все сети, к которым он подсоединен.

Когда теряется информация о сервере или сети, маршрутизатор пы-

тается выровнять ситуацию при помощи нового маршрута, который он

вычисляет на основе своих сведений. Как только такой маршрут нахо-

дится, маршрутизатор немедленно сообщает остальным маршрутизаторам

о новом маршруте. Если альтернативный маршрут не найден, маршрути-

затор также оповещает об этом.

2.4. Протокол обмена пакетов интерсети NetWare (IPX)

IPX обеспечивает сетевой уровень Advanced NetWare дейтаграммным

интерфейсом. IPX является реализацией Xerox's Interuetwork

Datagram PacKet Protocol (IDP). Назначение IPX - дать прикладным

программам рабочей станции NetWare доступ к сетевым драйверам и

взаимодействовать напрямую с другими рабочими станциями, серверами

или устройствами интерсети.

IPX позволяет прикладной программе присылать и принимать от-

дельные пакеты интерсети. Пакеты интерсети структурированы в соот-

ветствии с определением Xerox Network Systems (XNS). В среде ин-

терсети NetWare каждый узел имеет уникальный межсетевой адрес. Ис-

пользуя IPX, рабочая станция NetWare может посылать и принимать

пакет от любой станции интерсети. Маршрутизация пакетов между уз-

лами, физически находящимися в сетях различной архитектуры, явля-

ется автоматической и прозрачной. Эта прозрачность обеспечивается

средствами маршрутизации в серверах и маршрутизаторах NetWare.

IPX-пакеты структурированы в точности как пакеты Xerox's XNS

Internet Datagram Protocol (IDP). Пакеты разбиваются на две логи-

ческие части: на заголовок и блок данных. Заголовок в свою очередь

разделен на блок управления, на блок адреса получателя и на блок

адреса отправителя.

Каждый пакет содержит длину полного пакета интерсети, который

является суммой длины блока заголовка и длока данных. Минимальной

длиной пакета принято считать 30 байтов.

Каждый пакет имеет индикатор типа сервиса, предоставляемого или

запрашиваемого данным пакетом. Xerox определяет следующие величи-

ны:

0 : неопределенный тип пакета;

1 : пакет информации о маршруте;

2 : эхо-пакет;

3 : пакет объявления об ошибке;

4 : пакет обмена пакетами;

5 : пакет протокола последовательных пакетов;

16-31 : экспериментальные протоколы.


Формат пакета обмена Интерсети (IPX)

0 1 15 ¦

г====================¬¦

Управление ¦---------T----------¦¦

¦---------+----------¦¦

¦- сеть доставки -¦¦

¦--------------------¦¦

Сетевой адрес ¦- -¦¦

доставки ¦- хост доставки -¦¦

¦--------------------¦¦Заголовок

¦ порт доставки ¦+---------

¦--------------------¦¦

¦ сеть отправителя ¦¦

¦--------------------¦¦

Сетевой адрес ¦ -¦¦

отправителя ¦- хост отправителя -¦¦

¦- -¦¦

¦--------------------¦¦

¦ порт отправителя ¦¦

L====================-¦

--

г====================¬¬

¦ ¦¦

¦ 0 -546 байтов ¦¦

¦ ¦¦Данные

¦ прозрачных данных ¦+------

¦ ¦¦

¦ ---------¦¦

¦ ¦доп.байт¦¦

L===========¦========-¦

--

Рис. 2.3.

2.5. Программный интерфейс IPX

IPX использует блок управления событиями для координации и акти-

визации определенных операций. Могут возникать два типа событий:

события, связанные с приемопередачей и события специального назна-

чения, определяемые прикладной программой. Услуги IPX по приему и

передаче включают в себя следующее:

a. открыть порт;

b. закрыть порт;

c. получить локальную цель;

d. послать пакет;

e. получить межсетевой адрес;

f. сбросить управление;

g. отсоединиться от цели.

События специального назначения управляются посредством

Asynchronons Event Sheduler (AES), встроенного в IPX. AES является

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

затраченного времени и переключения событий в соответствии с отме-

ренными интервалами времени. Программный интерфейс AES включает в

себя следующие услуги:

a. планирование события IPX;

b. подавление события;

c. планирование специального события;

d. получение маркера интервала.

Протокол IPX предназначен для использования в качестве фунда-

мента для построения сложных прикладных систем, включая серверы

связи, шлюзы или системы прямого взаимодействия.

Тест наличия IPX в памяти использует мультиплексное прерывание

2F. Ниже приводится текст функции, возвращающей 1, если IPX уста-

новлен.

void far (*ipx_spx)(void)

int ipx_installed(void)

{

union REGS regs;

struct SREGS sregs;

regs.x.ax =0x7a00;

int86x(0x2f,&regs,&regs,&sregs);

if (regs.h.al != 0xff)

return -1;

ipx_spx = MK_FP(sregs.es,regs.x.di);

return 1;

}

/*

*

*

*/

struct IPXHEADER

{

unsigned int checksum;

unsigned int length;

unsigned char transport_control;

unsigned char packet_type;

unsigned char dest_network_number [4];

unsigned char dest_network_node [6];

unsigned int dest_network_socket;

unsigned char source_network_number [4];

unsigned char source_network_node [6];

unsigned int source_network_socket;

};

struct ECB

{

void far *link_address;

void far (*event_service_routine)(void);

unsigned char in_use;

unsigned char completion_code;

unsigned int socket_number;

unsigned int connection_id; /* returned by Listen */

unsigned int rest_of_workspace;

unsigned char driver_workspace [12];

unsigned char immediate_address [ 6];

unsigned int packet_count;

struct {

void far *address;

unsigned int length;

} packet [2];

};

int ipx_spx_installed(void);

int ipx_cancel_event(struct ECB *ecb_ptr);

void close_socket(unsigned int socket);

int open_socket(unsigned int socket);

int get_local_target(unsigned char *dest_network,

unsigned char *dest_node,

unsigned int dest_socket,

unsigned char *bridge_address);

void let_ipx_breath(void);

void ipx_listen_for_packet(struct ECB *ecb_ptr);

void ipx_send_packet(struct ECB *ecb_ptr);

int get_internet_address(unsigned char connection_number,

unsigned char *network_number,

unsigned char *physical_node);

unsigned int get_1st_connection_num (char *who);

unsigned char get_connection_number(void);

void get_user_id(unsigned char connection_number,

unsigned char *user_id);

/*

* IPX.C -- helper routines for accessing IPX services

* from Turbo C.

*/

#include <stdlib.h>

#include <dos.h>

#include <mem.h>

#include <string.h>

#include <ipx.h>

void far (*ipx_spx)(void);

int ipx_spx_installed(void)

{

union REGS regs;

struct SREGS sregs;

regs.x.ax = 0x7a00;

int86x(0x2f, &regs, &regs, &sregs);

if (regs.h.al != 0xff) return -1;

ipx_spx = MK_FP(sregs.es, regs.x.di);

_BX = 0x0010;

_AL = 0x00;

ipx_spx();

if (_AL == 0x00) return 0;

return 1;

}

int ipx_cancel_event(struct ECB *ecb_ptr)

{

_ES = FP_SEG( (void far *) ecb_ptr);

_SI = FP_OFF( (void far *) ecb_ptr);

_BX = 0x0006;

ipx_spx();

_AH = 0;

return _AX;

}

void close_socket(unsigned int socket)

{

if (ipx_spx_installed() < 1) return;

_BX = 0x0001;

_DX = socket;

ipx_spx();

}

int open_socket(unsigned int socket)

{

if (ipx_spx_installed() < 1) return -1;

_DX = socket;

_BX = 0x0000;

_AL = 0xFF;

ipx_spx();

_AH = 0;

return _AX;

}

int get_local_target(unsigned char *dest_network,

unsigned char *dest_node,

unsigned int dest_socket,

unsigned char *bridge_address)

{

unsigned int temp_ax;

struct {

unsigned char network_number [4];

unsigned char physical_node [6];

unsigned int socket;

} request_buffer;

struct {

unsigned char local_target [6];

} reply_buffer;

memcpy(request_buffer.network_number, dest_network, 4);

memcpy(request_buffer.physical_node, dest_node, 6);

request_buffer.socket = dest_socket;

_ES = FP_SEG( (void far *) &request_buffer);

_SI = FP_OFF( (void far *) &request_buffer);

_DI = FP_OFF( (void far *) &reply_buffer);

_BX = 0x0002;

ipx_spx();

_AH = 0;

temp_ax = _AX;

memcpy(bridge_address, reply_buffer.local_target, 6);

return temp_ax;

}

void let_ipx_breath(void)

{

_BX = 0x000A;

ipx_spx();

}

void ipx_listen_for_packet(struct ECB *ecb_ptr)

{

_ES = FP_SEG( (void far *) ecb_ptr);

_SI = FP_OFF( (void far *) ecb_ptr);

_BX = 0x0004;

ipx_spx();

}

void ipx_send_packet(struct ECB *ecb_ptr)

{

_ES = FP_SEG( (void far *) ecb_ptr);

_SI = FP_OFF( (void far *) ecb_ptr);

_BX = 0x0003;

ipx_spx();

}

int get_internet_address(unsigned char connection_number,

unsigned char *network_number,

unsigned char *physical_node)

{

union REGS regs;

struct SREGS sregs;

struct {

unsigned int len;

unsigned char buffer_type;

unsigned char connection_number;

} request_buffer;

struct {

unsigned int len;

unsigned char network_number [4];

unsigned char physical_node [6];

unsigned int server_socket;

} reply_buffer;

regs.h.ah = 0xe3;

request_buffer.len = 2;

request_buffer.buffer_type = 0x13;

request_buffer.connection_number = connection_number;

reply_buffer.len = 12;

regs.x.si = FP_OFF( (void far *) &request_buffer);

sregs.ds = FP_SEG( (void far *) &request_buffer);

regs.x.di = FP_OFF( (void far *) &reply_buffer);

sregs.es = FP_SEG( (void far *) &reply_buffer);

int86x(0x21, &regs, &regs, &sregs);

memcpy(network_number, reply_buffer.network_number, 4);

memcpy(physical_node, reply_buffer.physical_node, 6);

regs.h.ah = 0;