Э. Таненбаум - Компьютерные сети. (4-е издание) (DJVU) (1130092), страница 158
Текст из файла (страница 158)
При этом мы сможем уделить максимум внимания 888 Глава 6. Транспортный уровень Таблица 6.3. Пакеты сетевого уровня, используемые в примере Сетевой пакет Значение САкЬНЕООЕЗТ САП АССЕРТЕО Събяй ЯЕООЕЗТ СЬЕАЯ СОМНЯМАТЮМ ОАТА СПЕО!Т Запрос соединения. Посылается для установки соединения Вызов принят. Ответ на САЬЬ ЯЕООЕЗТ Запрос разъединения. Посылается для разрыва соединения Подтверждение разъединения. Ответ на СкЕАй йЕООЕЗТ Данные Кредит.
Служебный пакет для управления окном При обращении к процедуре то пес транспортная сущность заполняет все значения параметров и передает их сетевому уровню. При вызове процедуры тгов пег сетевой уровень передает входящий пакет транспортной сущности. БлагодаРя передаче информации сетевому уровню в виде параметров процедуры вместо передачи самого входящего или исходящего пакета транспортная сущность оказывается защищенной от деталей протокола сетевого уровня. Если транспортная транспортным вопросам, не встречавшимся на более низких уровнях.
Среди прочих, к ним относятся установка соединения, Разрыв соединения и управление кредитованием. Подобным образом могла бы выглядеть простая транспортная служба, построенная на базе сети АТМ. В общем случае транспортная сушность может быть либо частью операционной системы, либо набором библиотечных процедур, работающих в здресном пространстве пользователя.
В целях упрощения нашего примера мы будем полагать, что здесь используются библиотечные процедуры, однако с помошью небольших изменений можно добиться того, чтобы транспортная суьнность стала частью операционной системы (эти изменения связаны в основном со способами доступа к буферам пользователя). Следует отметить, тем не менее, что в этом примере «транспортная сущность» в действительности вообще не является отдельной сушностью, а представляет собой часть пользовательского процесса. В частности, когда пользователь выполняет некий блокирующий примитив, например ~!5Тсл, вся транспортная сущность также блокируется.
Такое решение является вполне удовлетворительным для однозадачного хоста, но на хосте с несколькими пользовательскими процессами более естественным было бы иметь транспортную сущность в виде отдельного процесса, отличного от всех пользовательских процессов. Интерфейс с сетевым уровнем реализуется с помошью процедур 1о пе1 и Тгов пе1 (не показаны).
У каждой из них имеется по шесть параметров. Первый параметр означает идентификатор соединения, один в олин соответствующий сетевому виртуальному каналу. Следом идут биты Я и М, которые, будучи установленными в 1, означают, соответственно, управляющее сообщение и то, что сообшение будет продолжено в следующем пакете. Следом за ними идет тип пакета, выбираемый из шести возможных, приведенных в табл.
6.3. Последние два параметра — это указатель на данные и целое число, указывающее на количество байтов данных. Простой транспортный протокол 888 Листинг 6.2. Пример транспортной сущности Убе!зле МАХ СОИМ 32 /* максииальное число одноврененных соединений "/ Убегзпе МАХ М58 517Е 8192 Убетзпе МАХ РКТ 517Е 512 Убег!пе Т(МЕООТ 20 Убей пе СЙЕО 1 Убег!пе ОК О /* иаксииальный размер сообщения в байтах */ /* максимальный размер пакета в байтах */ УбеПпе Ейй РОСС -1 Убег!пе Ейй йЕОЕСТ -2 Убег!пе Ейй СС05ЕО -3 Убег!пе СОИ Ейй -3 Куребе! зпг Сгапврогд аббгеяв: 1Уребе! епищ (САСС ЙЕО,СЯСС АСС,ССЕАЙ ЙЕО,ССЕАЙ СОИР ОАТА РКТ.СЙЕ01Т) рк! 'суре: Суребе! епищ (!ОСЕ,ИА1Т!ИО.ООЕОЕО,Е5ТАВС15НЕ0,5ЕИО!ИО,ЙЕСЕ!У!ИО,О!5СОИИ) св!асе: /* глобальные переиенные */ Сгапврогг аббгевв !!ввел аббгеяя; !пс !!всей сопп; *г ыпв!9пеб спаг бага!МАХ РКТ 517Е1: /* вреиенная область для пакетных данных */ сущность попытается послать пакет, когда в скользящем окне более низкого уровня нет свободных буферов, она приостановится в процедуре ьо пе1 до тех пор, пока в окне не появится место.
Для транспортной суШности зтот механизм прозрачен и управляется сетевым уровнем с помошью команд типа епаб!е сгапзрогг !ауег и бзваб!е сгапярогс 1ауег, аналогичных описанным в протоколах главы 3. Управление окном также осуществляется сетевым уровнем. Помимо зтого прозрачного механизма приостановки есть также процедуры в1еер и ыадеор (не показаны), вызываемые транспортной сущностью. Процедура 51еер вызывается, когда транспортная сущность логически блокирована ожиданием внешнего события, обычно прибытия пакета. После вызова процедуры з!еер транспортная сушность (и пользовательский процесс, конечно) останавливаются.
Программа транспортной сущности показана в листинге 6.2. Каждое соединение может находиться в одном из следуюШих семи состояний: 1. П)ЕŠ— соединение егце не установлено. 2. ЖА1Т1ХС вЂ” примитив СОИИЕСТ выполнен, пакет САСС йЕООЕ5Т послан. 3. ЩЕТ)ЕЕ! — пакет САСС ЙЕООЕ5Т прибыл. Примитив С!5ТЕИ еше не вызывался. 4. ЕЯТАВ( 1ЯНЕЕХ вЂ” соединение установлено. 5.
ЯЕХ131ХΠ— пользователь ожидает разрешения отправить пакет. 6. ЕЕСЕ1Ъ'1ХΠ— примитив ЙЕСЕ1ЧЕ выполнен. 7. ЕЗ15СОХХЕСТ1ХС вЂ” примитив 015СОИИЕСТ выполнен локально. Мехсду состояниями могут происходить переходы при одном из следующих событий: выполняется примитив, прибывает пакет или истекает время ожилания. 590 Глава б, Транспортный уровень гещоге аббгезз.
7* состояние етого соединения */ /* указатель на приенный буфер */ /* счетчик передачи/приема */ /* устанавливается при получении пакета /* используется для ожидания подтверждений /* число сообщений, ноторые разрешается /* 0-й интервал не используется */ чотс$ з1еер(чо!б); /* прототипы */ чо!б накецр(чотб): чо!б го пег(тпг с1б, 1пг ц, тпг щ, ркг гуре рг, цпзтйпеб спаг *р, 1пг Ьугез); чо!б тгощ пег(1пг *с!б. тпг *р, 1пг *щ, рхг гуре *рг, цпв!Опеб сьаг *р, (пг "ьугез); 1пг 11згеп(ггапврогг аббгезз г) (/* Пользователь ждет соединения. Посмотреть, не прибыл ли уже пакет СА[г йЕО. */ 1пг т 1, гоцпб 0: /ог (1 1, т < МАХ СОНМ; ~++) /* поиск СА[г йЕО в таблице */ зт (сопл[!).агате — 00ЕОЕО Ы сопл[!).1оса! асбгезз — г) ( тоцпб - т; Ьгеаг: !т (тоцпб — О) ( /* Нет паметов СА[г йЕО, ждущих подтверждения.
Можно спать. пока не прибудет пакет или не сработает таймер. */ 11вгеп асбгевв = г: в1еер(); т - 1тзгеп сопл; ) сапе[1).згаге - Е5ТАВ[15НЕО; сопл[1).гтщег - 0: 1тзгеп сопл 0: го пегТ1, О, О, СА[г АСС. бага, О). */ гегцгп(!); ) /* вернуть идентификатор соединения */ !пг соппесг(ггапзрогг аббгевв 1, ггапзрогг асбгевв г) (/* Пользователь желает установить соединение с удаленным процессои: послать пакет сА[[ йеО, */ тпг 1; зггцсг сопл *сргг: бага[0) г: бага[ 1) 1: /* это нужно для пакета СА[г йЕО */ 1 - МАХ СОММ; /* поиск в таблице с конца "7 ыЬ11е (сопл[1].згаге ! 10[Е $$ 1 > 1) т " ! - 1; тт (сопл[1).згаге — 10[Е) ( /* отметить в таблице, что САьг йЕО послан */ сргг - 6сопп[1); сргг->1оса1 аобгевв - 1; сргг->гещоге аббгевв - г, зггцсг сопл ( ггапзрогг аобгеьв 1оса1 аббгезз, свгаге вгаге: цпв10пеб спаг "цвег Ьцт аебг; !пг Ьуге соцпг; 1пг с1г гео гесе!чеб; сгеАй йеО '/ 1пг г(щег: для пакетов СА[[ йЕО */ тпг сгебтгв: послать */ ) оопп[МАХ СОНИ+1): /* соединение установлено */ /* тайиер не используется */ /* 0 считается неверныи адресом */ /* велеть сетевоиу уровню принять сообщение Простой транспортный протокол 59'( сртг->ятаСе " НА!Т(НО; срСг->с1г гей гесе1чеб О: срСг->сгеб1Ся " О: сртг->С1аег О; Со пеС(1, О, О, САСС ВЕО, бата.
2): я1еер(); /* ждать СЯСЬ АСС или ССЕАй йЕО */ 1т (сртг->яСате — Е5ТАВС15НЕО) гесигп(1); 1т (сртг->с1г гец гесетчеб) ( /* другая сторона отказалась от соединения */ сртг- ятате - 1ОСЕ: /* назад в состояние ожидания */ Со пеС(1. О, О. ССЕАй СОНЕ. баса. О): гетигп(Ейй ЙЕ]ЕСТ): ) е1яе гетигп(Ейй РОСС): таблице */ /* отказаться от соединения: нет места в /* на каждое сообщение расходуется 1 кредит сртг- сгеб!Ся */ сртг->ятасе - Е5ТЯВС]5НЕО; гесигп(ОК); ) е1яе ( сртг->яСате - ЕВТАВС15НЕО; гевигп(Ейй СС05ЕО): разорвать соединение */ /* ошибка передачи: другая сторона хочет 1пС гесе1че(1пС с1б, ипятдпеб спаг Ьитртг(].
1пС *ЬуСея) (/* пользователь готов принять сообщение */ ятгисС сопл *сртг - дсопп(с1б]: 1т (срСг- с1г гец гесетчеб - О) ( /" соединение установлено; попытка получения "/ 1пС яепб(1пС стб, ипя10пеб спаг Ьитртг(], 1пс ЬуСея) (/* Пользователь хочет послать сообщение. */ 1ПС 1. соипС, а; ясгисС сопп "срСг - дсопп(стб]: /* вход в состояние передачи */ срСг->яСате - 5ЕН01НО: срСг- Ьусе соипС - О: /* количество посланных байтов сообщения */ 1т (срсг- с)г гец гесетчеб - О ВВ срсг->сгебтся — О) я1еер(); 1т (срСг- с1г гец гесе1чеб — О) ( /* кредит инеется: разбить сообщение на пакеты, если нужно */ бо ( 1т (ЬуСея - срсг- Ьуте соипС > МАХ РКТ 51/Е) (/* иногопакетное сообщение */ соипС - МАХ РКТ 511Е; а - 1: /" остальные пакеты позже */ ) е1яе ( /* однопакетное сообщение */ соипС - Ьутея .сртг->Ьусе соипС: а - О:/* последний пакет сообщения */ тог (т О; т < соипС; 1++) бата(1] Ьитртг(сртг- Ьуте соипС + 1]: Со пес(стб.
О, а. ВАТА РКТ. баса. соипс):/* послать 1 пакет */ срсг-»ЬуСе соипС - срсг- ЬуСе соипС + соипС;/* увеличить число посланных байтов */ ) ыйщ1е (сртг->ЬуСе соипС < Ьутея), /* цикл, пока не будет послано все сообщение 592 Глава 6. Транспортный уровень срсг- ясасе = йЕСЕ!Ч1НВ; срСг->цяег Ьц[ аббг - Ьцтрсг; срСг->Ьусе соцпС - О; баса[0] = СЙЕО; баса[1] - 1, Со пеС(с)б, 1, О. СЙЕО!Т. баса.
2); /* поспать кредит */ я1еер(): /' ожидание данных */ *Ьусея - срсг->Ьусе соцпС: ) срСг->ясасе - Е5ТАВ[15НЕО; гесцгп(срсг->с1г ге(( гесезчеб ? Ейй С[05ЕО ОК); ) (пС оп ясоппесС(тпС стб) (/* пользователь хочет разорвать соединение */ ясгцсС сопп *срсг - Всопп[стб]: тт (срсг->с1г гец гесетчеб) ( /* другая сторона инициировала окончание связи */ срсг->ясасе - !ОСЕ; /* теперь соединение разорвано */ Со пеС(стб, О. О.