На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

ПРОТОКОЛ TCP

Так же как и IP, протокол TCP является наиболее используемым и распростра­ненным в наборе протоколов TCP/IP. Как и UDP, TCP ответственен за переда­чу данных между сетевым уровнем и уровнем приложений.
Однако TCP более сложен, чем UDP. Он обеспечивает более надежную ориен­тированную на соединение службу, в которой используется понятие потоков данных. Другими словами, в обязанности протокола TCP входит проверка до­ставки сообщения и правильности последовательности прибывших данных. В отличие от TCP, UDP не контролирует передачу данных и не гарантирует того, что они пришли в правильной последовательности.
Кроме того, протокол TCP пытается оптимизировать пропускную способность Internet. Для этого TCP динамически контролирует количество передаваемых данных в соединениях. Например, если буфер данных компьютера-получателя начинает переполняться, TCP дает команду компьютеру-отправителю снизить скорость передачи.
Рассмотрим, как с помошью IP протокол TCP передает данные между хостами. Вас может удивить, как TCP может использовать функции ненадежного прото­кола IP и при этом сам остается надежным. Кроме того, настораживает и тот факт, что TCP является протоколом, ориентированным на соединение, в то время как IP не является таковым. И в конце концов, читатель может поинтере­соваться, каким образом TCP передает потоки данных, если IP использует для передачи данных датаграммы.
В следующем разделе будут даны ответы на все эти вопросы. Но вы всегда должны помнить, что для передачи данных в TCP используется протокол IP. Поэтому TCP должен упаковывать свои данные в датаграммы IP.
ОБЕСПЕЧЕНИЕ НАДЕЖНОСТИ
Для того чтобы убедиться в надежности и правильной последовательности пото­ка байт, TCP использует подтверждения (acknowledgment). После того как со­общение прибудет к пункту своего назначения, компьютер-получатель отправит
сообщение-подтверждение компьютеру-отправителю. Другими словами, полу­чатель отвечает отправителю: «Да, я получил сообщение».
При отправке очередного сообщения TCP запускает таймер. Если таймер закон­чит свой отсчет до того, как TCP получит подтверждение, протокол автомати­чески отправляет данные еще раз. показано, как используются подтверждения при передаче данных.
К сожалению, система подтверждений малоэффективна. В этой схеме один
пункт соединения должен все время ожидать прихода данных из другого пункта соединения. В отличие от схемы, приведенной 8, TCP на самом деле передает за один раз несколько порций данных.


