Реферат: Интранет сети

--PAGE_BREAK--

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

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

    затор также оповещает об этом.
        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,®s,®s,&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, ®s, ®s, &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, ®s, ®s, &sregs);
        memcpy(network_number, reply_buffer.network_number, 4);

        memcpy(physical_node,  reply_buffer.physical_node,  6);

        regs.h.ah = 0;

            продолжение
--PAGE_BREAK--return regs.x.ax;

        }
unsigned int    get_1st_connection_num (char *who)

        {

        union REGS      regs;

        struct SREGS    sregs;
        struct  {

                unsigned int    len;

                unsigned char   buffer_type;

                unsigned int    object_type;

                unsigned char   name_len;

                unsigned char   name [47];

                } request_buffer;
        struct  {

                unsigned int    len;

                unsigned char   number_connections;

                unsigned char   connection_num [100];

                } reply_buffer;
        regs.h.ah = 0xe3;
        request_buffer.len = 51;

        request_buffer.buffer_type = 0x15;

        request_buffer.object_type = 0x0100;

        request_buffer.name_len    = (unsigned char) strlen(who);

        strcpy(request_buffer.name, who);
        reply_buffer.len = 101;
        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, ®s, ®s, &sregs);
        if (regs.h.al != 0) return 0;

        if (reply_buffer.number_connections == 0) return 0;
        regs.h.ah = 0;

        regs.h.al = reply_buffer.connection_num[0];

        return regs.x.ax;

        }
unsigned char get_connection_number(void)

        {

        _AH = 0xDC;

        geninterrupt(0x21);

        return _AL;

        }
void    get_user_id(unsigned char connection_number,

                    unsigned char *user_id)

        {

        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   object_id[4];

                unsigned char   object_type[2];

                char            object_name[48];

                char            login_time[7];

                } reply_buffer;
        regs.h.ah = 0xe3;

        request_buffer.len = 2;

        request_buffer.buffer_type = 0x16;

        request_buffer.connection_number = connection_number;
        reply_buffer.len = 61;
        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, ®s, ®s, &sregs);
        strncpy(user_id, reply_buffer.object_name, 48);

        }
       2.6. Протокол последовательного обмена пакетами NetWare (SPX)
       Протокол обмена последовательными пакетами  (SPX)  строится  на

    основе IPX и предлагает дополнительные  услуги  Xerox's  Sequenced

    Packet Protocol (SPP). SPX дает возможность  прикладным программам

    рабочей станции NetWare получать  некоторые  преимущества  при ис-

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

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

    тельной гарантией достоверности и последовательности пакетов.

       Внутренне SPX построен на дейтаграммных примитивах IPX  и  дает

    простой интерфейс, ориентированный на установление соединения.

       В дополнение к структуре IPX, SPX включает 12 байтов  блока уп-

    равления соединения.
               2.7. Программный интерфейс SPX
       В дополнение к программному интерфейсу IPX,  SPX  предоставляет

    следующие функции:
               a. проверка установки SPX;

               b. установка соединения;

               c. прослеживание соединения;

               d. окончание соединения;

               e. разрыв соединения;

               f. получение состояния соединения;

               g. посылка последовательного пакета;

               h. прослушивание (ожидание) последовательного пакета.
       Эти функции управляют установкой, поддержанием,  cбросом соеди-

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

    вать свои собственные схемы тайм-аутов  для  гарантирования воста-

    новления по обрыву установленного  соединения,  посылки последова-

    тельного пакета или по запросу об окончании соединения.




                            Формат пакета протокола SPX

                              0 1                15 ¦

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

                              ¦ контрольная сумма  ¦¦

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

                              ¦      длина         ¦¦

                              ¦---------T----------¦¦

                              ¦упр.транс¦тип пакетদ

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

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

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

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

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

                              ¦--------------------¦¦Уровень 1

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

                              ¦--------------------¦¦адресация

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

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

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

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

                              ¦-                  -¦¦

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

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

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

                                                   -+

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

                              ¦упр.соедин¦тип потоꦦ

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

                              ¦идент.источ.соединен¦¦

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

                              ¦идент. приемника    ¦¦Уровень 2

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

                              ¦  номер пакета      ¦¦протокол

                              ¦--------------------¦¦последова-

                              ¦номер подтверждения ¦¦тельных

                              ¦--------------------¦¦пакетов

                              ¦  номер размещения  ¦¦

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

                                                   --

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

                              ¦    0 — 546 байтов  ¦¦Уровень 3

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

                              ¦ прозрачных данных  ¦¦управление

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

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

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

                                                   --

                              гTTT======T==========¬

                              ¦¦¦¦резерв¦тип потока¦

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

                              ¦¦¦¦конец сообщения

                              ¦¦¦внимание

                              ¦¦посылка подтверждений

                              ¦системный пакет

                                        Рис.2.4





               2.8. Управление потоком SPX
       Управление потоком является  средством,  позволяющим  уменьшить

    количество повторных передач пакетов. В таких случаях,  когда про-

    исходит тайм-аут без успешного подтверждения, SPX  выполняет опти-

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

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

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

    тетистикам соответствующих сетевых устройств.  SPX  использует эв-

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

    чества повторов, адаптируясь под время задержки пакетов.

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

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

    кационные серверы, шлюзы и  системы  пересылки  сообщений  рабочих

    станций интерсети.
                2.9. Протокол объявления услуг
       Создавая открытую архитектуру, фирма Novell открывает разработ-

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

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

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

    воляет сетевым сервисным программам объявлять свои услуги по имени

    и типу интерсети NetWare.

       Серверы, использующие этот протокол, имеют свое имя, тип серви-

    са и адрес интерсети, та же самая информация существует  в маршру-

    тизаторах NetWare.

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

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

    всех серверов любого типа, всех серверов специфического  типа  или

    только ближайшего сервера конкретного  типа  услуг.  Дополнительно

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

    адресов всех серверов данного конкретного типа.

       Весь этот  механизм  известен  как  протокол  объявления  услуг

    (SAP). Каждый сервер определенного типа имеет  заданное уникальное

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

    ный тип и определять желаемый сервер по имени, а не по  адресу ин-

    терсети.




               3. ПРОТОКОЛЫ  TCP/IP
               Соотношение пpотоколов TCP/IP и Модели Откpытых Систем
               Уpовни МОС                        Пpотоколы TCP/IP
          ------------------¬     --------T----T-----T-----T---------¬

          ¦                 ¦     ¦       ¦    ¦     ¦     ¦         ¦

          ¦Пpикладной       ¦     ¦Telnet ¦FTP ¦TFTP ¦SMTP ¦   DNS   ¦

          ¦                 ¦     ¦       ¦    ¦     ¦     ¦         ¦

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

          ¦                 ¦     ¦       ¦    ¦     ¦     ¦         ¦

          ¦Пpедставительный ¦     ¦       ¦    ¦     ¦     ¦ Дpугие  ¦

          ¦                 ¦     ¦       ¦    ¦     ¦     ¦         ¦

          +-----------------+     +-------+----+---T-+-----+---------+

          ¦                 ¦     ¦                ¦                 ¦

          ¦Сеансовый        ¦     ¦         TCP    ¦       UDP       ¦

          ¦                 ¦     ¦                ¦                 ¦

          ¦                 ¦     ¦                ¦                 ¦

          ¦                 ¦     ¦                ¦                 ¦

          ¦Тpанспоpтный     ¦     ¦                ¦                 ¦

          ¦                 ¦     ¦                ¦                 ¦

          +-----------------+     +-------T--------+T----------------+

          ¦                 ¦     ¦ IP    ¦   ICMP  ¦ ---------------+

          ¦Сетевой          ¦     ¦       L---------- ¦  ARP    RARP ¦

          ¦                 ¦     ¦                   ¦              ¦

          +-----------------+     +----------T--------+--T-----------+

          ¦                 ¦     ¦          ¦           ¦           ¦

          ¦Канальный        ¦     ¦          ¦           ¦           ¦

          ¦                 ¦     ¦Ethernet  ¦Token Ring ¦ Дpугие    ¦

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

          ¦                 ¦     ¦          ¦           ¦           ¦

          ¦Физический       ¦     ¦          ¦           ¦           ¦

          ¦                 ¦     ¦          ¦           ¦           ¦

          L------------------     L----------+-----------+------------
                                    Рис.3.1.
       Уровневая структура модели позволяет разработчикам сетей сосре-

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

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

    сети. Разработчикам нужно знать сервисы, которые должны быть обес-

    печены вышележащему уровню, какие сервисы нижележащего уровня дос-

    продолжение
