Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Вообще говоря, сетевая архитектура, основанная на архитектуре STREAMS, позволяет обеспечить поддержку любого стека протоколов, соответствующего модели OSI. Поэтому выражаясь более точно, перечисленные интерфейсы определяют взаимодействие транспортного уровня и уровня сеанса, и уровня канала и сетевого уровня, соответственно. Эти рассуждения проиллюстрированы на рис. 6.31. [93]

Рис. 6.31. Интерфейсы взаимодействия модулей протоколов

93

Говоря еще более строго, данные интерфейсы определены самой моделью OSI. Однако в данной главе мы остановимся на практической реализации этих интерфейсов в подсистеме STREAMS.

Интерфейс TPI

TPI представляет собой интерфейс предоставления услуг транспортного уровня OSI модели как с предварительным установлением соединения (connection mode), так и без установления соединения (connectionless mode). Стандартизация этого интерфейса позволяет изолировать особенности реализации транспортного уровня от потребителя этих услуг и, тем самым, предоставить возможность разработки программного обеспечения, независимо от конкретного протокола и услуг им предоставляемых.

TPI определяет набор и формат сообщений, с помощью которых протоколы верхнего уровня взаимодействуют с модулем транспортного протокола. Таким образом, TPI является интерфейсом между поставщиком транспортных услуг (transport provider) и пользователем этих услуг (transport user). Эти сообщения определяют транспортные примитивы (transport primitive), или команды, и могут иметь следующий формат:

 Сообщение состоит из блока типа

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

 Сообщение состоит из одного блока

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

 Сообщение состоит из одного или более блоков

M_DATA
, в которых передаются данные прикладной программы.

Таблица 6.10. Основные управляющие сообщения TPI

