TCP: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Строка 16: Строка 16:
TCP — это транспортный механизм, предоставляющий [[поток данных]], с предварительной установкой соединения, за счёт этого дающий уверенность в безошибочности получаемых данных, осуществляет повторный запрос данных в случае потери [[пакет данных|пакетов]] и устраняет дублирование при получении двух копий одного пакета (см. также [[T/TCP]]). В отличие от [[UDP]], TCP гарантирует, что [[прикладная программа|приложение]] получит данные точно в такой же последовательности, в какой они были отправлены, и без потерь.
TCP — это транспортный механизм, предоставляющий [[поток данных]], с предварительной установкой соединения, за счёт этого дающий уверенность в безошибочности получаемых данных, осуществляет повторный запрос данных в случае потери [[пакет данных|пакетов]] и устраняет дублирование при получении двух копий одного пакета (см. также [[T/TCP]]). В отличие от [[UDP]], TCP гарантирует, что [[прикладная программа|приложение]] получит данные точно в такой же последовательности, в какой они были отправлены, и без потерь.


Реализация TCP как правило, встроенна в ядро операционной системы, хотя есть и реализации TCP в контексте приложения.
Драйвер TCP (как правило, встроенный в ядро операционной системы, хотя есть и реализации TCP в контексте приложения) получает от приложения данные для отправки на удалённую машину. Независимо от того, какими порциями приложение передавало данные драйверу TCP, данные рассматриваются как единый поток. Этот поток данных разбивается на сегменты, каждый из которых упаковывается в отдельный IP-пакет; пакеты нумеруются (это не совсем корректно сказано). IP-пакеты отправляется в независимое путешествие, в котором каждый IP-пакет может пропасть (при несовпадении контрольной суммы пакет уничтожается, как правило, бесследно) или продублироваться (сам TCP в ряде случаев порождает дубли пакетов); кроме того, порядок следования пакетов может измениться (обычно это происходит в случае, когда неожиданно открылся более быстрый путь доставки пакетов); бывает и так, что пакет оказывается слишком велик и не проходит участок с ограничениями на размер пакетов (с маленьким [[MTU]]). На принимающей стороне доставленные пакеты сортируются в соответствии с порядком, заданным при отправке; дубли пакетов уничтожаются. Время от времени (не на каждый пакет, а реже) принимающая сторона оповещает отправителя о том, какие пакеты были ей доставлены; по этим оповещениям отправитель принимает решение о повторной отправке пропавших пакетов и об отправке новых пакетов. Количество отправленных без подтверждения пакетов регулируется алгоритмом "скользящего окна", описывать который я не стал.

В литературе часто встречается формулировка "принимающая сторона отслеживает приём данных и в случае пропажи пакетов запрашивает повторную доставку". Это неправда, т.к. принимающая сторона не может узнать о том, что какие-то данные были посланы и пропали! В реальности принимающая сторона оповещает отправителя об успешно доставленных данных, и на этом основании отправитель понимает, какие данные пропали.


== Формат TCP-сегмента ==
== Формат TCP-сегмента ==

Версия от 14:14, 8 июля 2008

TCP
Название Transmission Control Protocol
Уровень (по модели OSI) Транспортный
Семейство TCP/IP
Порт/ID 6/IP
Спецификация RFC 793 / STD 7
Основные реализации Windows, Linux, UNIX
Расширяемость Опции
Логотип Викисклада Медиафайлы на Викискладе

TCP (англ. Transmission Control Protocol — протокол управления передачей) — один из основных сетевых протоколов Internet, предназначенный для управления передачей данных в сетях и подсетях TCP/IP.

Выполняет функции протокола транспортного уровня упрощённой модели OSI. IP-идентификатор — 6.

TCP — это транспортный механизм, предоставляющий поток данных, с предварительной установкой соединения, за счёт этого дающий уверенность в безошибочности получаемых данных, осуществляет повторный запрос данных в случае потери пакетов и устраняет дублирование при получении двух копий одного пакета (см. также T/TCP). В отличие от UDP, TCP гарантирует, что приложение получит данные точно в такой же последовательности, в какой они были отправлены, и без потерь.