--PAGE_BREAK--    тупны, и какие протоколы модели обеспечивают эти сервисы.

       Сумму уровней протокольного набора часто  называют протокольным

    стеком (protocol stack) — см. pис .3.2.

       Таблица иллюстрирует некоторые  из  наиболее  общих  протоколов

    TCP/IP и сервисы, обеспечиваемые ими.

       Каждый уровень протокольного стека исходного компьютера взаимо-

    действует с соответствующим уровнем компьютера-адресата как равный

    с равным. С точки зрения программного обеспечения или пользователя

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




               Пpотоколы TCP/IP
               Хост-ЭВМ — источник                Хост-ЭВМ — адpесат
          ---------------¬                      --------------¬

          ¦ Пpикладной   ¦                      ¦ Пpикладной  ¦

          ¦              ¦                      ¦             ¦

          L-------T-------   сообщения или      L------T-------

                  ¦ ----------    потоки    -----------¦

           -------+------¬                      -------+------¬

           ¦Тpанспоpтный ¦                      ¦Тpанспоpтный ¦

           ¦             ¦                      ¦             ¦

           L------T-------  дейтагpаммы (UDP)   L------T-------

                  ¦ — или сегменты (TCP) ------¦

           -------+------¬                      -------+------¬

           ¦Межсетевой   ¦                      ¦ Межсетевой  ¦

           ¦(Интеpсеть)  ¦                      ¦  (Интеpсеть)¦

           L------T-------                      L------T-------

                  ¦ — дейтагpаммы IP -------  ¦

           -------+------¬                      -------+------¬

           ¦Сетевой      ¦                      ¦ Сетевой     ¦

           ¦интеpфеис    ¦                      ¦ интеpфейс   ¦

           L------T-------                      L------T-------

                  ¦ — кадpы сети — ¦

                  ¦                                    ¦

                  ¦                                    ¦

                  ¦       -----------------------¬     ¦

                  L-------+ Сетевая аппаpатуpа   +------

                          L-----------------------
                                 Рис.3.2.
       уровни посылают свои пакеты непосредственно друг другу.

       Например, прикладная программа, посылающая файлы  с использова-

    нием TCP, выполняет следующие операции:

       — прикладной уровень передает поток байтов транспортному уровню

    на исходном компьютере; — транспортный уровень делит поток на сег-

    менты TCP, добавляя заголовок с последовательным  номером сегмента

    и передает сегмент межсетевому уровню (Internet-IP);

       — уровень IP создает пакет с порцией данных, содержащий сегмент

    TCP. Уровень добавляет заголовок пакета, содержащий  адреса источ-

    ника и получателя IP. Уровень определяет  также  физический  адрес

    компьютера — адресата или промежуточных компьютеров на пути к узлу

    — адресату и передает пакет уровню логической связи;

       — уровень звена данных передает пакет IP в порции  данных кадра

    уровня звена данных компьютеру — адресату. Здесь может иметь место

    направление пакета IP промежуточными системами;

       — на компьютере — адресате уровень звена данных удаляет заголо-

    вок уровня звена данных и передает пакет IP уровню IP;

       — уровень IP проверяет заголовок пакета  IP.  Если  контрольная

    сумма, содержащаяся в заголовке, не совпадает  с  контрольной сум-

    мой, вычесленной уровнем IP, пакет уничтожается;

        — если контрольные суммы совпадают, уровень IP удаляет




                   Набоp пpотоколов TCP/IP
           ------------------------T---------------------------------¬

           ¦     Пpотокол          ¦            Сеpвис               ¦

           +-----------------------+---------------------------------+

           ¦                       ¦                                 ¦

           ¦Internet Protocol (IP) ¦ Межсетевой пpотокол обеспечивает¦

           ¦                       ¦ сеpвис доставки пакетов между   ¦

           ¦                       ¦ узлами                          ¦

           ¦                       ¦                                 ¦

           ¦Internet Control       ¦ Межсетевой пpотокол упpавления  ¦

           ¦Message Protocol (ICMP)¦ сообщениями упpавляет пеpедачей ¦

           ¦                       ¦ упpавляющих сообщений и сообще- ¦

           ¦                       ¦ ний об ошибках между хост-ЭВМ и ¦

           ¦                       ¦ шлюзами                         ¦

           ¦                       ¦                                 ¦

           ¦Address Resolution     ¦ Пpотокол  pазpешения адpесов    ¦

           ¦Protokol (ARP)         ¦ мапиpует межсетевые адpеса в    ¦

           ¦                       ¦ физические                      ¦

           ¦                       ¦                                 ¦

           ¦Reverse Address        ¦ Обpатный пpотокол pазpешения    ¦

           ¦Resolution Protocol    ¦ адpесов мапиpует физические     ¦

           ¦(RARP)                 ¦ адpеса в интеpсетевые           ¦

           ¦                       ¦                                 ¦

           ¦Transmission  Control  ¦ Пpотокол упpавления пеpедачей   ¦

           ¦Protocol (TCP)         ¦ обеспечивает сеpвис  надежной   ¦

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

           ¦                       ¦ тами                            ¦

           ¦                       ¦                                 ¦

           ¦User Datagram          ¦ Пользовательский дейтагpаммный  ¦

           ¦Protocol (UDP)         ¦ пpотокол обеспечивает ненадеж-  ¦

           ¦                       ¦ ный сеpвис доставки пакетов без ¦

           ¦                       ¦ установления соединения между   ¦

           ¦                       ¦ клиентами                       ¦

           ¦                       ¦                                 ¦

           ¦File Transfer          ¦ Пpотокол тpанспоpта файлов      ¦

           ¦Protocol (FTP)         ¦ обеспечивает услуги тpанспоpта  ¦

           ¦                       ¦ файлов пользовательского уpовня ¦

           ¦                       ¦                                 ¦

           ¦Telnet                 ¦ Эмуляция теpминала              ¦

           ¦                       ¦                                 ¦

           L-----------------------+----------------------------------
       заголовок пакета IP и передает сегмент TCP уровню  TCP. Уровень

    TCP проверяет последовательный номер для определения — является ли

    данный сегмент корректным в последовательности;

       — уровень TCP подсчитывает контрольную сумму для  заголовка TCP

    и данных. Если вычесленная и принятая в заголовке контрольные сум-

    мы не совпадают, уровень TCP уничтожает сегмент.  Если контрольная

    сумма корректна и номер сегмента соответствует последовательности,

       уровень TCP посылает положительное подтверждение на компьютер -

    источник;

       — на компьютере — адресате уровень TCP удаляет заголовок  TCP и

    передает полученные байта из сегмента прикладной программе;

       — прикладная программа на компьютере — адресате  получает поток

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

    программой на компьютере — испточнике.
               3.1. Физические адреса и межсетевые адреса.
       На уровне звена данных узлы в сети  взаимодействуют  с  другими

    узлами сети, используя адреса, специфичные для данной сети. Каждый

    узел имееет физический адрес для аппаратуры выхода  в  сеть. Физи-

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

    физический адрес в Ethernet является 6-байтным числовым значением,

    таким как 08-00014-57-69-69. Это значение назначается производите-

    лем аппаратуры. Сети X.25 используют стандарт X.121 физических ад-

    ресов длиной в 14 цифр. Сети LocalTalk используют  3байтовые адре-

    са, состоящие из 2-байтового номера сети и 1-байтового  номера уз-

    ла. В сети LocalTalk номер сети статический, а номер узла назнача-

    ется динамически при запуске узла.

       Адрес Межсетевого Протокола (адрес IP) для узла  является логи-

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

    и имеет одну и туже форму независимо от типа  сети.  Это  4байтное

    (32 бита) числовое значение, которое идентифицирует как  сеть, так

    и локальный узел (компьютер или другое устройство) в  данной сети.

    4-байтовый адрес  IP  обычно  представляется  десятичными  числами

    (каждый байт), разделяемыми точками, например, 129.47.6.17. Иногда

    адреса представляются шестнадцатеричными цифрами.

       Узлы, использующие протоколы TCP/IP, транслируют  адреса назна-

    чения IP в физические адреса аппаратуры подуровня доступа  к пере-

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

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

    пакете. Принимающая программа может послать  ответ  источнику, ис-

    пользуя адрес IP источника из пакета.

       Поскольку адреса IP не зависят от конкретного  типа  сети,  они

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

    гую сеть. В каждом типе сети программное обеспечение TCP/IP ставит

    в соответствие физические адреса сети и адреса IP. Если  пакет пе-

    редается в другую сеть, адрес IP получателя транслируется  в физи-

    ческий адрес соответствующей сети.

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

               — если Вы хотите соединить Вашу сеть с Интерсетью DARPA, Вы

          должны получить  зарегистрированный адрес  Интерсети в следующей

       организации: DDN Network Information Center  SRI  International

    333 Ravenswood Avenue, Room EJ291 Menlo Park, CA 94025 USA  — если

    Ваша сеть не является частью Интерсети DARPA, Вы можете

       выбрать произвольный сетевой адрес. При этом для всех  узлов  в

    сети должны быть выполнены следующие требования:

       — сетевая часть каждого адреса  должна  соответствовать  адресу

    сети, например, все узлы в сети 129.47 должны  использовать адреса

    сети 129.47;

       — адрес IP для каждого узла должен быть уникальным внутри Вашей

    сети.
               3.2. Трансляция межсетевых адресов в физические
       Когда пакет IP передается по сети, он прежде всего включается в

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

    показан пакет IP, включенный в кадр Ethernet.  Пакет  IP  содержит

    межсетевой адрес узла, но кадр

       Ethernet должен иметь физический адрес узла, чтобы быть достав-

    ленным по сети. Следовательно, посылающий узел должен быть в сост-

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

    су IP, содержащемуся в пакете IP.

       Адрес IP отображается в физический адрес с  использованием Про-

    токола Разрешения Адресов (ARP) на широковещательных  сетях, таких

    как Ethernet, Token Ring, ARCnet. Когда узел должен  послать пакет

    IP он должен определить какой физический адрес в сети соответству-

    ет адресу получателя IP, заданному в пакете IP. Для нахождения фи-

    зического адреса узел посылает широковещательный пакет ARP, содер-

    жащий адрес IP получателя. После этого пакета ожидается  ответ  от

    узла с данным адресом IP получателя. Узел с этим  адресом посылает

    свой физический адрес назад запрашивающему узлу.

       Для быстрой передачи  пакетов  и  уменьшения  числа широковеща-

    тельных запросов, каждый узел поддерживает кеш разрешения адресов.

    Каждый раз когда узел посылает широковещательный запрос ARP  и по-

    лучает ответ, он создает вход  в  кеш-памяти  разрешения  адресов.

    Вход отображает адрес IP в физический адрес. Когда  узел нуждается

    в посылке следующего пакета IP, он ищет адрес IP в кешпамяти. Если

    данный адрес IP находится, узел  использует  соответствующий физи-

    ческий адрес для пакета. Широковещательный  запрос  IP  посылается

    только если соответствующий адрес IP не обнаруживается в кеш-памя-

    ти.






                Включение дейтагpаммы IP в кадp Ethernet
                                             ¦дейтаграмма  ¦

                                             ¦     IP      ¦
          г=======T========T========T========T=============T========¬

          ¦ Пpеам-¦ адрес  ¦  адрес ¦  тип   ¦   данные    ¦контр.  ¦

          ¦ була  ¦ получа-¦  источ-¦  пакета¦   пакета    ¦сумма   ¦

          ¦       ¦ теля   ¦  ника  ¦        ¦             ¦Ethernet¦

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

          ¦                                                         ¦

          ¦------- заголовок кадра-----------¦--- данные---¦        ¦

          ¦                                  ¦    кадра    ¦        ¦

          ¦                                                         ¦

          ¦-------------------- кадр Ethernet-----------------------¦
                                   Рис.3.3.
               3.3. Ненадежный сервис доставки пакетов
       В наборе протоколов TCP/IP все пакеты  доставляются  ненадежным

    сервисом доставки пакетов неориентированным на соединение Межсете-

    вого Протокола. Сервис ненадежен, поскольку доставка пакета не га-

    рантируется. Сервис не ориентирован на соединение,    продолжение