Сети и TCP/IP
отправитель получатель
сообщение 1U-
подтверждение сообщения 1
сообщение 2
подтверждение i сообщения 2
| сообщение
подтверждение сообщения 3
Передача данных с использованием простых подтверждений.
Проаж КВИТИРОВАНИЕ К
Для определения искажения данных в сетях часто использу­ются системы подтверждений. В таких системах и отправи­тель, и получатель должны посылать сообщения, подтверж­дающие получение достоверных (неискаженных) данных. Про­ектировщики сетей называют этот обмен квитированием (handshake). Хотя в TCP используется более сложный метод подтвержде­ний, отличный от обычной схемы квитирования, я все же советую читате­лям прочитать этот раздел. Изложенная в нем информация позволит полу­чить общие понятия о квитировании, а затем уже разобраться в системе под­тверждений, используемой в протоколе TCP.
Каждый раз, когда к получателю приходит новое сообщение, он должен : отправить подтверждение (АСК) отправителю. Например (8), когда к получателю приходит сообщение MESSAGE 1, получатель посылает: отправителю подтверждение MESSAGE 1 АСК. После того как отправитель .получает MESSAGE 1 АСК, он отправляет сообщение MESSAGE 2. Отпра­витель не будет посылать сообщение MESSAGE 3 до тех пор, пока не получит подтверждение MESSAGE 2 АСК.
Предположим, что все сообщения содержат контрольные суммы. Более того, будем считать, что получатель видит сообщение MESSAGE 2, но его значе­ние контрольной суммы отличается от значения отправителя. В обычной схеме получатель должен отбросить неверное сообщение и ждать, пока от­правитель пошлет его повторно. Однако это может занять много времени и привести к неоправданным задержкам.
В идеальном случае получатель должен был бы отправить подтверждение о том, что он получил сообщение. Но он не может этого сделать, так как сообщение MESSAGE 2 было испорчено во время передачи. Если получа­тель просто пошлет подтверждение MESSAGE 2 АСК, то отправитель отпра­вит следующее сообщение.
Многие протоколы квитирования используют неподтверждение сообщения (NAK — not acknouledgement), для того чтобы сообщить о получении искаже иных данных. Например, когда получатель определяет, что контрольная сумма, подсчитанная им, неверна, он отправляет сообщение MESSAGE 1NAK. Получив такое сообщение, отправитель понимает, что при передаче сообщение было искажено.
После получения MESSAGE 2 NAK отправитель повторно посылает сообщение MESSAGE 2 еще раз. Таким образом устраняются ненужные задержки в работе.
СКОЛЬЗЯЩЕЕ окно
Для улучшения пропускной способности TCP не пользуется схемой отправления сообщений по одному и ожидания подтверждения на каждое сообщение в от­дельности. Вместо этого используется скользящее окно (sliding window), с помо­щью которого можно передавать несколько сообщений сразу, а затем ожидать подтверждений на каждое из них.
TCP как бы помещает окно над потоком данных, а затем передает все, что попало в него. Получив подтверждение о получении данных, протокол далее перемещает окно по потоку данных и отправляет следующую порцию сообще­ний. Обрабатывая таким способом большое количество сообщений, TCP пере­качивает больше информации за одно и то же время. Поскольку протокол от­правляет по несколько сообщений сразу, не дожидаясь подтверждения о приеме каждого из них, эффективность передачи данных и пропускная способность сети увеличиваются. показан цикл передачи —подтверждения, ис­пользуемый в протоколе TCP.
Как видно из рисунка, отправитель и получатель используют скользящее окно шириной в три пакета. Отправитель посылает три пакета сразу. После того как отправитель получит подтверждение АСК 3, он отправляет следующие три сооб­щения.
TCP также оптимизирует ширину полосы пропускания путем согласования ско­рости передачи данных. Он управляет скоростью передачи данных в течение всего сеанса соединения. Благодаря согласованию ширина скользящего окна может быть увеличена либо уменьшена. Когда количество передаваемых данных невелико, TCP увеличивает ширину скользящего окна. Благодаря этому дан­ные будут перекачиваться быстрее. Увеличение скорости передачи данных, в свою очередь, увеличивает пропускную способность сети.
Когда сеть перегружена, TCP уменьшает ширину скользящего окна. Напри­мер, ширина скользящего окна, изображенного 9, — 8 блоков. Если 8 блоков данных — это ширина окна, когда движение данных по Internet оживленное, то в менее напряженные дни TCP может увеличивать ширину окна до 10-12 блоков.
Все вышесказанное является упрощенным примером работы протокола TCP. Отмечу лишь, что размер скользящего окна задается в байтах. Реальное окно имеет ширину в несколько тысяч байт, а не в 8, 10 или 12 байт, как в нашем примере. Многие системы Internet используют окна шириной 4096, другие — от 8192 до 16 384 байт.
СООБЩЕНИЕ TCP
Каждый пакет или блок данных TCP называется сообщением TCP (TCP message) или сегментом TCP (TCP segment). Оба эти термина верны и широко употреб­ляются в литературе об Internet. Однако я буду пользоваться термином «сег­мент». Вы помните, что в TCP данные обрабатываются как один неделимый последовательный поток. Однако для передачи данных TCP должен использо­вать датаграммы IP. К счастью, ваши программы могут работать с данными как с непрерывным потоком байт TCP.
Встретив термин сообщение TCP, можете смело заменять его на термин сегмент TCP. Таким образом, вам будет легче привыкнуть к той мысли, что каждое сообщение TCP, передаваемое с помощью IP-датаграмм, на самом деле являет­ся всего лишь одним сегментом потока байт TCP. Сегмент TCP состоит из заго­ловка TCP, параметров TCP и данных, передаваемых этим сегментом. На ри­сунке 2.11 показана структура сегмента TCP. Кроме того, там изображена в виде набора уровней и структура заголовка TCP. Однако вы должны понимать, что заголовок — это просто непрерывный поток данных, размер каждой части кото­рого составляет по меньшей мере 20 байт.
СОЗДАНИЕ TCP-СОЕДИНЕНИЯ
Для того чтобы убедиться в надежности и правильном порядке потока байт, в протоколе TCP используются подтверждения. Для работы с ними у TCP должен быть способ идентификации переданных данных. Кроме того, сети должны ка­ким-то образом синхронизировать сообщения, посылаемые отправителем, и сообщения, принимаемые получателем.
Другими словами, обе стороны TCP-соединения должны знать, когда можно начать передачу данных. Кроме того, они должны уметь идентифицировать ин­формацию отправителя. Например, предположим, что TCP-модуль получает искаженный (поврежденный) пакет данных. Он должен каким-то способом пе­редать модулю-отправителю информацию о том, что пакет данных был искажен в процессе передачи. Для установления TCP-соединения обе стороны должны
выбрать и согласовать друг с другом понятный им обеим способ идентификации информации. Кроме того, они должны согласовать систему подтверждений. В противном случае может произойти срыв соединения.
Для установления и завершения соединения, а также отправления и получения подтверждений заголовок TCP использует поля Sequence Number, Acknowledgment Number, а также поля различных флагов.
Каждый раз, когда программа хочет передать данные при помощи протокола .TCP, она направляет транспортному уровню хоста запрос на соединение. Тот, в свою очередь, посылает TCP-сообщение с флагом SYN (синхронизация) отда­ленному порту, с которым хочет установить связь программа.
Флаг синхронизации сообщает принимающему TCP-модулю (модулю сервера), что программа клиента хочет установить соединение. Кроме флага синхрониза­ции сообщение содержит 32-битное значение последовательности (sequence number), расположенное в поле Sequence Number. TCP-модуль сервера в ответ
TCP Checksum
Помогает получающему TCP-модулю определить наличие искажений данных
Указывает на последний байт срочных данных TCP, расположенных в области данных
Обычно используется с параметром Maximum
Segment Size, которая указывает наибольший размер сегмента, который может принять TCP-модуль_
Urgent Pointer
Options
посылает сегмент TCP, который включает в себя флаг подтверждения (АСК) и значение подтверждения (acknowledgment number).
Для того чтобы понять процесс квитирования TCP при создании соединения, нужно хорошо разобраться со значениями последовательности и значениями подтверждения.
НАЧАЛЬНОЕ   ЗНАЧЕНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ
Как уже отмечалось, обе стороны TCP-соединения должны уметь идентифици­ровать информацию в потоке данных, для того чтобы посылать и принимать подтверждения. Значения последовательности определяет метод идентификации данных в протоколе TCP. Хосты могут использовать множество методов для вы­бора начального значения последовательности — для нас совершенно не важно, какой метод используется. Можно считать, что начальное значение последова­тельности определяется случайным образом — величина этого числа также не существенна.
Начальное значение последовательности — это просто значение, которое одна сторона TCP-соединения отправляет другой. Сторона-отправитель просит сто­рону-получателя: «Установите TCP-соединение. Поток данных клиента будет иметь значения (идентификаторы), начиная с этого числа».
Когда сторона-сервер получает запрос на соединение, она отвечает сообщением, которое включает в себя собственное значение последовательности. Значение последовательности сервера совершенно не зависит от значения последователь­ности клиента. Другими словами, сторона-сервер отвечает стороне-клиенту:
«Сообщение получено. Поток данных сервера будет иметь значения (идентифи­каторы), начиная с этого числа».
TCP-соединение является дуплексным. Иначе говоря, данные передаются в обоих направлениях одновременно. Данные, передающиеся в одном направлении, не­зависимы от данных, передающихся в другом направлении. Поэтому каждая сторона соединения должна устанавливать два значения последовательности -по одному на каждое направление.
Подтверждение передач, ДАННЫХ
В своем первом ответном сообщении сторона-сервер устанавливает два флага в заголовке TCP. С помощью флага синхронизации (SYN) сервер сообщает стороне-клиенту о том, что он передал свое значение последовательности. Флаг под­тверждения (АСК) указывает стороне-клиенту прочитать поле Acknowledgment Number.
TCP-модуль стороны-сервера использует значение последовательности, прислан­ное стороной-клиентом, для определения значения подтверждения. Значение подтверждения всегда определяет следующее значение последовательно cm и, кото­рое должно быть прислано. Поэтому в своем первом ответном сообщении сторо­на-сервер передает значение последовательности плюс один.
Предположим, что сторона-клиент при запросе TCP-соединения присылает зна­чение последовательности 1000. Сторона-сервер в своем ответном сообщении заносит в поле Acknowledgment Number число 1001. Другими словами, сторона-сервер говорит стороне-клиенту: «Получен элемент данных 1000. Следующий ожидаемый элемент 1001».
ОФИЦИАЛЬНОЕ   УСТАНОВЛЕНИЕ СВЯЗИ
Перед тем как начать отправлять какие-то данные, сторона-клиент, которая посылала запрос на установление связи, должна подтвердить получение ответного сообщения от стороны-сервера. Когда TCP-модуль стороны-клиента получает ответное сообщение от стороны-сервера, он должен отправить подтверждение на подтверждение. (На самом деле он подтверждает запрос на синхронизацию со стороны-сервера.)
В сообщении, отправляемом стороной-клиентом, также должен быть установлен флаг АСК. В поле Acknowledgment Number сторона-клиент помещает значение последовательности стороны-сервера плюс один. Сторона-клиент не устанавли­вает флаг синхронизации (SYN) в этом сообщении, поскольку обе стороны уже синхронизировались с помощью начального значения последовательности.
Другими словами, для установления официального соединения требуется про­извести квитирование в три этапа (three-way handshake).
1. TCP-модуль стороны-клиента запрашивает соединение, посылая синхро­низирующее сообщение и начальное значение последовательности.
2. Сторона-сервер подтверждает получение запроса на соединение и в то же время запрашивает сторону-клиента о синхронизации, отправляя свое на­чальное значение последовательности.
3. Сторона-клиент подтверждает получение запроса на синхронизацию от сто­роны-сервера.
После окончания квитирования у обеих сторон имеется вся информация для идентификации данных—значение последовательности и значение подтвержде­ния. Другими словами, обе стороны синхронизировали значения последова­тельности и подтвердили синхронизацию.
Значен и ПОСЛЕДОВАТЕЛЬНОСТИ
Значения последовательности определяют байт данных в потоке данных TCP. Как следует из названия, эти значения являются последовательными. Однако на­чальное значение последовательности разных соединений различается.
Каждая сторона TCP-соединения передает значение последовательности в каж­дом сегменте данных, определяя с его помощью первый байт данных в сообще­нии. TCP вычисляет этот байт от начала потока данных. Другими словами, значение последовательности представляет собой смещение от' начала потока данных. Оно действует как счетчик байт. Значение последовательности каждого пакета как бы говорит: «Первый байт в этом пакете является байтом потока дан-1 ныхс номером, равным значению последовательности».
Предположим, что ваша программа передает с помощью протокола TCP 2000 байт' данных от приложения клиента к приложению сервера. Кроме того, будем счи­тать, что после согласования соединения и синхронизации значений последовательности, следующим значением последовательности является 1251. Допустим также, что вашей программе требуется отправить данные сегментами по 500 байт.
Дальше события будут развиваться в таокой последовательности:
1. Транспортный уровень вашего компьютера отправляет сегмент, который содержит данные с 1 байта по 500. TCP-модуль записывает в поле Sequence Number значение последовательности 1251.
2. TCP-модуль вашего компьютера отправляет сегмент данных от 501 байта до 1000. Пересылаемое значение последовательности — 1751.
3. передаваемый сегмент данных включает данные от байта до 1500 и значение последовательности 2251.
4. Наконец, TCP-модуль вашего компьютера отправляет данные с 1501 бай­та до 2000 и определяет значение последовательности 2751.
В предыдущем примере TCP-модуль стороны-сервера должен был отправлять значения подтверждения, как показано ниже:
1. После получения первого сегмента данных сторона-сервер отправляет зна­чение подтверждения 1751. Делая это, сторона-сервер говорит: «Данные получены. Следующие данные должны иметь значение последовательно­сти 1751».
2. После получения второго сегмента сторона-сервер посыпает значение под­тверждения 2251.
3. После получения третьего сегмента данных TCP-модуль стороны-сервера отправляет значение подтверждения 2751.
4. После получения четвертого сегмента сторона-сервер посылает значение подтверждения 3251. В нашем примере сторона-клиент не информирова­ла сторону-сервер об окончании процесса передачи данных.

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика