А. Робачевский - Операционная система UNIX (1114671), страница 90
Текст из файла (страница 90)
Онинициируется пользователем транспортных услуг исвидетельствует либо об отказе пользователем вустановлении связи, либо о желании пользователяразорвать уже существующее соединение для дан%ного потока. Сообщение состоит из одного блоказа которым может следовать один илинесколько блоков типа M_DATA, содержащих при%кладные данные, определенныеБлок M_PROTO содержит следующие поля:PRIM_typeТип примитива —Идентификатор соединенияИндикация разрыва связи.Этот примитив применим только для транспорт%ных услуг с предварительным установлением свя%зи и свидетельствует о том, что удаленный поль%зователь либо отказывает в установлении связи,либо желает разорвать существующее соедине%ние.
Сообщение состоит из одного блокаM_PROTO, за которым может следовать один илинесколько блоков типасодержащих при%кладные данные, определенные пользователем.Блок M_PROTO содержит следующие поля:Тип примитива — T_DISCON_INDПричина разрыва связиИдентификатор соединенияЗапрос на "аккуратное" прекращение связи.Этот примитив применим только для транспортныхуслуг с предварительным установлением связи иуказывает поставщику транспортных услуг, что поль%зователь завершил передачу данных. При этом со%единение переходит в симплексный режим, позво%ляя пользователю принимать данные от удаленногоузла.
Сообщение состоит из одного блокаИндикация "аккуратного" прекращения связи.Этот примитив применим только для транспорт%ных услуг с предварительным установлением свя%зи и отправляется пользователю транспортныхуслуг, свидетельствуя о том, что удаленный поль%зователь соединения завершил передачу данных.При этом соединение переходит в симплексныйрежим, позволяя пользователю передавать дан%ные удаленному узлу. Сообщение состоит из од%ного блока м PROTO.www.books-shop.com477сети в UNIX System VТаблица 6.10 (продолжение)Транспортный ТиппримитивобщенияТREQM PROTOЗапрос на передачу данных.Этот примитив применим только для транспорт%ных услуг без предварительного установлениясвязи и отправляется пользователем транспорт%ных услуг в качестве запроса на передачу дата%граммы.
Сообщение состоит из одного блокаM_PROTO, за которым может следовать один илинесколько блоков типасодержащих при%кладные данные пользователя. Блоксодержит значение размера адреса и сам адресполучателяа также опции, связан%ные с этим примитивом.Блоксодержит следующие поля:PRIM_typeDEST_lengthТип примитива —Размер адреса протоколаСмещение адреса получателя в бло%кеРазмер опцийСмещение опций в блоке PROTOОРТ offsetТM PROTOИндикация получения данных.Этот примитив применим только для транспорт%ных услуг без предварительного установлениясвязи и указывает пользователю, что поставщи%ком транспортных услуг получена датаграмма отудаленного узла.
Сообщение состоит из одногоблоказа которым может следоватьодин или несколько блоков типасодер%жащих прикладные данные пользователя. Блоксодержит значение адреса отправителядатаграммы, а также опции, связанные с этимпримитивом.БлокSRC_offsetOPT_lengthОРТ offsetсодержит следующие поля:Тип примитива —Размер адреса протоколаСмещение адреса отправителя вблокеРазмер опцийСмещение опций в блоке M PROTOwww.books-shop.comГлава 6.478сети в операционной системе UNIXТаблица 6.10 (продолжение)Транспортный Тип со[примитивобщенияЗначениеТ UDERRORСообщение об ошибкеЭтот примитив применим только для транспортныхуслуг без предварительного установления связи иуказывает пользователю, что датаграмма с указан%ным адресом получателя и опциями вызвала ошиб%ку.
Сообщение состоит из одного блокасодержащего размер адреса и сам адрес получа%теля, опции, а также код ошибки, зависящий отконкретного транспортного протокола.Блоксодержит следующие поля:Тип примитива — T_UDERROR_INDDEST_length Размер адреса протоколаDEST_offset Смещение адреса отправителя вблокеРазмер опцийf setСмещение опций в блокеERROR_typeКод ошибкиЗапрос на передачу данных.Этот примитив применим только для транспортныхуслуг без предварительного установления связи иинформирует поставщика транспортных услуг, чтосообщение содержит пакет данных интерфейса(Transport Interface Data Unit,Одно или болеетаких сообщений формируют пакет данных прото%кола TSDU. Сообщение состоит из одного блоказа которым может следовать один илинесколько блоков типасодержащих при%кладные данные пользователя.
Блоксо%держит флагlag, указывающий, являетсяли следующее сообщениечастьютого же TSDU. На основании этого флага постав%щик транспортных услуг компонует транспортныепакеты TSDU. Передача данных с помощью запро%совпозволяет сохранить границызаписи при передаче. Заметим, что протоколомTCP данная возможность не поддерживается.Индикация получения данных.Этот примитив применим только для транспорт%ных услуг без предварительного установлениясвязи и информирует пользователя, что сообще%ние содержит пакет данных интерфейса TIDU.Сообщение состоит из одного блока M_PROTO, закоторым может следовать один или несколькоблоков типасодержащих прикладныеданные удаленного пользователя.
Блоксодержит флагпозволяющий поль%зователю определить границы TSDU.M PROTOM_PROTOwww.books-shop.com479сети в UNIX System VТаблица 6.10 (продолжение)ТранспортныйпримитивТип со[общенияЗначениеТ EXDATA REQM PROTOЗапрос на передачу экстренных данных.Этот примитив аналогиченно слу%жит для передачи экстренных данных. ПротоколTCP поддерживает передачу экстренных данных спомощью функции t_snd(3N) с аргументом flags,содержащим флаг T_EXPEDITED и, возможно,Т MORE.Т EXDATAM PROTOИндикация получения экстренных данных.Этот примитив аналогичен T_DATA_IND, но служитдля передачи пользователю экстренных данных.Положительное подтверждение.Этот примитив сообщает пользователю транс%портных услуг, что предшествующий примитив,инициированный им, был успешно принят по%ставщиком транспортных услуг. В то же время,получение подтверждения не означает, что по%ставщиком были совершены какие%либо действия,связанные с предыдущим примитивом.
Сообще%ние состоит из одного блока M_PCPROTO в кото%ром хранится тип подтвержденного примитиваCORRECT prim.Т ERROR ACKM PCPROTOСообщение об ошибке.Этот примитив сообщает пользователю услуг,последний примитив, инициированный им, вызвалошибку. Получение этого примитива может рассмат%риваться как отрицательное подтверждение, свиде%что никаких действий, связанных сошибочным примитивом, не было предпринято. Со%общение состоит из одного блокасо%держащего тип примитива, вызвавшего ошибку, кодTLI и код системной ошибки UNIX.Блок M_PCPROTO содержит следующие поля:PRIM_typeТип примитива —Тип ошибочного примитиваTLI_errorКод ошибки TLIUNIX errorКод системной ошибки UNIXТ INFO REQM PCPROTOЗапрос на получение параметров транспортногопротокола.Этот примитив служит для запроса пользователемзначений размеров различных параметров прото%кола, а также информации о текущим состояниипоставщика транспортных услуг.
Сообщение со%стоит из одного блока PCPROTO.Ⱦɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com480Глава 6.сети в операционнойUNIXТаблица 6.10 (продолжение)Транспортный Тип со[примитивобщенияЗначениеT_INFO_ACKПараметры транспортного протокола.Этот примитив служит для передачи пользователюранее запрошенных с помощьюпара%метров транспортного протокола. Сообщение состо%ит из одного блокасодержащего ин%формацию, часть из которой возвращается функци%ей t_open(3N), рассмотренной в разделе "Програм%мный интерфейсранее в этой главе.Блок M_PCPROTO состоит из следующих полей:Тип примитива — T_INFO_ACKTSDU_sizeОпределяет максимальный раз%мер пакета данных протоколаTSDUETSDU_sizeОпределяет максимальный раз%мер пакета экстренных данныхпротокола ETSDUОпределяет максимальный обь%CDATA sizeем данных, передаваемых приустановлении связи.
Соответст%вует полю connect структурыфункции t_open(3N)DDATA sizeОпределяет максимальныйем данных, передаваемых приразрыве связи. Соответствуетполюструктуры infoфункцииADDR sizeОпределяет максимальныйем транспортного протокола.Соответствует полю addr струк%турыфункцииOPT sizeОпределяет размер опций дляданного протокола. Соответству%ет полю options структурыфункцииsizeОпределяет размер пакета дан%ных интерфейса TIDUSERV typeОпределяет тип транспортныхуслуг, предоставляемых постав%щикомСоответствует полю servtypeструктурыinfoфункцииt_open(3N)CURRENT stateОпределяет текущее состояниепоставщика транспортных услугОпределяетдополнительныеPROVIDER_flagхарактеристикипоставщикатранспортных услугM_PCPROTOwww.books-shop.com481в UNIX System VТаблица 6.10 (окончание)Транспортный Тип со[примитивобщенияЗначениеТУправление опциями протокола.Этот примитив позволяет пользователю получитьили установить опции протокола.
Сообщение со%стоит из одного блока M_PROTO, включающегоследующие поля:Тип примитива —OPT_lengthРазмер опцийСмещение опций в блокеФлаги, определяющие характерзапроса пользователя:T_NEGOTIATE — установить опции,указанные пользователем. В ре%зультате опции, установленныепоставщиком, могут отличаться отзаказанных;Т_СНЕСК — проверить, поддержи%ваются ли опции, указанные поль%зователем, поставщиком;T_DAFAULT — возвратить значенияопций протокола.Положительное подтверждение.Этот примитив подтверждает завершение опера%ции с опциями протокола, заказанными пользова%телем. Сообщение состоит из одного блокавключающего те же поля, что иREQТ OPTMGMT АСКPROTOM PCPROTOТ OPTMGMT REQ.Взаимодействие с прикладными процессамиРассмотренный ранее программный интерфейс ТЫ полностью реализуетфункциональность TPI. Легко заметить соответствие между отдельнымифункциями ТЫ и примитивами TPI, приведенными в табл.Схемавызова функций ТЫ и обмена соответствующими примитивами TPI междуклиентом и сервером для типичного TCP!сеанса приведена на рис.
6.32.Программный интерфейс потоков был рассмотрен в главе 5 при обсужде!нии подсистемы STREAMS. Основными функциями, обеспечивающимипередачу и получение сообщений, являются системные вызовыиgetmsg(2). Таким образом, большинство функций ТЫ, составляющих про!граммный интерфейс доступа прикладных процессов к транспортным про!токолам, являются удобной оболочкой (реализованной в виде библиотеки,например,более фундаментальным системным вызовами getmsg(2).www.books-shop.com482Глава 6.сети в операционнойUNIXРис. 6.32. Функции TLI и примитивы TPIВ качестве примера рассмотрим функциюможет иметь следующий вид:Ее реализацияwww.books-shop.comсети в UNIX System Vint{structstructstructstructstructstructcharint483struct t_call *sndcall,struct t_callT_conn_conT_ok_ackT_error_ackstrbuf connect, ack, confirm,netbufaddr, opt, udata;адреса буферов netbuf запроса sndcall*/addr =opt =udata =поля структуры strbuf для формирования управляющей частисообщения=++ opt.len;=Т conn req) ++buf = (char= buf;(блокполя заголовка блока M_PROTO сообщениясоответствии с форматом структурыconnreq = (struct T_conn_req=connreq>DEST_length =connreq>DEST_offset = sizeof (structbuf +===в+buf +=поля структуры strbuf для формирования блока данных (блок===запрос Т CONN REQ поставщику транспортных услуг по потоку&connect,к приемуВыделим максимальный размер дляполучения негативного подтверждения, посколькуТзанимает больше== (charявляется приоритетным, поэтому установим флаг RS HIPRI.До получения подтверждения не предпринимаем никакихwww.books-shop.com484Глава 6.сети вUNIXflags = RS_HIPRI;(struct*)0,okack = (struct T_ok_ackполучено ли положительное или негативноеif=={/*Если подтверждениеподготовимся к получению согласияудаленного пользователя на установление связи (примитивif (recvcall != NULL){=opt =udata ==T_conn_con) +=++T_conn_con)+buf = (char= buf;===примитивconncon = (struct T_conn_conif=={/*Если это действительно согласие, заполним структуру rcvcall дляпользователя==offset,закончилось удачно — возвращаем}}else{/*В случае отказа мы готовы обработать примитивelsewww.books-shop.comсети в UNIX System V/*Если получен примитивerrack = (struct T_error_ack— обработаем}}Подобным образом реализовано большинство функций ТЫ.