--PAGE_BREAK--  поскольку  все

    пакеты передаются независимо друг от друга. Приложения  TCP/IP ис-

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

    например,  ожиданием  ответов  от  узла  получателя.  Кроме  того,

    маршрутизаторы (routers) в Интерсети могут посылать  сообщения  об

    ошибках  (ICMP)  для  информирования  узлов  о  проблемах.  Термин

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

    другому на той же или другой сети. Термин относится также к путям,

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

    лучателю на базе адреса IP, содержащегося в дейтаграмме. Существу-

    ет два способа маршрутизации: прямая и непрямая.

       Прямая маршрутизация имеет место  при  передаче  дейтаграммы  в

    рамках одной сети. Узел, посылающий дейтаграмму  IP,  может  прямо

    запросить другие узлы в сети о физическом  адресе, соответствующем

    адресу IP, включить дейтаграмму IP в физический кадр с  данным фи-

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

    сети.

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

    сети в другую через узел, называемый  маршрутизатором.  Когда дей-

    таграмма посылается к узлу другой сети, сетевая  часть  адреса  IP

    источника и адреса IP получателя различны. Посылающий узел распоз-

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

    няет исходную сеть с другими сетями.

       Посылающий узел имеет таблицу адресов IP для одного  или больше

    компьютеров в сети, которые функционируют в качестве маршрутизато-

    ров к другим сетям. Узел ищет адрес IP маршрутизатора в своей таб-

    лице и посылает широковещательный запрос ARP к  маршрутизатору для

    получения его физического адреса. Затем пакет,  содержащий дейтаг-

    рамму IP, посылается по физическому адресу  маршрутизатора.  Когда

    маршрутизатор получает дейтаграмму IP, он использует  адрес  IP  в

    дейтаграмме для посылки получателю аналогичным образом. Если адрес

    IP принадлежит к сети, подключенной непосредственно  к маршрутиза-

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

    ния. Для всех других адресов сетей маршрутизатор имеет  только ад-

    рес другого маршрутизатора, который может направить пакет  к полу-

    чателю.
               3.4. Межсетевой Протокол IP
       Межсетевой протокол определяет  форму  пакетов  и  способы под-

    держки пакетов при передаче и приеме. Форма пакета называется дей-

    таграммой IP. Дейтаграмма IP аналогична физическому кадру, переда-

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

    адреса IP отправителя и получателя и секцию данных.




                          Структура дейтаграммы IP
          ¦ Заголовок дейтаграммы IP  ¦ Данные дейтаграммы IP       ¦

          ¦                           ¦                             ¦

          г=============T=============+==============T==============¬

          ¦  Информация ¦ Адрес       ¦ Адрес        ¦  Данные      ¦

          ¦  заголововка¦ источника IP¦ получателя IP¦              ¦

          L=============¦=============¦==============¦==============-
                                    Рис.3.4.
       В отличие от кадра сети, имеющего физическую длину, установлен-

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

    таграммы устанавливается сетевым  программным  обеспечением. Прог-

    раммное обеспечение IP на узле создает дейтаграмму,  которая поме-

    щается внутрь кадра сети. Двигаясь к узлу назначения, однако, дей-

    таграмма может пройти по многим сетям различных типов с различными

    длинами физических кадров. Для поддержки передачи  пакета протокол

    IP задает метод разбиения дейтаграмм на фрагменты на  каждом узле,

    который должен передавать дейтаграммы и соответствующий  метод ре-

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

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

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

    зического кадра, чем первая.  Будучи  однажды  фрагментированными,

    пакеты не реассемблируются до достижения точки назначения.
               3.5. Сообщения об ошибках и управляющие сообщения
       Другой протокол набора TCP/IP это Межсетевой Протокол Управляю-

    щих Сообщений (ICMP). Пакеты ICMP содержат информацию об авариях в

    сети: нефункционирующих узлах и шлюзах,  проблемах  с  пакетами  в

    шлюзах и т.д. Программное обеспечение IP  интерпретирует сообщение

    ICMP и затем предпринимает соответствующие действия в соответствии

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

    ние ICMP может передаваться через несколько сетей  для  достижения

    назначения, оно помещается в порцию данных дейтаграммы IP.
               3.6. Протоколы транспортного уровня: UDP и TCP
       Два протокола составляют транспортный уровень набора  TCP/IP: м

    Пользовательский Дейтаграммный Протокол (UDP) и  Протокол Управле-

    ния Передачей (TCP). UDP обеспечивает ненадежный  сервис  доставки

    без соединений для посылки и получений  сообщений.  TCP  добавляет

    надежные потоковые сервисы доставки над ненадежным сервисом доста-

    ки пакетов без соединений IP.

       В наборе TCP/IP UDP позволяет приложениям  обмениваться индиви-

    дуальными пакетами сообщений через сеть. Протокол  UDP  определяет

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

    типа протокольных портов: хорошо известное назначение портов и ди-

    намически связанные порты. В первом случае,

       TCP/IP резервирует соответствующие номера портов для соответст-

    вующих приложений. Порты сномерами от 1 до 255 являются хорошо из-

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

    вестным приложениям. В случае динамически связанных  портов прило-

    жение, запрашивающее сервисы у процесса, должны прежде  всего зап-

    росить узел для идентификации порта, который  использует  процесс.

    Он может в дальнейшем направлять дейтаграммы UDP этому порту.

       Дейтаграмма UDP включается в одну или более дейтаграмм  IP, ко-

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

    как показано на рис. 3.5. В этом примере адрес IP
                          Включение дейтаграммы UDP
                               ¦  Заголовок   ¦ Данные   ¦

                               ¦  UDP         ¦ UDP      ¦

                               г======T=====T=+==========¬

                               ¦Порт  ¦Порт ¦ ¦   Данные ¦

                               ¦источн¦назн ¦ ¦   UDP    ¦

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

                               ¦                         ¦

                               ¦--- Дейтаграмма UDP — ¦

                               ¦

                     г=========+=========================¬

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

                     ¦    IP   ¦                         ¦

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

                     ¦                                   ¦

                     ¦--------- Дейтаграмма IP ----------¦

                     ¦                                   ¦

          г==========+===================================+==========¬

          ¦Заголовок ¦                                   ¦ Контр.   ¦

          ¦кадра     ¦                                   ¦ сумма    ¦

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

          ¦                                                         ¦

          ¦------------------- Кадр Ethernet -----------------------¦

          ¦                                                         ¦
                                     Рис.3.5.
       направляет дейтаграмму IP к соответствующему узлу,  на  котором

    программное обеспечение IP извлекает дейтаграмму UDP  и доставляет

    ее программному обеспечению уровня  UDP.  Программное  обеспечение

    уровня UDP доставляет данные UDP и управляющую информацию к задан-

    ному протокольному порту назначения.  Процесс  на  этом  порту ис-

    пользует данные из дейтаграммы UDP. Дейтаграмма UDP также содержит

    протокольный порт источника, позволяющий процессу назначения отве-

    тить корректно.

       Для  приложений,  которые  нуждаются  в  посылке   значительных

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

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

    модули обеспечения надежной передачи. Набор протоколов  TCP/IP об-

    ходит эти проблемы через использование Протокола  Управления Пере-

    дачей (TCP) — надежного протокола с потоковой доставкой.  Он уста-

    навливает виртуальный канал между двумя

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

    ке, в котором он покидает отправителя. Перед началом передачи при-

    ложения на обоих концах получают порты TCP от  своих  операционных

    систем. Эти порты аналогичны тем,  что  использует  протокол  UDP.

    Приложение, начинающее передачу, известно  как  активная  сторона,

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

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

    ко известный порт TCP на пассивной стороне.  Подобно  дейтаграммам

    UDP, сегменты TCPвключаются в дейтаграммы IP. TCP буферизует поток

    ожиданием достаточного количества данных  для  заполнения  большой

    дейтаграммы перед ее посылкой. Поток неструктурирован, что означа-

    ет, что посылающая и принимающая стороны (приложения)  до передачи

    должны установить соглашения относительно содержимого  потока. TCP

    использует полнодуплексную передачу.

       Протокол TCP присваивает каждому сегменту  последовательный но-

    мер. На приемном конце виртуального канала  приложение  проверяеет

    последовательность намеров для определения того, все  ли  сегменты

    получены и обработаны в порядке  последовательных  номеров.  Когда

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

    посылает квитанцию — подтверждение узлу — источнику. Когда  узел -

    источник получает подтверждение, он индицирует приложению  то, что

    сегмент успешно передан. Если узел — источник в течение определен-

    ного таймаута не получает подтверждения, он повторно  передает со-

    ответствующий  сегмент.  Эта  схема,   называемая   «положительное

    подтверждение с повторной передачей», обеспечивает  надежность пе-

    редачи.
               3.7. Транспортная система TCP/IP в NetWare версии 3.11
       Транспортная система TCP/IP обеспечивает  возможности подключе-

    ния к сетям с этими протоколами для сетей фирмы Novell.  На файло-

    вом сервере TCP/IP включает в себя набор NLM для поддержки возмож-

    ностей маршрутизации IP и построения интерсетей, поддержки функци-

    онирования приложений, таких как NetWare NFS, возможность проклад-

    ки туннелей IPX через интерсети IP. Дополнительно TCP/IP обеспечи-

    вает транспортный интерфейс, используемый как NFS, так  и  другими

    приложениями, написанными для интерфейсов типа сокет  4.3BSD  UNIX

    или AT&T Streams Transport Layer Interface  (TLI).  NetWare  v3.11

    TCP/IP включает следующие загружаемые модули и файлы базы данных:

                NLM NetWare TCP/IP (TCPIP.NLM)

                The Simple Network Management Protocol NLM

                 (SNMP.NLM)

                The SNMP event logger NLM (SNMPLOG.NLM)

                The TCP/IP Console NLM (TCPCON.NLM)

                The IP configuration NLM (IPCONFIG.NLM)

                The IPX/IP Tunnel module (IPTUNNEL.LAN)

                Sample Internet database files (GATEWAYS, HOSTS,

                 NETWORKS, PROTOCOL, and SERVICES)
          Архитектура TCP/IP приведена на рис.3.6.




                   Архитектура TCP/IP в NetWare
          -----------------------------------------------------------¬

          ¦                                                          ¦

          +----------------------------------------------------------+

          ¦------------¬  ----------¬   -----------¬  --------------¬¦

          ¦¦ Другие    ¦  ¦ TCPCON  ¦   ¦ SNMPLOG  ¦  ¦ Другие      ¦¦

          ¦¦ приложения¦  ¦         ¦   ¦          ¦  ¦ приложения  ¦¦

          ¦¦ TLI       ¦  ¦         ¦   ¦          ¦  ¦ для сокетов ¦¦

          ¦L-----T------  L----T-----   L-----T-----  L------T-------¦

          ¦      ¦             L--------------+--------------+       ¦

          ¦      ¦                                           ¦       ¦

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

          ¦     \¦/              ¦            ¦             \¦/      ¦

          ¦--------------¬       ¦            ¦       -------+------¬¦

          ¦¦ Интерфейс   ¦       ¦   NetWare  ¦       ¦ Сокеты      ¦¦

          ¦¦ транспортн  ¦       ¦     NFS    ¦       ¦ BSD         ¦¦

          ¦¦ уровня TLI  ¦       ¦            ¦       ¦             ¦¦

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

          ¦      ¦                      ¦                    ¦       ¦

    продолжение