Транспортный примитив Тип сообщения Значение
T_BIND_REQ
M_PROTO
Запрос на связывание. Этот примитив инициируется пользователем транспортных услуг и запрашивает связывание потока с адресом протокола. Сообщение
состоит из одного блока
M_PROTO
, который содержит значение адреса и заказанное максимальное число запросов, ожидающих обслуживания со стороны пользователя. Последний параметр игнорируется для транспортных услуг без предварительного установления связи. Блок
M_PROTO
содержит следующие поля:
PRIM type
Тип примитива —
T_BIND_REQ
ADDR_length
Размер адреса протокола
ADDR_offset
Смещение адреса в блоке
M_PROTO
CONIND_number
Максимальное число запросов, ожидающих обслуживания
T_BIND_ACK
M_PCPROTO
Подтверждение получения запроса на связывание. Этот примитив отправляется пользователю транспортных услуг и означает, что поток был связан с адресом протокола, заказанное максимальное число ожидающих запросов допустимо и поток был активизирован. Сообщение состоит из одного блока
M_PCPROTO
, содержащего значения указанных параметров. Заметим, что возвращаемый адрес может не совпадать с адресом, указанным в запросе
T_BIND_REQ
. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_BIND_ACK
ADDR_length
Размер адреса протокола
ADDR_offset
Смещение адреса в блоке
M_PROTO
CONIND_number
Максимальное число запросов, ожидающих обслуживания
T_UNBIND_REQ
M_PROTO
Запрос на уничтожение связывания. Этот примитив инициируется пользователем транспортных услуг и запрашивает у поставщика уничтожение ранее созданного связывания потока с адресом протокола и деактивизацию потока.
T_CONN_REQ
M_PROTO
Запрос на установление связи. Этот примитив применим только для транспортных услуг с предварительным установлением связи. Он инициируется пользователем транспортных услуг и запрашивает установление связи с указанным адресатом. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные, определенные пользователем. Заметим, что протокол TCP не позволяет передавать прикладные данные вместе с запросом. Блок
M_PROTO
содержит значение адреса получателя и опции, связанные с этим примитивом. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_CONN_REQ
DEST_length
Размер адреса протокола
DEST_offset
Смещение адреса получателя в блоке
M_PROTO
ОРТ_length
Размер опций
ОРТ_offset
Смещение опций в блоке
M_PROTO
T_CONN_IND
M_PROTO
Индикация установления связи. Этот примитив применим только для транспортных услуг с предварительным установлением связи и свидетельствует о том, что удаленным пользователем с указанным адресом был сделан запрос на установление связи. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные, определенные пользователем. Блок
M_PROTO
содержит значение адреса удаленного пользователя, отправившего запрос на установление связи, а также опции, связанные с этим примитивом. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_CONN_IND
SRC_length
Размер адреса протокола
SRC_offset
Смещение адреса отправителя в блоке
M_PROTO
OPT_length
Размер опций
OPT_offset
Смещение опций в блоке
M_PROTO
SEQ_number
Идентификатор соединения
T_CONN_RES
M_PROTO
Ответ на запрос на установление связи. Этот примитив применим только для транспортных услуг с предварительным установлением связи и свидетельствует о том, что поставщик транспортных услуг принимает предшествующий запрос на установление связи. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные, определенные пользователем. Блок
M_PROTO
содержит указатель на очередь чтения потока, который будет обрабатывать запрос. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_CONN_RES
QUEUE_ptr
Указатель на очередь потока, который должен быть использован в качестве узла созданного соединения
OPT_length
Размер опций
OPT_offset
Смещение опций в блоке
M_PROTO
SEQ_number
Идентификатор соединения
T_CONN_CON
M_PROTO
Подтверждение установления связи. Этот примитив применим только для транспортных услуг с предварительным установлением связи. Он отправляется пользователю транспортных услуг в качестве подтверждения установления связи с удаленным пользователем. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные, определенные пользователем. Блок
M_PROTO
содержит значение размера адреса, сам адрес удаленного пользователя, обслуживающего соединение, а также опции, связанные с этим примитивом. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_CONN_CON
RES_length
Размер адреса протокола
RES_ offset
Смещение адреса удаленного узла в блоке
M_PROTO
OPT_length
Размер опций
ОРТ_offset
Смещение опций в блоке
M_PROTO
Т_DISCON_REQ
M_PROTO
Запрос на разрыв связи. Этот примитив применим только для транспортных услуг с предварительным установлением связи. Он инициируется пользователем транспортных услуг и свидетельствует либо об отказе пользователем в установлении связи, либо о желании пользователя разорвать уже существующее соединение для данного потока. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные, определенные пользователем. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_DISCON_REQ
SEQ_number
Идентификатор соединения
Т_DISCON_IND
M_PROTO
Индикация разрыва связи. Этот примитив применим только для транспортных услуг с предварительным установлением связи и свидетельствует о том, что удаленный пользователь либо отказывает в установлении связи, либо желает разорвать существующее соединение. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные, определенные пользователем. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_DISCON_IND
DISCON_reason
Причина разрыва связи
SEQ_number
Идентификатор соединения
Т_ORDREL_REQ
M_PROTO
Запрос на "аккуратное" прекращение связи. Этот примитив применим только для транспортных услуг с предварительным установлением связи и указывает поставщику транспортных услуг, что пользователь завершил передачу данных. При этом соединение переходит в симплексный режим, позволяя пользователю принимать данные от удаленного узла. Сообщение состоит из одного блока
M_PROTO
.
Т_ORDREL_IND
M_PROTO
Индикация "аккуратного" прекращения связи. Этот примитив применим только для транспортных услуг с предварительным установлением связи и отправляется пользователю транспортных услуг, свидетельствуя о том, что удаленный пользователь соединения завершил передачу данных. При этом соединение переходит в симплексный режим, позволяя пользователю передавать данные удаленному узлу. Сообщение состоит из одного блока
M_PROTO
.
T_UNIDATA_REQ
M_PROTO
Запрос на передачу данных. Этот примитив применим только для транспортных услуг без предварительного установления связи и отправляется пользователем транспортных услуг в качестве запроса на передачу дата- граммы. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные пользователя. Блок
M_PROTO
содержит значение размера адреса и сам адрес получателя датаграммы, а также опции, связанные с этим примитивом. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_UNIDATA_REQ
DEST_length
Размер адреса протокола
DEST_offset
Смещение адреса получателя в блоке
M_PROTO
OPT_length
Размер опций
ОРТ_offset
Смещение опций в блоке
M_PROTO
Т_UNITDATA_IND
M_PROTO
Индикация получения данных. Этот примитив применим только для транспортных услуг без предварительного установления связи и указывает пользователю, что поставщиком транспортных услуг получена датаграмма от удаленного узла. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные пользователя. Блок
M_PROTO
содержит значение адреса отправителя датаграммы, а также опции, связанные с этим примитивом. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_UNIDATA_IND
SRC length
Размер адреса протокола
SRC_offset
Смещение адреса отправителя в блоке
M_PROTO
OPT_length
Размер опций
ОРТ_offset
Смещение опций в блоке
M_PROTO
T_UDERROR_IND
M_PROTO
Сообщение об ошибке датаграммы. Этот примитив применим только для транспортных услуг без предварительного установления связи и указывает пользователю, что датаграмма с указанным адресом получателя и опциями вызвала ошибку. Сообщение состоит из одного блока
M_PROTO
, содержащего размер адреса и сам адрес получателя, опции, а также код ошибки, зависящий от конкретного транспортного протокола. Блок
M_PROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_UDERROR_IND
DEST_length
Размер адреса протокола
DEST_offset
Смещение адреса отправителя в блоке
M_PROTO
OPT_length
Размер опций
OPT_offset
Смещение опций в блоке
M_PROTO
ERROR_type
Код ошибки
T_DATA_REQ
M_PROTO
Запрос на передачу данных. Этот примитив применим только для транспортных услуг без предварительного установления связи и информирует поставщика транспортных услуг, что сообщение содержит пакет данных интерфейса (Transport Interface Data Unit, TIDU). Одно или более таких сообщений формируют пакет данных протокола TSDU. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные пользователя. Блок
M_PROTO
содержит флаг
MORE_flag
, указывающий, является ли следующее сообщение
T_DATA_REQ
частью того же TSDU. На основании этого флага поставщик транспортных услуг компонует транспортные пакеты TSDU. Передача данных с помощью запросов
T_DATA_REQ
позволяет сохранить границы записи при передаче. Заметим, что протоколом TCP данная возможность не поддерживается.
T_DATA_IND
M_PROTO
Индикация получения данных. Этот примитив применим только для транспортных услуг без предварительного установления связи и информирует пользователя, что сообщение содержит пакет данных интерфейса TIDU. Сообщение состоит из одного блока
M_PROTO
, за которым может следовать один или несколько блоков типа
M_DATA
, содержащих прикладные данные удаленного пользователя. Блок
M_PROTO
содержит флаг
MORE_flag
, позволяющий пользователю определить границы TSDU.
Т_EXDATA_REQ
M_PROTO
Запрос на передачу экстренных данных. Этот примитив аналогичен
T_DATA_REQ
, но служит для передачи экстренных данных. Протокол TCP поддерживает передачу экстренных данных с помощью функции t_snd(3N) с аргументом
flags
, содержащим флаг
T_EXPEDITED
и, возможно,
T_MORE
.
T_EXDATA_IND
M_PROTO
Индикация получения экстренных данных. Этот примитив аналогичен
T_DATA_IND
, но служит для передачи пользователю экстренных данных.
T_OK_ACK
M_PCPROTO
Положительное подтверждение. Этот примитив сообщает пользователю транспортных услуг, что предшествующий примитив, инициированный им, был успешно принят поставщиком транспортных услуг. В то же время, получение подтверждения не означает, что поставщиком были совершены какие-либо действия, связанные с предыдущим примитивом. Сообщение состоит из одного блока
M_PCPROTO
в котором хранится тип подтвержденного примитива
CORRECT_prim
.
T_ERROR_ACK
M_PCPROTO
Сообщение об ошибке. Этот примитив сообщает пользователю услуг, последний примитив, инициированный им, вызвал ошибку. Получение этого примитива может рассматриваться как отрицательное подтверждение, свидетельствующее, что никаких действий, связанных с ошибочным примитивом, не было предпринято. Сообщение состоит из одного блока
M_PCPROTO
, содержащего тип примитива, вызвавшего ошибку, код TLI и код системной ошибки UNIX. Блок
M_PCPROTO
содержит следующие поля:
PRIM_type
Тип примитива —
T_ERROR_ACK
ERROR_prim
Тип ошибочного примитива
TLI_error
Код ошибки TLI
UNIX_error
Код системной ошибки UNIX
T_INFO_REQ
M_PCPROTO
Запрос на получение параметров транспортного протокола. Этот примитив служит для запроса пользователем значений размеров различных параметров протокола, а также информации о текущим состоянии поставщика транспортных услуг. Сообщение состоит из одного блока
M_PCPROTO
.
T_INFO_ACK
M_PCPROTO
Параметры транспортного протокола. Этот примитив служит для передачи пользователю ранее запрошенных с помощью
T_INFO_REQ
параметров транспортного протокола. Сообщение состоит из одного блока
M_PCPROTO
, содержащего информацию, часть из которой возвращается функцией t_open(3N), рассмотренной в разделе "Программный интерфейс сокетов" ранее в этой главе. Блок
M_PCPROTO
состоит из следующих полей:
PRIM_type
Тип примитива —
T_INFO_ACK
TSDU_size
Определяет максимальный размер пакета данных протокола TSDU
ETSDU_size
Определяет максимальный размер пакета экстренных данных протокола ETSDU
CDATA_size
Определяет максимальный объем данных, передаваемых при установлении связи. Соответствует полю
connect
структуры
info
функции t_open(3N)
DDATA_size
Определяет максимальный объем данных, передаваемых при разрыве связи. Соответствует полю
discon
структуры
info
функции t_open(3N)
ADDR_size
Определяет максимальный объем транспортного протокола. Соответствует полю
addr
структуры
info
функции t_open(3N)
OPT_size
Определяет размер опций для данного протокола. Соответствует полю
options
структуры
info
функции t_open(3N)
TIDU_size
Определяет размер пакета данных интерфейса TIDU
SERV_type
Определяет тип транспортных услуг, предоставляемых поставщиком. Соответствует полю
servtype
структуры
info
функции t_open(3N)
CURRENT_state
Определяет текущее состояние поставщика транспортных услуг
PROVIDER_flag
Определяет дополнительные характеристики поставщика транспортных услуг
T_OPTMGMT_REQ
M_PROTO
Управление опциями протокола. Этот примитив позволяет пользователю получить или установить опции протокола. Сообщение состоит из одного блока
M_PROTO
, включающего следующие поля:
PRIM_type
Тип примитива —
T_OPTMGMT_REQ
OPT_length
Размер опций
ОРТ_offset
Смещение опций в блоке
M_PROTO
MGMT_flags
Флаги, определяющие характер запроса пользователя:
T_NEGOTIATE
 — установить опции, указанные пользователем. В результате опции, установленные поставщиком, могут отличаться от заказанных;
