TCP (Transmission Control Protocol)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 20:16, 1 февраля 2015.

В наборе протоколов TCP/IP протокол управления передачей (Transmission Control Protocol — TCP) выполняет функции транспортного протокола с установлением логического соединения, TCP включает целый ряд функциональных средств, не предусмотренных в UDP. Одним из основных функциональных средств TCP является метод управления потоком данных и исправления ошибок, называемый методом передачи с применением окон.

Метод передачи с применением окон представляет собой эффективную и удобную форму управления потоком данных. Как описано в главе 1, этот метод позволяет хосту отправлять только указанное количество байтов, после чего он должен ожидать от получателя ответа в виде так называемого подтверждения (АСК). Метод передачи с применением окон, как и все другие методы управления потоком данных, позволяет предотвратить передачу одним устройством другому чрезмерно интенсивного потока данных в процессе обмена данными по сети. В протоколе TCP используется одна из разновидностей метода передачи с применением окон, основанная на использовании прямых подтверждений (Forward Acknowledgment — FACK), а предельные объемы передаваемых данных измеряются в байтах. Применение метода на основе FACK можно проиллюстрировать на следующем примере. Предположим, что отправитель послал получателю данные объемом 50 байтов. Если получатель успешно принял все 50 байтов, он отправляет подтверждение АСК на 51 байт, которое сообщает отправителю, что все 50 байтов были получены и далее ожидается 51-й байт. Но отправитель не отправляет 51-й байт до тех пор, пока не получит подтверждение АСК на предыдущие байты. А если подтверждение АСК на какие-либо байты не будет получено, отправитель выполнит повторную передачу всех 50 байтов по истечении тайм-аута (этот период ожидания принято называть тайм-аутом повторной передачи — Retransmit Timer). Если же отправитель примет подтверждение АСК на часть байтов, но не на все, он выполнит повторную передачу только тех байтов, которые не были приняты получателем. Например, если отправителю поступает подтверждение АСК со значением 39, он передает все байты, которые следуют за байтом 38. Но этот пример несколько упрощен, поскольку следует учитывать, что в этом протоколе применяется еще одно средство — скользящие окна.

Рис. 5.3. Пример применения скользящего окна

Скользящие окна получили такое название, поскольку в процессе передачи можно условно представить, что программное обеспечение TCP "перемешает" окно в потоке данных в ответ на каждое подтверждение АСК. Такое средство, по-видимому, проще всего объяснить на примере. На рис. 5.3 компьютер с сетевым именем Bart отправляет сообщение на компьютер Homer. Размер окна (т.е. количество байтов, которое разрешено передавать до получения какого-либо подтверждения) составляет 500 байтов. Компьютер Bart передает 500 байтов, устанавливает тайм-аут и ожидает, будет ли получен ответ от компьютера Homer или прежде произойдет истечение тайм-аута. Компьютер Homer получает все 500 байтов и передает компьютеру Homer байты с 501-го по 1000-й.

Метод передачи с применением окон, предусмотренный в протоколе TCP, является динамическим. Это означает, что размер окна может изменяться (и почти всегда изменяется) на протяжении одного сеанса передачи данных. Такие изменения происходят в ответ на ошибки; при этом размер окна уменьшается (или в ответ на их отсутствие; при этом окно увеличивается). В процессе первоначального установления сеанса определяется базовый размер окна. Кроме того, отправителю передается начальный порядковый номер (SEQuence number — SEQ), который указывает номер начального байта. В заголовке TCP каждого передаваемого сегмента TCP содержится поле размера окна, которое указывает размер окна, установленный другим участником соединения. Если возникает ошибка и часть данных теряется (вызывая повторную передачу данных программным обеспечением TCP), хост получателя может уменьшить размер окна. С другой стороны, если значительные объемы данных были приняты без ошибок, хост отправителя может увеличить размер окна.

Например, на рис. 5.4 показано, как компьютер Chandler передает данные компьютеру Rachael. Первоначальный размер окна для компьютера Chandler составляет 100 байтов. Он передает 100 байтов компьютеру Rachael, который получает все 100 байтов, отправляет подтверждение АСК с разрешением отправить 101-й байт и увеличивает размер окна до 200 байтов. Затем компьютер Chandler перемещает свое окно на 101-й байт и расширяет его для включения следующих 200 байтов. После этого он посылает еще 200 байтов компьютеру Rachael, который тем не менее успешно получает только байты вплоть до 250-го. Поэтому компьютер Rachael отправляет в ответ подтверждение АСК на получение байтов, начиная с 251-го, наряду с уменьшением размера окна на 100 байтов. Компьютер Chandler перемещает окно назад, к 251-му байту, и уменьшает окно, включив в него только байты с 251-го по 350-й.

Рис. 5.4. Пример динамического изменения размера окна

Метод передачи с применением окон, предусмотренный в протоколе TCP, не только представляет собой динамический процесс, но и осуществляется в дуплексном режиме. Это означает, что на каждом хосте предусмотрена возможность и передавать, и принимать данные о размере и положении окна. Каждое окно применяется независимо от другого и может увеличиваться или уменьшаться с учетом условий передачи в соответствующем направлении.

Еше одним важным средством протокола TCP является способность мультиплексировать логические сеансы между удаленными хостами. Такая возможность предусмотрена и в TCP, и в UDP и позволяет применять одновременно сразу несколько соединений, поскольку данные, передаваемые по каждому из них, различаются с помощью транспортного протокола. Эта тема рассматривается более подробно в главе 6. Наконец, необходимо рассмотреть такое понятие, как сеанс, в рамках которого реализуются все средства TCP. При установлении сеанса TCP выполняются следующие три основные задачи:

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

Процесс установления сеанса TCP между клиентом и сервером (называемый также трехэтапным квитированием) происходит следующим образом. Клиент инициирует сеанс, передавая сегмент с установленным битом синхронизации (SYNchronization — SYN). Этот сегмент содержит данные о размере окна клиента и его текущем порядковом номере. Сервер отвечает на запрос SYN клиента сегментом АСК и также включает в передаваемый им сегмент бит SYN, данные о размере окна и начальном порядковом номере. Наконец, клиент отвечает на сегмент SYN сервера подтверждением АСК. Этот процесс показан на рис. 5.5.

Рис. 5.5. Схема процесса установления сеанса TCP

Процесс разрыва сеанса TCP аналогичен процессу его установления. Вначале участник соединения, желающий закрыть сеанс (предположим, что в данном примере это — клиент), инициализирует процесс завершения сеанса, отправляя сегмент с установленным битом завершения (FINish — FIN). Сервер отвечает, передавая в ответ на сегмент FIN клиента подтверждение АСК. Затем сервер передает собственный сегмент с установленным битом FIN. После этого клиент передает в ответ на сегмент FIN сервера подтверждение АСК и сеанс закрывается. Этот процесс показан на рис. 5.6.

Наконец, на рис. 5.7 показан формат заголовка протокольной единицы обмена TCP (Protocol Data Unit — PDU). Так формально называются сегменты TCP.

Рис. 5.6. Схема процесса завершения сеанса TCP
Рис. 5.7. Формат заголовка протокольной единицы обмена TCP