--PAGE_BREAK--          ¦     \¦/                    \¦/                  \¦/      ¦

          ¦------+----------------------+--------------------+------¬¦

          ¦¦    Транспортная система TCP/IP NetWare                 ¦¦

          ¦L--------------------------T------------------------------¦

          ¦                           ¦                              ¦

          ¦           ----------------+----------------¬             ¦

          ¦           ¦Открытый интерфейс ODI          ¦             ¦

          ¦           L----T----------T----------T------             ¦

          ¦      -----------         \¦/         L-----------¬       ¦

          ¦ -----+----¬        -------+------¬         ------+----¬  ¦

          ¦ ¦ Драйвер ¦        ¦   Драйвер   ¦         ¦  Драйвер ¦  ¦

          ¦ ¦ Ethernet¦        ¦  Token Ring ¦         ¦  ARCnet  ¦  ¦

          ¦ L----T-----        L------T-------         L-----T-----  ¦

          ¦     \¦/                  \¦/                    \¦/      ¦

          ¦------+--------¬   --------+---------¬     -------+-----¬ ¦

          ¦¦  Адаптер     ¦   ¦   Адаптер       ¦     ¦  Адаптер   ¦ ¦

          ¦¦              ¦   ¦                 ¦     ¦            ¦ ¦

          ¦¦  Ethernet    ¦   ¦  Token Ring     ¦     ¦  Arcnet    ¦ ¦

          ¦L---------------   L------------------     L------------- ¦

          ¦                                                          ¦

          L-----------------------------------------------------------
                                    Рис.3.6.
       Программное обеспечение TCP/IP позволяет  реализовать различные

    конфигурации сетей IP IPX.

       Сеть IP (серверы и клиенты UNIX) могут  взаимодействовать между

    собой, используя протокол TCP/IP, в одной физической сети с серве-

    рами и клиентами NetWare. Пример такой сети Ethernet с адресом се-

    ти IP 129.1.0.0 и с адресом сети IPX 84404556 приведен  на рисунке

    3.7.




                   Совместная работа TCP/IP и SPX/IPX
            г================¬

            ¦ NetWare Server ¦  ---------------¬

            ¦                ¦  ¦ UNIX Server  ¦

            L=========T======-  L-------T-------

            129.1.0.3 ¦                 ¦ 129.1.0.1

                      ¦                 ¦

                      ¦IPX Net=84404556 ¦    IP Net=129.1.0.0

            ------T---+------------T----+------------T-------------

                  ¦                ¦                 ¦

                  ¦                ¦                 ¦

            ------+--------¬  -----+---------¬       ¦ 129.1.0.2

            ¦NetWare Client¦  ¦NetWare Client¦  -----+-----------¬

            ¦              ¦  ¦              ¦  ¦UNIX Workstation¦

            L---------------  L---------------  L-----------------
                                  Рис.3.7.
       Сети IP и IPX могут подключаться к одному серверу NetWare. Кли-

    енты UNIX могут использовать файловое пространство  сервера  с по-

    мощью Netware NFS (рис.3.8.).
                  Подключение сетей TCP/IP и SPX/IPX к серверу
            ---------------------¬      --------------¬

            ¦Рабочая станция UNIX¦      ¦ Сервер UNIX ¦

            L---------T-----------      L-----T--------

                      ¦129.1.0.2              ¦129.1.0.1

                      ¦                       ¦

                      ¦                       ¦Сеть IP=129.1.0.0

           -----------+----------------T------+-------------------

                              129.1.03 ¦

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

                              ¦  Сервер NetWare  ¦

                              L=========T========-

                                        ¦

                  Сеть IPX = 84404556   ¦       Сеть Token Ring

                ------------------------+-----------------------¬

                L------T------------------------------------T----

                       ¦                                    ¦

                -------+-------¬                     -------+-------¬

                ¦Клиент NetWare¦                     ¦Клиент NetWare¦

                L---------------                     L---------------
                                  Рис.3.8.
       Есть возможность маршрутизации пакетов IP через сервер NetWare.

    На рис.3.9. TCP/IP в сервере Netware 1  обеспечивают маршрутизацию

    пакетов IP, давая возможность клиентам UNIX из  сети  IP  Ethernet

    работать с сервером Netware 2.
                  Маршрутизация пакетов IP через сервер NetWare
            ---------------------¬      --------------¬

            ¦Рабочая станция UNIX¦      ¦ Сервер UNIX ¦

            L---------T-----------      L-----T--------

                      ¦129.1.0.2              ¦129.1.0.1

                      ¦                       ¦

                      ¦                       ¦Сеть IP=129.1.0.0

           -----------+----------------T------+-------------------

                              129.1.03 ¦

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

                              ¦  Сервер NetWare 1¦

                              L=========T========-

                                        ¦

                  Сеть IPX = 84404556   ¦       Сеть Token Ring

                ------------------------+-----------------------¬

                L----T------------------T-----------------T------

                     ¦                  ¦                 ¦

              -------+-------¬  г=======¦========¬ -------+-------¬

              ¦Клиент NetWare¦  ¦Сервер NetWare 2¦ ¦Клиент NetWare¦

              L---------------  L================- L---------------
                                     Рис.3.9.
       Включив в состав сети IP, изображенной на рис.3.10.-, маршрути-

    затор IP можно обеспечить выход в глобальную интерсеть IP.

       Средства прокладки туннелей IP обеспечивают  прозрачное взаимо-

    действие сетей IPX через интерсеть  IP.  Туннель  IP  представляет

    стандартный интерфейс драйвера локальной сети для системы NetWare.

    Сама интерсеть IP является средой передачи. В этом смысле адрес IP

    выполняет в среде IP ту же функцию, что физический  адрес  в физи-

    ческой среде. Пример использования туннеля IP  для  взаимодействия

    сетей IPX через интерсеть IP приведен на рис.3.10.
               Взаимодействие сетей NetWare через туннель IP
                          Туннель IP                 г============¬

                               ¦                     ¦  Сеть IPX  ¦

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

                               ¦                            ¦

            -----------------¬ ¦ г============¬   ----------+------¬

            ¦ Сервер NetWare +-+-¦Интерсеть IP¦---+ Сервер NetWare ¦

            ¦                +---¦            ¦-T-+                ¦

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

                     ¦                          ¦

                     ¦                          ¦

            г========¦=======¬              Туннель IP

            ¦   Сеть IPX     ¦

            L================-
                                    Рис.3.10.
                 4. ОБМЕН СООБЩЕНИЯМИ В СЕТИ.
       Две программы, работающие на разных узлах  сети,  могут обмени-

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

    невый драйвер сети и пересылка сообщений через общий файл-сервер.
       Пример программы, посылающей сообщение на консоль сервера :