Реализация TCP как правило, встроенна в ядро операционной системы, хотя есть и реализации TCP в контексте приложения.

Формат TCP-сегмента

Формат TCP-сегмента
Бит 0 — 3 4 — 7 8 — 15 16 — 31
0 Порт источника Порт назначения
32 Номер последовательности
64 Номер подтверждения
96 Смещение данных Зарезервировано Флаги Окно
128 Контрольная сумма Указатель важности
160 Опции (необязательное)
160/192+  
Данные
 

Порт источника

Порт источника идентифицирует порт, с которого отправлен пакет.

Порт назначения

Порт назначения идентифицирует порт, на который отправлен пакет

Номер последовательности

Номер последовательности выполняет две задачи:

  1. Если установлен флаг SYN, то это начальное значение номера последовательности и первый байт данных — это номер последовательности плюс 1.
  2. В противном случае, если SYN не установлен, первый байт данных — номер последовательности

Номер подтверждения

Если установлен флаг ACK, то это поле содержит номер последовательности, ожидаемый отправителем в следующий раз. Помечает этот сегмент как подтверждение получения.

Смещение данных

Это поле определяет размер заголовка пакета TCP в 32-битных словах. Минимальный размер составляет 5 слов, а максимальный — 15, что составляет 20 и 60 байт соответственно. Смещение считается от начала заголовка TCP.

Зарезервировано

Зарезервировано(4 бита) для будущего использования и должны устанавливаться в ноль.

Флаги (управляющие биты)

Это поле содержит 8 битовых флагов:

  • CWR (Congestion Window Reduced) — Поле «Окно перегрузки уменьшено» — флаг установлен отправителем, чтоб указать, что получен пакет с установленным флагом ECE (RFC 3168)
  • ECE (ECN-Echo) — Поле «Эхо ECN» — указывает, что данный хост способен на ECN (явное уведомление перегрузки) и для указания отправителю о перегрузках в сети (RFC 3168)
  • URG — Поле Указатель важности значимо (англ. Urgent pointer field is significant)
  • ACK — Поле Номер подтверждения значимо (англ. Acknowledgement field is significant)
  • PSH — (англ. Push function) инструктирует получателя протолкнуть данные, накопившиеся в приемном буфере, в приложение пользователя
  • RST — Оборвать соединения, сбросить буфер (очистка буфера) (англ. Reset the connection)
  • SYN — Синхронизация номеров последовательности (англ. Synchronize sequence numbers)
  • FIN (англ. final, бит) — флаг, будучи установлен, указывает на завершение соединения (англ. FIN bit used for connection termination).

Контрольная сумма

Поле контрольной суммы — это 16-битное дополненение суммы всех 16-битных слов заголовка и текста. Если сегмент содержит нечетное число октетов в заголовке /или тексте, последние октеты дополняются справа 8 нулями для выравнивания по 16-битовой границе. Биты заполнения (0) не передаются в сегменте и служат только для расчета контрольной суммы. При расчете контрольной суммы значение самого поля контрольной суммы принимается равным 0.

Указатель важности

16-битовое значение положительного смещения от порядкового номера в данном сегменте. Это поле указывает порядковый номер октета которым заканчиваются важные (urgent) данные. Поле принимается во внимание только для пакетов с установленным флагом URG.

Механизм действия протокола

Состояния сеанса TCP

Состояния сеанса TCP
CLOSED Начальное состояние узла. Фактически фиктивное
LISTEN Сервер ожидает запросов установления соединения от клиента
SYN-SENT Клиент отправил запрос серверу на установление соединения и ожидает ответа
SYN-RECEIVED Сервер получил запрос на соединение, отправил ответный запрос и ожидает подтверждения
ESTABLISHED Соединение установлено, идёт передача данных
FIN-WAIT-1 Одна из сторон (назовём её узел-1 ) завершает соединение, отправив сегмент с флагом FIN
CLOSE-WAIT Другая сторона (узел-2) переходит в это состояние, отправив, в свою очередь сегмент ACK и продолжает одностороннюю передачу
FIN-WAIT-2 Узел-1 получает ACK, продолжает чтение и ждёт получения сегмента с флагом FIN
LAST-ACK Узел-2 заканчивает передачу и отправляет сегмент с флагом FIN
TIME-WAIT Узел-1 получил сегмент с флагом FIN, отправил сегмент с флагом ACK и ждёт 2*MSL секунд, перед окончательным разрушением канала
CLOSING Состояние закрытия соединения (фиктивное?)

Установка соединения

Процесс начала сеанса TCP называется "тройным рукопожатием". Клиент, который намеревается установить соединение, посылает серверу сегмент с номером последовательности и флагом SYN. Сервер получает сегмент, запоминает номер последовательности и пытается создать сокет (буфера и управляющие структуры памяти) для обслуживания нового клиента. В случае успеха сервер посылает клиенту сегмент с номером последовательности и флагами SYN и ACK, и переходит в состояние SYN-RECEIVED. В случает неудачи сервер посылает клиенту сегмент с флагом RST.

Если клиент получает сегмент с флагом SYN, то он запоминает номер последовательности и посылает сегмент с флагом ACK, если он одновременно получает и флаг ACK (что обычно и происходит), то он переходит в состояние ESTABLISHED. Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться, в противном случае клиент повторяет процесс установки соединения.

Если клиент не получает ответа в течении 10 секунд, то он повторяет процесс соединения заново.

Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED. В противном случае после таймаута он закрывает сокет и переходит в состояние CLOSED.

Процесс называется "тройным рукопожатием", поскольку в идеале возможен процесс установления соединения с использованием 4 сегментов (SYN в сторону сервера, ACK в сторону клиента, SYN в сторону клиента, ACK в сторону сервера), но для экономии времени используется 3 сегмента.

Передача данных

При обмене данными приемник использует номер последовательности, содержащийся в получаемых сегментах, для восстановления их исходного порядка. Приемник уведомляет передающую сторону о номере последовательности, до которой он успешно получил данные, включая его в поле "номер подтверждения". Все получаемые данные, относящиеся к промежутку подтвержденных последовательностей, игнорируются. Если полученный сегмент содержит номер последовательности больший, чем ожидаемый, то данные из сегмента буферизируется, но номер подтвержденной последовательности не изменяется. Если в последствии будет принят сегмент, относящийся к ожидаемому номеру последовательности, то порядок данных будет автоматически восстановлен исходя из номеров последовательностей в сегментах.

Для того, чтобы передающая сторона не отправляла данные интенсивнее, чем их может обработать приемник, TCP содержит средства управления потоком. Для этого используется поле "окно". В сегментах, направляемых от приемника передающей стороне в поле "окно" указывается текущий размер приемного буфера. Передающая сторона сохраняет размер окна и отправляет данных не более, чем указал приемник. Если приемник указал нулевой размер окна, то передача данных в направлении этого узла не происходит, до тех пор пока приемник не сообщит о большем размере окна.

В некоторых случаях передающее приложение может явно затребовать протолкнуть данные до некоторой последовательности принимающему приложению, не буферизируя их. Для этого используется флаг PSH. Если в полученном сегменте обнаруживается флаг PSH, то реализация TCP отдает все буферизированные на текущий момент данные принимающему приложению. "Проталкивание" используется, например, в интерактивных приложениях. В сетевых терминалах нет смысла ожидать ввода пользователя после того, как он закончил набирать команду. Поэтому последний сегмент, содержащий команду, обязан содержать флаг PSH, чтобы приложение на принимающей стороне смогло начать её выполнение.

Завершение соединения

Известные проблемы

Реализация

См. также

Ссылки

Литература

  • Терри Оглтри. Модернизация и ремонт сетей = Upgrading and Repairing Networks. — 4-е изд. — М.: «Вильямс», 2005. — С. 1328. — ISBN 0-7897-2817-6.
  • Дуглас Камер. Сети TCP/IP, том 1. Принципы, протоколы и структура = Internetworking with TCP/IP, Vol. 1: Principles, Protocols and Architecture. — М.: «Вильямс», 2003. — С. 880. — ISBN 0-13-018380-6.
  • Андрей Робачевский, Сергей Немнюгин, Ольга Стесик. Операционная система UNIX. — 2-е изд. — "БХВ-Петербург", 2007. — С. 656. — ISBN 5-94157-538-6.

Шаблон:Link FA