T_CHECK
 — проверить, поддерживаются ли опции, указанные пользователем, поставщиком;
T_DEFAULT
 — возвратить значения опций протокола.
T_OPTMGMT_ACK
M_PCPROTO
Положительное подтверждение. Этот примитив подтверждает завершение операции с опциями протокола, заказанными пользователем. Сообщение состоит из одного блока
M_PROTO
, включающего те же поля, что и
T_OPTMGMT_REQ
.

Взаимодействие с прикладными процессами

Рассмотренный ранее программный интерфейс TLI полностью реализует функциональность TPI. Легко заметить соответствие между отдельными функциями TLI и примитивами TPI, приведенными в табл. 6.10. Схема вызова функций TPI и обмена соответствующими примитивами TPI между клиентом и сервером для типичного TCP-сеанса приведена на рис. 6.32.

Рис. 6.32. Функции TLI и примитивы TPI

Программный интерфейс потоков был рассмотрен в главе 5 при обсуждении подсистемы STREAMS. Основными функциями, обеспечивающими передачу и получение сообщений, являются системные вызовы putmsg(2) и getmsg(2). Таким образом, большинство функций TLI, составляющих программный интерфейс доступа прикладных процессов к транспортным протоколам, являются удобной оболочкой (реализованной в виде библиотеки, например, libnsl.so) более фундаментальным системным вызовам putmsg(2) и getmsg(2).