Uses Dos;

var k: integer;

sendString: string;

Procedure SendToCon(Message: string);

var

  reg: registers;

  s   : array [0..64] of byte;

  i   : integer;
begin
  s[0] := 0;

  s[1] := 4;

  s[2] := $09;

  s[3] := length(Message);

  for i := 1 to Length(Message) do

    s[i+3] := ord(Message[i]);

  reg.ah := $0E1;

  reg.bx := reg.ds;

  reg.ds := seg(s);

  reg.si := ofs(s);

  intr($21,reg);

  reg.ds := reg.bx;

end;
begin

  If ParamCount = 0 then

    begin

      Writeln('Send message to console utility by S.Perevoznik, 1993');

      Writeln('Usage: ssend <message>');

      halt;

    end;

  for k := 1 to paramcount do

begin

   SendString := SendString + Paramstr(k) + ' ';

end;

  SendToCon(sendString);

  Writeln('Message send to console ...');

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

   следующие функции :
{$F+,O+}
Unit UICNet;
Interface
Uses Dos;
Function GetUserName(ConnectionNumber: byte;

                     Var ObjectFree: boolean): string;
Function LocalDisk: boolean;

Procedure SendBroadcastMessage(Message:string;ConnectionNumber:byte);
Implementation
Function GetUserName(ConnectionNumber: byte;

                     Var ObjectFree: boolean): string;
  var

    WordPtr:^Word;

    r           : registers;

    SendPacket  : array[0..4] of byte;

    ReplyPacket: array[0..64] of byte;

    UserName    : string;

    ObjectType  : word;
function GetWord(P: pointer): word;

  var

    WordPtr :^word;
    begin

      WordPtr := P;

      GetWord := swap(WordPtr^);

   end;
    begin

      SendPacket[2] := $16;

      SendPacket[3] := ConnectionNumber;

      WordPtr := addr(SendPacket);

      WordPtr^:=2;

      WordPtr := addr(SendPacket);

      WordPtr^ := 62;

      r.ah := $e3;

      r.ds := seg(SendPacket);

      r.si := ofs(SendPacket);

      r.es := seg(ReplyPacket);

      r.di := ofs(ReplyPacket);

      intr($21,r);

      if r.al = 0

        then

        begin

          ObjectType := GetWord(addr(ReplyPacket[6]));

          if ObjectType = 0 then ObjectFree := true

            else

              ObjectFree := false;

          move(ReplyPacket[8],UserName[1],48);

          UserName[0] := chr(48);

          GetUserName := Username;

       end;

          end;
Function LocalDisk: boolean;

var r: registers;

   begin

    r.ah := $19;

    intr($21,r);

    r.dl := r.al+1;

    r.ah := $e9;

    r.al := 0;

    r.dh := 0;

    intr($21,r);

    if r.ah = 128 then localdisk := true

      else localdisk := false;

  end;
Procedure SendBroadcastMessage(Message:string; ConnectionNumber:byte);

  var

    r           : registers;

    WordPtr     : ^word;

    SendPacket  : array [0..160] of byte;

    ReplyPacket: array [0..103] of byte;

  begin

   SendPacket[2] := 0;

   SendPacket[3] := 1;

   SendPacket[4] := ConnectionNumber;

   SendPacket[5] := length(Message);

   move(Message[1],SendPacket[6],length(Message));

   WordPtr := addr(SendPacket);

   WordPtr^ := Length(Message) + 4;

   r.ah := $e1;

   r.ds := seg(SendPacket);

   r.si := ofs(SendPacket);

   r.es := seg(ReplyPacket);

   r.di := ofs(ReplyPacket);

   intr($21,r);

 end;
end.
  Следующая программа демонстрирует возможность получения списка поль-

  зователей, подключенных к сети:
uses Dos;
function GetWord(P: pointer): word;

  var

    WordPtr :^word;
    begin

      WordPtr := P;

      GetWord := swap(WordPtr^);

   end;
Function GetLong(P:Pointer): longint;

  type long= record

    case integer of

    1:(Long1: Longint);

    2:(Word1,Word2:word);

  end;
var LongPtr :^Long;

    L: long;
    begin

      LongPtr := P;

      L.Word1 := swap(LongPtr^.Word2);

      L.Word2 := swap(LongPtr^.Word1);

      GetLong:= L.Long1;

   end;
Function GetConnectionInformation(ConnectionNumber:byte;

  Var ObjectName: string; var ObjectType: word;

  var ObjectID: longint; var LoginTime: string): byte;
  var

    WordPtr:^Word;

    r:registers;

    SendPacket: array[0..4] of byte;

    ReplyPacket: array[0..64] of byte;
    begin

      SendPacket[2] := $16;

      SendPacket[3] := ConnectionNumber;

      WordPtr := addr(SendPacket);

      WordPtr^:=2;

      WordPtr := addr(SendPacket);

      WordPtr^ := 62;

      r.ah := $e3;

      r.ds := seg(SendPacket);

      r.si := ofs(SendPacket);

      r.es := seg(ReplyPacket);

      r.di := ofs(ReplyPacket);    продолжение
--PAGE_BREAK--

      intr($21,r);

      if r.al = 0

        then

        begin

          ObjectID := GetLong(addr(ReplyPacket[2]));

          ObjectType := GetWord(addr(ReplyPacket[6]));

          move(ReplyPacket[8],ObjectName[1],48);

          ObjectName[0] := chr(48);

          move(ReplyPacket[56],LoginTime[1],7);

          LoginTime[0] := chr(7);

       end;

          GetConnectionInformation := r.al;

          end;

      var

        ObjectName,LoginTime: string;

        ObjectType: word;

        ObjectID: longint;

        ConnectionNumber, CCode: byte;
        begin

          ConnectionNumber := 1;

          CCode := GetConnectionInformation(ConnectionNumber,

          ObjectName,ObjectType,ObjectID,LoginTime);

          while (CCode <> 253) and (ConnectionNumber<255)

            do

            begin

              if CCode <> 0

                then

                writeln('Cod ',CCode,ConnectionNumber)

                else if ObjectType <>0 then begin

                  Writeln(ConnectionNumber,' ',ObjectType,' ',ObjectID);

                  Writeln(ObjectName);

           end;

          inc(ConnectionNumber);

          CCode := GetConnectionInformation(ConnectionNumber,

          ObjectName,ObjectType,ObjectID,LoginTime);

          end;

        end.
                5. РАБОТА С ФАЙЛАМИ В ЛВС.
       Ниже приводятся тексты процедур, используемых при работе  в ЛВС

    для обслуживания файловой системы:
    ; Данная библиотека процедур разработана для использования в прог-

    ; раммах, написанных на Турбо-Паскале версии 4.0 и выше.

    ; Joe R. Doupnik and Sergey V. Perevoznik, 1988 — 1993
lprogequ   1           ; 0 for small memory, 1 for large memory model

                        ; Modify lprog to match the memory model
      if    lprog

x     equ   6           ; prologue overhead for large memory model

      else

x     equ   4           ; ditto, small memory model

      endif
beginmacroname        ; begin a function, near or far

      public  name

      if    lprog

name  proc  far

      else

name  proc  near

      endif

      endm

        ; define Borland Pascal  segments

                        ; use neither Group nor Class

data  segment word public

data  ends
cseg  segment byte public

      assume      cs:cseg, ds:data, es:nothing
;--------------------------------

; Extended Open a File func(61) (3DH)

;

; var

;     Mode, Handle, RetCode: Integer;

;     Filename          : String[n];

;

; RetCode := xtndopn(Mode, Handle, Filename);

;
beginxtndopn

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+8]       ; put the mode in ax

      mov   ax,[si]

      mov   ah,03Dh           ; put the function in ah

      lds   dx,[bp+x]         ; ptr to ASCIIZ string

      inc   dx          ; add 1 to get to the beginning of the string

      int   21h

      jc    xtndopx           ; carry set means failure

      lds   di,[bp+x+4]       ; put the handle into the variable

      mov   [di],ax           ; if there is no error and

      xor   ax,ax     ; return a 0

xtndopx:popds

      pop   bp

      ret   14

xtndopn endp
;--------------------------------

; Get or Set File Attributes(handle) func(67) (43H)

;

; var

;     Func, Attribute, ErrCode: Integer;

;     Filename          : String[n];

;

;ErrCode := setattr(Func, Attribute, Filename);

;
beginsetattr

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+8]       ; put the subfunction in ax

      mov   ax,[si]

      mov   ah,043h           ; put the function in ah

      lds   dx,[bp+x]         ; ptr to var desc block for ASCIIZ string

      inc   dx          ; add 1 to get the address of the string

      lds   si,[bp+x+4]       ; put the attribute to set in cx

      mov   cx,[si]

      int   21h

      jc    setattx           ; carry set means failure

      lds   di,[bp+x+4]       ; put the returned attributes in the

      mov   [di],cx           ; variable if there is no error

      xor   ax,ax      ; and return zero

setattx:movah,0

      pop   ds

      pop   bp

      ret   14

setattr endp
;--------------------------------

; End of Job Flag Status func(187) (BBH)

;

; var

;     Flag: Integer;

;

;ErrCode := eojstat(Flag);

;
begineojstat

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x]         ; put the flag in ax

      mov   ax,[si]

      mov   ah,0BBh           ; put the function in ah

      int   21h

      mov   ah,0

      lds   di,[bp+x]

      mov   [di],ax

      pop   ds

      pop   bp

      ret   6

eojstat endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Physical Record Lock: Log Record   BCH

;

; var

;     ErrCode,FileHandle,HiByteOffset,LoByteOffset: Integer

;     HiLockLen,LoLockLen,Flags,TimeOut        : Integer

;

;ErrCode := PRLH_Log(FileHandle,HiByteOffset,LoByteOffset,HiLockLen,

;                LoLockLen,Flags,TimeOut);

;
beginPRLH_Log

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+24]      ; FileHandle

      mov   bx,[si]

      lds   si,[bp+x+20]      ; ByteOffset

      mov   cx,[si]

      lds   si,[bp+x+16]

      mov   dx,[si]

      lds   si,[bp+x+4]; AL = Log Flags

      mov   ax,[si]

      lds   si,[bp+x+12]      ; LockLen

      mov   si,[si]

      lds   di,[bp+x+8]

      mov   di,[di]

      lds   bp,[bp+x]   ; time out

      mov   bp,[bp]

      mov   ah,0BCH

      int   21H

      mov   ah,0          ; clear the high byte of the return

      pop   ds

      pop   bp

      ret   30

PRLH_Log endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Physical Record Lock: Release Rec  BDH

;

; var

;     FileHandle,HiByteOffset,LoByteOffset,ErrCode,

;  HiWordLen,LoWordLen: integer;

; ErrCode := PRLH_Rel(FileHandle,HiByteOffset,LoByteOffset,HiWordLen,

;                           LoWordLen:integer);
beginPRLH_Rel

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+16]        ; FileHandle

      mov   bx,[si]

      lds   si,[bp+x+12]        ; HiByteOffset

      mov   cx,[si]

      lds   si,[bp+x+8]  ; LoByte

      mov   dx,[si]

      lds   si,[bp+x+4]  ; HiWordLen

      mov   si,[si]

      lds   di,[bp+x]     ; LoWordLen

      mov   di,[di]

      mov   ah,0BDH

      int   21H

      mov   ah,0

      pop   ds

      pop   bp

      ret   22

PRLH_Rel endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Physical Record Lock: Release Clr  BEH

;

; var

; FileHandle,HiByteOffset,LoByteOffset,ErrCode,

;  HiWordLen,LoWordLen: integer;

; ErrCode := PRLH_Rel(FileHandle,HiByteOffset,LoByteOffset,HiWordLen,

;                           LoWordLen:integer);

;
beginPRLH_Clr

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+16]      ; FileHandle

      mov   bx,[si]

      lds   si,[bp+x+12]      ; ByteOffset

      mov   cx,[si]

      lds   si,[bp+x+8]

      mov   dx,[si]

      lds   si,[bp+x+4]; HiWordLen

      mov   si,[si]

      lds   di,[bp+x]   ; LoWordLen

      mov   di,[di]

      mov   ah,0BEH

      int   21H

      mov   ah,0

      pop   ds

      pop   bp

      ret   22

PRLH_Clr endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Physical Record Lock: Log Rec FCB BFH

;

; var

;     ErrCode,fcb,HiByteOffset,LoByteOffset: Integer;

;     HiLockLen,LoLockLen,Flags,TimeOut     : Integer;

;

; ErrCode := PRLF_Log(fcb,HiByteOffset,LoByteOffset,HiLockLen,LoLockLen,Flags,TimeOut);

;
beginPRLF_Log

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+24]      ; FCB

      mov   dx,[si]

      lds   si,[bp+x+20]      ; ByteOffset

      mov   bx,[si]

      lds   si,[bp+x+16]

      mov   cx,[si]

      lds   si,[bp+x+4]; AL = Log Flags

      mov   ax,[si]

      lds   si,[bp+x+8]; low lock length

      mov   di,[si]

      lds   si,[bp+x+12]      ; hi lock length

      mov   si,[si]

      mov   bp,[bp+x]   ; timeout value

      mov   bp,[bp]

      mov   ah,0BFH

      int   21H

      mov   ah,0

      pop   ds

      pop   bp

      ret   28

PRLF_Log endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Physical Record Lock: Rel Rec FCB C0H

;

; var

;     ErrCode,fcb,HiByteOffset,LoByteOffset: Integer;

;

; ErrCode := PRLF_Rel(fcb,HiByteOffset,LoByteOffset);

;
beginPRLF_Rel

      push  bp

      mov   bp,sp

      push  ds

      lds   dx,[bp+x+8]; FCB

      lds   si,[bp+x+4]; ByteOffset

      mov   bx,[si]

      lds   si,[bp+x]

      mov   cx,[si]

      mov   ah,0C0H

      int   21H

      mov   ah,0

      pop   ds

      pop   bp

      ret   12

PRLF_Rel endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Physical Record Lock: Clr Rec FCB C1H

;

; var

;     ErrCode,fcb,HiByteOffset,LoByteOffset: Integer;

;

; ErrCode := PRLF_clr(fcb,HiByteOffset,LoByteOffset);

;
beginPRLF_Clr

      push  bp

      mov   bp,sp

      push  ds

      lds   dx,[bp+x+8]; FCB

      lds   si,[bp+x+4]; ByteOffset

      mov   bx,[si]

      lds   si,[bp+x]

      mov   cx,[si]

      mov   ah,0C0H

      int   21H

      mov   ah,0

      pop   ds

      pop   bp

      ret   12

PRLF_Clr endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Lock Record Set  C2H

;

; var

;     ErrCode, Flags, TimeOut: Integer;

;

; ErrCode := PRLS_Lck(Flags,TimeOut);

;
beginPRLS_Lck

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+4]; AL = Lock flag bits

      mov   ax,[si]

          продолжение
--PAGE_BREAK--lds   si,[bp+x]   ; TimeOut Value

      mov   bp,[si]

      mov   ah,0C2h

      int   21h

      mov   ah,0

      pop   ds

      pop   bp

      ret   10

PRLS_Lck endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Release Record Set  C3H

;

; var

;     ErrCode: Integer;

;

; ErrCode := PRLS_Rel;

;
beginPRLS_Rel

      mov   ah,0C3h

      int   21h

      mov   ah,0

      ret

PRLS_Rel endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Clear Record Set  C4H

;

; var

