Настройка сетей Microsoft дома и в офисе. Учебный курс
Шрифт:
При описании протокола TCP используется понятие абстрактного соединения, осуществляемого с применением виртуальных каналов связи. Для каждого соединения назначаются конечные точки соединения. В данном случае под конечной точкой понимается целочисленная пара чисел вида узел, порт, где параметр узел определяет IP-адрес узла сети, а параметр порт определяет номер порта TCP для данного узла. Например, запись (139.15.1.5, 13) определяет конечную точку, которая характеризуется TCP-портом с номером 13, относящимся к компьютеру с IP-адресом 139.15.1.5.
Теперь, после формулирования понятия конечной точки, несложно определить термин «соединение». Поскольку любое соединение идентифицируется парой определяющих
На самом деле это упрощенная модель соединения, поскольку в данном случае номера портов для соединений уникальны. На практике же бывает так, что одна и та же конечная точка используется несколькими соединениями. При этом неоднозначности не возникает, поскольку в протоколе TCP все соединения связаны с открытым соединением, определяемым парой конечных точек, а вовсе не с номерами портов.
Концепция абстрактного соединения играет важную роль в программировании. В частности, разработчик может создать программу, выполняющую один и тот же набор функций с несколькими открытыми соединениями. При этом нет необходимости использовать для каждого соединения уникальный номер локального порта. Например, в большинстве операционных систем поддерживается возможность одновременного доступа нескольких клиентов к службе электронной почты. Благодаря этому несколько клиентских компьютеров могут одновременно отправлять почтовые сообщения, а необходимость в этом возникает достаточно часто. Поскольку программа, принимающая входящие сообщения, использует для связи протокол TCP, для ее работы достаточно назначить лишь один локальный порт, несмотря на то, что могут одновременно обрабатываться несколько соединений.
Для реализации передачи данных при использовании протокола TCP требуется предварительная установка соединения. На практике это означает предварительную «договоренность» между конечными точками, участвующими в соединении. При этом «переговоры» ведутся приложениями, функционирующими на компьютерах, между которыми устанавливается соединение. Одно из приложений реализует функцию пассивного открытия соединения. Вызов подобной функции сигнализирует о том, что данная сторона готова к приему входящих соединений. После этого операционная система назначает номер TCP-порта для собственной конечной точки текущего соединения.
Приложение, которое выполняется на другом конце виртуального канала, обращается к операционной системе с запросом на активное открытие соединения. При этом два экземпляра протокола TCP взаимодействуют друг с другом. В ходе этого взаимодействия проверяется возможность установки соединения.
После того как соединение будет установлено, приложения могут начать процесс обмена данными. При этом экземпляры протокола TCP в фоновом режиме обмениваются служебными сообщениями, гарантирующими надежность доставки данных. Подробнее процесс установки соединения будет рассмотрен после изучения формата сообщения протокола TCP.
В протоколе TCP поток данных разбивается на сегменты, состоящие из последовательности байтов (октетов). Как правило, каждый сегмент данных передается в сети в виде единственной IP-дейтаграммы. Для повышения эффективности передачи данных и управления потоком данных в протоколе TCP используется специальный механизм скользящих окон. В этом случае экземпляр протокола TCP может отправлять сразу несколько сегментов данных еще до того, как будет получено соответствующее сообщение относительно их доставки. Благодаря этому увеличивается общая пропускная способность сети, поскольку сокращается время ее простоя. Также становится реальной «голубая мечта разработчиков» – сквозное управление потоком данных. Получатель может использовать средства, позволяющие ограничить поток передаваемых данных в случае нехватки
Благодаря использованию скользящих окон протокол TCP оперирует октетами (байтами) данных (рис. 4.4, а), а не сегментами или пакетами. При этом октеты потока данных нумеруются последовательно, а компьютер-отправитель запоминает три указателя для каждого открытого соединения. Именно по этим указателям определяется скользящее окно (рис. 4.4, б).
Первый указатель обозначает левую границу скользящего окна. Он разделяет октеты на успешно доставленные получателю и те, которые отправлены в сеть, но подтверждение их успешной доставки еще не получено. Второй указатель обозначает правую границу скользящего окна. Он определяет номер старшего октета последовательности, который может быть передан в сеть до получения подтверждения о доставке других октетов, находящихся в окне. Третий указатель обозначает границу внутри окна, разделяющую последовательность октетов на уже отправленные в сеть и те, которые еще только предстоит отправить. Модуль протокола отправляет в сеть все октеты, находящиеся в окне, без задержки. Поэтому граница внутри окна, определяемая третьим указателем, обычно перемещается слева направо очень быстро.
Рис. 4.4. Скользящее окно протокола TCP
Экземпляр протокола TCP, выполняемый на компьютере-отправителе, перемещает окно вдоль последовательности октетов. Экземпляр протокола TCP, выполняемый на компьютере-получателе, формирует точно такое же окно для того, чтобы собрать поток получаемых данных. Следует учитывать, что соединения, устанавливаемые протоколом TCP, являются дуплексными. Это означает, что одновременно по каждому из виртуальных каналов можно передавать два потока данных в противоположных направлениях. Поэтому экземпляры протокола TCP, выполняемые на обоих концах соединения, поддерживают для каждого соединения по два окна. Одно окно в этой паре применяется для передачи потока данных, а второе – для их приема.
Размер окна в протоколе TCP не является постоянным. В каждом сообщении, подтверждающем получение данных, которое присылает получатель, указывается количество принятых октетов и объявление окна. В этом объявлении определяется количество дополнительных октетов данных, которые сможет принять получатель. В данном контексте объявление окна можно рассматривать в качестве сообщения, присылаемого получателем потока данных, в котором говорится о текущем размере буфера данных.
В ответ на получение объявления окна, в котором говорится об увеличении размеров, отправитель данных соответствующим образом увеличивает размер своего скользящего окна, отправляя дополнительные данные еще до того, как будет получено подтверждение о приеме данных. Если же получено объявление окна, в котором сообщается об уменьшении размеров, отправитель уменьшит размеры собственного скользящего окна, задерживая отправку байтов данных, выходящих за его пределы.
Экземпляр протокола TCP не обязан немедленно реагировать на прием объявления окна, в котором указаны уменьшенные размеры, смещая влево границу окна в потоке данных. Следует просто дождаться подтверждения приема данных, временно «замораживая» их отсылку. Поэтому спустя некоторое время размер окна уменьшится автоматически по мере смещения его левой границы вправо.
Благодаря окну переменного размера повышается надежность передачи данных и обеспечивается управление потоком данных. Чтобы не допустить переполнения буфера, следует по мере его заполнения отсылать объявления окон меньшего размера. Иногда в целях прекращения передачи данных получатель объявляет окно нулевого размера. Если же буфер памяти очистится, получатель отсылает объявление ненулевого окна для возобновления передачи данных.