В качестве примера рассмотрим функцию t_connect(3N). Ее реализация может иметь следующий вид:

int t_connect(int fd, struct t_call *sndcall,

struct t_call *recvcall) {

 struct T_conn_req *connreq;

 struct T_conn_con* conncon;

 struct T_ok_ack *okack;

 struct T_error_ack *errack;

 struct strbuf connect, ack, confirm, m_data;

 struct netbuf addr, opt, udata;

 char *buf;

 int flags;

 ...

 /* Сохраним адреса буферов netbuf запроса sndcall */

 addr = sndcall->addr; opt = sndcall->opt;

 udata = sndcall->udata;

 /* Заполним поля структуры strbuf для формирования

управляющей части (блок M_PROTO) сообщения T_CONN_REQ */

 connect.len =

sizeof(struct T_conn_req) + addr.len + opt.len;

 connect.maxlen =

sizeof(struct Т_conn_req) + addr.maxlen + opt.maxlen;

 buf = (char*)malloc(connect.maxlen);

 connect.buf = buf;

 /* Заполним поля заголовка блока M_PROTO сообщения T_CONN_REQ в

соответствии с форматом структуры T_conn_req */

 connreq = (struct T_conn_req*)buf;

 connreq->PRIM_type = T_CONN_REQ;

 connreq->DEST_length = addr.len;