;     ErrCode: Integer;

;

; errcode := PRLS_Clr;

;
beginPRLS_Clr

      mov   ah,0C4h

      int   21h

      mov   ah,0

      ret

PRLS_Clr endp
;--------------------------------

; Semaphores func(197) (C5H) subfunction 00h

;

; var

;     RetCode,SemaValu,HiHandle,LoHandle,OpenCnt: Integer;

;     Sema4: String[n];

;

; RetCode := OpenSem(Sema4,SemaValu,HiHandle,LoHandle,OpenCnt);

;
beginOpenSem

      push  bp

      mov   bp,sp

      push  ds

      lds   dx,[bp+x+16]      ; ptr to Semaphore string

;     inc   dx          ; add 1 to get the address of the string

      lds   si,[bp+x+12]      ; set semaphore value

      mov   cx,[si]

      mov   ax,0C500h   ; set the function

      int   21h

      mov   bh,00h

      lds   di,[bp+x]   ; return the open count

      mov   [di],bx

      lds   di,[bp+x+4]       ; return low handle

      mov   [di],cx

      lds   di,[bp+x+8]; return high handle

      mov   [di],dx

      mov   ah,00h

      pop   ds

      pop   bp

      ret   22

OpenSem endp
;--------------------------------

; Semaphores func(197) (C5H) subfunction 01h

;

; var

;     RetCode,HiHandle,LoHandle,SemaValu,OpenCnt: Integer;

;

; RetCode := ExamSem(HiHandle,LoHandle,SemaValu,OpenCnt);

;
beginExamSem

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+12]      ; hi handle

      mov   dx,[si]

      lds   si,[bp+x+8]; lo handle

      mov   cx,[si]

      mov   ax,0C501h   ; set function

      int   21h

      lds   di,[bp+x+4]; return semaphore value

      mov   [di],cx

      mov   dh,00h

      lds   di,[bp+x]

      mov   [di],dx     ; return open count

      mov   ah,00h

      pop   ds

      pop   bp

      ret   16

ExamSem endp
;--------------------------------

; Semaphores func(197) (C5H) subfunction 02h

;

; var

;     RetCode,HiHandle,LoHandle,TimeOut: Integer;

;

; RetCode := WaitSem(HiHandle,LoHandle,TimeOut);

;
beginWaitSem

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+8]; hi handle

      mov   dx,[si]

      lds   si,[bp+x+4]; lo handle

      mov   cx,[si]

      lds   si,[bp+x]

      mov   bp,[si]     ; set time out

      mov   ax,0C502h   ; set function

      int     21h

      mov   ah,00h

      pop   ds

      pop   bp

      ret   12

WaitSem endp
;--------------------------------

; Semaphores func(197) (C5H) subfunction 03h

;

; var

;     RetCode,HiHandle,LoHandle: Integer;

;

; RetCode := SigSem(HiHandle,LoHandle);

;
beginSigSem

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+4]; hi handle

      mov   dx,[si]

      lds   si,[bp+x]   ; lo handle

      mov   cx,[si]

      mov   ax,0C503h   ; set function

      int   21h

      mov   ah,00h

      pop   ds

      pop   bp

      ret   8

SigSem      endp
;--------------------------------

; Semaphores func(197) (C5H) subfunction 04h

;

; var

;     RetCode,HiHandle,LoHandle: Integer;

;

; RetCode := ClosSem(HiHandle,LoHandle);

;
beginClosSem

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+4]; hi handle

      mov   dx,[si]

      lds   si,[bp+x]   ; lo handle

      mov   cx,[si]

      mov   ax,0C504h   ; set function

      int   21h

      mov   ah,00h

      pop   ds

      pop   bp

      ret   8

ClosSem endp
;--------------------------------

; Get or Set Lock Mode func(198) (C6H)

;

; var

;     Mode,Func: Integer;

;

; Mode := setlck(Func);

;
beginsetlck

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x]

      mov   ax,[si]     ; set the subfunction

      mov   ah,0C6h     ; set the function

      int   21h

      mov   ah,0

      pop   ds

      pop   bp

      ret   4

setlck endp
;--------------------------------

; Transactional Backout func(199) (C7H)

;

; var

;     RetCode, Func: Integer;

;

; RetCode := BakOuts(Func);

;
beginBakOuts

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x]   ; set the subfunction

      mov   ax,[si]

      mov   ah,0C7h     ; set the function

      int   21h

      mov   ah,0

      pop   ds

      pop   bp

      ret   4

BakOuts endp
;--------------------------------

; Begin transaction  func(200) (C8H)

;

; var

;     RetCode,Mode: Integer;

;

; RetCode := btrans(Mode);

;
beginbtrans

      mov   ah,0C8h

      call  arg1t

      ret   4

btrans      endp
;--------------------------------

; End Transaction func(201) (C9H)

;

; var

;     RetCode: Integer;

;

; RetCode := etrans;

;
beginetrans

      mov   ah,0C9H

      int   021h

      mov   ah,00h

      ret

etrans      endp
;--------------------------------

; Exc.log File (202) (CA)

;

; var

;     RetCode, FcbAddr: Integer;

;

; RetCode := exclog(FcbAddr);

;
beginexclog

      mov   ah,0CAH

      call  arg1f

      ret   4

exclog      endp
;--------------------------------

; Exc Lock Set    func(203) (CBH)

;

; var

;     RetCode, Mode: Integer;

;

; RetCode := exclcks(Mode);

;
beginexclcks

      mov   ah,0CBH

      call  arg1

      ret   4

exclcks endp
;--------------------------------

; Exclusive file unlock (204) (CC)

;

; var

;     RetCode, FcbAddr: Integer;

;

; RetCode := exculkf(FcbAddr);

;
beginexculkf

      mov   ah,0CCH

      call  arg1f

      ret   4

exculkf endp
;--------------------------------

; Exclusive Unlock Set (205)(CD)

;

; var

;     RetCode: Integer;

;

; RetCode := exculks;

;
beginexculks

      mov   ah,0CDH

      int   21h

      mov   ah,00h

      ret

exculks endp
;--------------------------------

; Exc Clear file func(206) (CEH)

;

; var

;     RetCode, FcbAddr: Integer;

;

; RetCode := excclrf(FcbAddr);

;
beginexcclrf

      mov   ah,0CEH

      call  arg1f

      ret   4

excclrf endp
;--------------------------------

; Exc Clear Set  func(207) (CFH)

;

; var

;     RetCode: Integer;

;

; RetCode := excclrs;

;
beginexcclrs

      mov   ah,0CFH

      int   21h

      mov   ah,00h

      ret

excclrs endp
;--------------------------------

; Log Record(s) func(208) (D0H)

;

; var

;     RetCode, Flag, Timeout: Integer ;

;     RecStr      : String[n];

;

; RetCode := reclog(RecStr,Flag,Timeout);

;
beginreclog

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+4]; load flags

      mov   ax,[si]

      lds   si,[bp+x]   ; get timeout

      mov   si,[si]

      lds   dx,[bp+x+8]; get ptr to string

      ; incdx

      mov   bp,si      ; move timeout to BP

      mov   ah,0D0h

      int   21h

      mov   ah,0

      pop   ds

      pop   bp

      ret   14

reclog      endp
;--------------------------------

; Record Lock func(209) (D1H)

;

; var

;     RetCode, Mode: Integer;

;

; RetCode := reclck(Mode);

;
beginreclck

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x]

      mov   bp,[si]

      mov   ah,0D1h

      int   21h

      mov   ah,0

      pop   ds

      pop   bp

      ret   6

reclck      endp
;--------------------------------

; Record Unlock func(210) (D2H)

;

; var

;     RetCode   : Integer;

;     Semaphore: String[n];

;

; RetCode := reculk(Semaphore);

;
beginreculk

      mov   ah,0D2H

      call  arg1a

      ret   4

reculk      endp
;--------------------------------

; Unlock Record Set func(211) (D3H)

;

; var

;     RetCode: Integer;

;

; RetCode := reculks;

;
beginreculks

      mov   ah,0D3H

      int   21h

      mov   ah,00h

      ret

reculks endp
;--------------------------------

; Record Clear func(212) (D4H)

;

; var

;     RetCode   : Integer;

;     Semaphore: String[n];

;

; RetCode := recclr(Semaphore);

;
beginrecclr

      mov   ah,0D4H

      call  arg1a

      ret   4

recclr      endp
;--------------------------------

; Clear record set func(213) (D5H)

;

; var

;     RetCode: Integer;

;

; RetCode := recclrs;

;
beginrecclrs

      mov   ah,0D5H

      int   21h

      mov    продолжение
--PAGE_BREAK--   ah,00h

      ret   4

recclrs endp
;--------------------------------

; End of Job  func(214) (D6H)

;

; var

;     RetCode: Integer;

;

; RetCode := eoj;

;
begineoj

      mov   ah,0D6H

      int   21h

      mov   ah,00h

      ret   4

eoj   endp
;--------------------------------

; Logout System  func(215) (D7H)

;

; var

;     RetCode: Integer;

;

; RetCode := sysout;

;
beginsysout

      mov   ah,0D7H

      int   21h

      mov   ah,00h

      ret   4

sysout      endp
;--------------------------------

; Vol Statistics func(218) (DAH)

;

; var

;     RetCode,volume: Integer;

;     reply  : String[n];

;

; RetCode := volstat(volume, reply);
beginvolstat

      mov   ah,0DAh

      push  bp

      mov   bp,sp

      push  ds

      push  es

      lds   si,[bp+x+4]; addr for the volume number

      mov   dx,[si]           ; get the volume number

      les   di,[bp+x]   ; ptr to reply buffer

      inc   di          ; add 1 to get the address of the string

      int   21h

      mov   ah,00h

      pop   es

      pop   ds

      pop   bp

      ret   8

volstat endp
;--------------------------------

; Local Disks  func(219) (DBH)

;

; var

;     NumDisks: Integer;

;

; NumDisks := locdrv;

;
beginlocdrv

      mov   ah,0DBH

      int   21h

      mov   ah,00h

      ret

locdrv endp
;--------------------------------

; WorkStation ID func(220) (DCH)

;

; note: This routine returns the station number as an integer.

;     It can also be returned in ASCII with this call.

;

; var

;     StationNum: Integer;

;

; StationNum := wsid;

;
beginwsid

       mov     ah,0DCH

       int     21h

       mov     ah,00h

       ret

wsid   endp
;--------------------------------

; Set Error mode func(221) (DDH)

;

; var

;     mode: Integer;

;

; errmode(mode);

;
beginerrmode

      mov   ah,0DDH

      call  arg1

      ret   4

errmode endp
;--------------------------------

; Broadcast Mode func(222) (DEH)

;

; var

;     mode: Integer;

;

; bcsmode(mode);

;
beginbcsmode

      mov   ah,0DEH

      call  arg1

      ret   4

bcsmode endp
;--------------------------------

; Modify LST Device  func(223) (DFH)

;

; var

;     RetCode, Mode: Integer;

;

; RetCode := ctlspl(Mode);

;
beginctlspl

      mov   ah,0DFh

      call  arg1

      ret   4

ctlspl      endp
;--------------------------------

; Spool Request func(224) (E0H)

;

; var

;     ErrCode         : Integer;

;     RequestBlock, Reply: String[n];

;

; ErrCode := splreq(RequestBlock, Reply);

;
beginsplreq

      mov   ah,0E0h

      call  req_rep

      ret   8

splreq      endp
;--------------------------------

; Pipe Request func(225) (E1H)

;

; var

;     ErrCode         : Integer;

;     RequestBlock, Reply: String[n];

;

; ErrCode := pipreq(RequestBlock, Reply);

;
beginpipreq

      mov   ah,0E1h

      call  req_rep

      ret   8

pipreq      endp
;--------------------------------

; Directory Path func(226) (E2H)

;

; var

;     ErrCode         : Integer;

;     RequestBlock, Reply: String[n];

;

; ErrCode := dpath(RequestBlock, Reply);

;
begindpath

      mov   ah,0E2h

      call  req_rep

      ret   8

dpathendp
;--------------------------------

; Login system func(227) (E3H)

;

; var

;     ErrCode         : Integer;

;     RequestBlock, Reply: String[n];

;

; ErrCode := syslog(RequestBlock, Reply);

;
beginsyslog

      mov   ah,0E3h

      call  req_rep

      ret   8

syslog      endp
;--------------------------------

; Set File Attribute func(228) (E4H)

;

; var

;     RetCode, FcbAddr, Attribute: Integer;

;

; RetCode := fattr(FcbAddr, Attribute);

;
beginfattr

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x]

      mov   cx,[si]           ; cx = attribute

      lds   dx,[bp+x+4]; dx = address of fcb

      mov   ah,0E4h

      int   21h

      mov   ah,0

      pop   ds

      pop   bp

      ret

fattrendp
;--------------------------------

; Update file size func(229) (E5H)

;

; var

;     ErrCode,FcbAddr: Integer;

;

; ErrCode := updfcb(FcbAddr);

;
beginupdfcb

      mov   ah,0E5H

      call  arg1f

      ret   4

updfcb      endp
;--------------------------------

; Copy File to File func(230) (E6H)

;

; var

;     RetCode,FcbSource,FcbDest: Integer;

;     CountLow, CountHigh       : Integer;

;

; RetCode := cpyfile(FcbSource, FcbDest, CountLow, CountHigh)

;

;
begincpyfile

      mov   ah,0E6h

      push  bp

      mov   bp,sp

      push  ds

      push  es

      lds   si,[bp+x]   ; addr of the high byte cnt

      mov   dx,[si]           ; dx=high word of byte cnt

      lds   si,[bp+x+4]; addr low word of byte cnt

      mov   cx,[si]           ; cx=low 16 bits of count

      les   di,[bp+x+8]; address of dest fcb

      lds   si,[bp+x+12]      ; address of the source fcb

      int   21h

      mov   ah,0

      pop   es

      pop   ds

      pop   bp

      ret   16

cpyfile endp
;--------------------------------

; get time / date string func(231) (E7H)

;

; var

;     time: String[n];

;

; nettod(time);

;

; where time is a string of the form Y M D H M S

;
beginnettod

      mov   ah,0E7h

      call  arg1a

      ret   4

nettod      endp
;--------------------------------

; Set Close mode func(232) (E8H)

;

; var

;     mode: Integer;

;

; clsmode(mode);

;
beginclsmode

      mov   ah,0E8H

      call  arg1wor

      ret   4

clsmode endp
;--------------------------------

; Shell Base Status func(233) (E9H)

;

; var

;     RetFlags, drive: Integer;

;

; RetFlags := drvmap(drive);

;
begindrvmap

      mov   ax,0E900h

      call  arg1

      ret   4

drvmap      endp
;--------------------------------

; Return Shell Version func(234) (EAH)

;

; var

;     RetCode, Mode: Integer;

;     EnvirStr      : String[n];

;

; RetCode := retshl(EnvirStr, Mode);

;
beginretshl

      push  bp

      mov   bp,sp

      push  ds

      push  es

      les   di,[bp+x+4]; set es:di to point at the buffer

      inc   di          ; point di at the start of the data area

      lds   si,[bp+x]   ; put the mode into al

      mov   ax,[si]

      mov   ah,0EAh

      int   21h

      mov   ah,00h

      pop   es

      pop   ds

      pop   bp

      ret   8

retshl      endp
;--------------------------------

; ascii log File (235) (EB)

;

; var

;     RetCode, Flags, TimeOut: Integer;

;     Asciiz                  : String[n];

;

; RetCode := asclog(Flags, TimeOut, Asciiz);

;
beginasclog

      push  bp

      mov   bp,sp

      push  ds

      lds   si,[bp+x+8]

      mov   ax,[si]           ; flags into al

      lds   dx,[bp+x]   ; pointer to the asciiz string

      lds   si,[bp+x+4]

      mov   bp,[si]           ; time out into bp

      mov   ah,0EBH

      int   21h

      mov   ah,00h

      pop   ds

      pop   bp

      ret   12

asclog      endp
;--------------------------------

; ASCIIZ file unlock (236) (EC)

;

; var

;     RetCode: Integer;

;     Asciiz      : String[n];

;

; RetCode := asculkf(Asciiz);

;
beginasculkf

      mov   ah,0ECH

      call  arg1a

      ret   4

asculkf endp
;--------------------------------

; ASCIIZ Clear file func(237) (EDH)

;

; var

;     RetCode: Integer;

;     Asciiz      : String[n];

;

; RetCode := ascclrf(Asciiz);

;
beginascclrf

      mov   ah,0EDH

      call  arg1a

      ret   4

ascclrf endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Get Physical Station Number  EEH

;

; var

;     StationNo: Integer;

;

; StationNo := Get_PSN;

;
beginGet_PSN

      mov   ah,0EEh

      int   21h

      mov   ah,0

      ret

Get_PSN endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Get Shell Table Addresses (239) EFH

;

; var

;     Mode,Segment,Offset: Integer;

;

; Get_STA(Mode,Segment,Offset);

;
beginGet_STA

      push  bp

      mov   bp,sp

      push  es

      push  ds

      mov   si,[bp+x+8]; get the mode

      mov   ax,[si]

      mov   ah,0EFh     ; set the function

      int   21h

      lds   di,[bp+x+4]; store the segment location

      mov   [di],es

      lds   di,[bp+x]   ; store the offset location

      mov   [di],si

      pop   ds

      pop   es

      pop   bp

      ret   12

Get_STA endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;

; Set Preferred File Server (240) F0H

;

; var

;     RetServer, Mode, NewServ: Integer;

;

; RetServer := SetServ(Mode,NewServ);

;
beginSetServ

      push  bp

      mov   bp,sp

      push  ds

      mov   si,[bp+x+4]; get the mode

      mov   ax,[si]

      mov   di,[bp+x]   ; set the preferred server number

      mov   dx,[di]

      mov   ah,0F0h     ; set the function
    продолжение
--PAGE_BREAK--
еще рефераты
Еще работы по коммуникациям