 connreq->DEST_offset = sizeof (struct T_conn_req);

 buf += sizeof(struct T_conn_req);

 memcpy(buf, addr.buf, addr.len);

 connreq->OPT_length = opt.len;

 connreq->OPT_offset = connreq->DEST_offset + opt.len;

Поделиться:
Популярные книги

Сиротка 4

Первухин Андрей Евгеньевич
4. Сиротка
Фантастика:
фэнтези
попаданцы
6.00
рейтинг книги
Сиротка 4

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Не грози Дубровскому!

Панарин Антон
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому!

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Кровь и Пламя

Михайлов Дем Алексеевич
7. Изгой
Фантастика:
фэнтези
8.95
рейтинг книги
Кровь и Пламя

Мимик нового Мира 14

Северный Лис
13. Мимик!
Фантастика:
юмористическое фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 14

Шериф

Астахов Евгений Евгеньевич
2. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
6.25
рейтинг книги
Шериф

Месть за измену

Кофф Натализа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть за измену

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Я еще граф

Дрейк Сириус
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще граф

(Не) Все могут короли

Распопов Дмитрий Викторович
3. Венецианский купец
Фантастика:
попаданцы
альтернативная история
6.79
рейтинг книги
(Не) Все могут короли

Первый пользователь. Книга 3

Сластин Артем
3. Первый пользователь
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Первый пользователь. Книга 3

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Мимик нового Мира 13

Северный Лис
12. Мимик!
Фантастика:
боевая фантастика
юмористическая фантастика
рпг
5.00
рейтинг книги
Мимик нового Мира 13