Это мой первый блог :)
Home
 

TCP (Transmission Control Protocol) и UDP (User Datagram Protocol)

TCP (Transmission Control Protocol — протокол управления передачей) — протокол четвертого уровня. Из семейства протоколов TCP/IP четвертого уровня существует два протокола: TCP и UDP, UDP проще.

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

Модель данных для TCP — это 2 встречно-направленные трубы (Connection oriented), то есть это потоки байтов (Octet stream data model), нумерованных, идущих обязательно в обоих направлениях. Это полнодуплексный протокол.

Этот протокол должен заботиться о разбиении данных на куски (Stream segmentation), упорядочивании при приеме данных, о том, чтобы ничего не потерялось. И не плохо было бы позаботиться о том, чтобы буфер приема не переполнялся — этим занимается flow-контроль, чтобы избежать излишней работы (отправление данных, которые будут неминуемо сбрасываться).

Особенности TCP:

  • Connection oriented
  • Octet stream data model — похоже на ситуации, когда вы открываете Unixовый неструктурированный файл, сделано это для того, чтобы разница между TCP-потоком и файлом была минимальна.
  • Stream segmentation — обеспечивается автоматически, вы о нем не заботитесь.
  • Multiplexing — если между двумя машинами нужно открыть больше, чем 1 логический поток. Обеспечивается дополнительными адресными полями в заголовке (номера портов). И именно благодаря номерам портов взаимодействующие хосты могут открывать несколько соединений, текущих параллельно.
  • Acknowledgement — посылается посегментно (обычно). TCP нумерует все октеты.
  • Headers and data checksum protection — checksum покрывается все, и данные и заголовки.
  • Resequencing and anti-duplication — если в сети будут дубликаты, то TCP уничтожит их. Данные придут в правильном порядке.
  • Flow control — предупреждение избыточных потерь, обусловленных переполнением буфера.

TCP передает данные в виде кусков, которые называются сегментами.

Формат заголовка сегмента

Формат заголовка сегмента

Заголовок сегмента имеет 2 поля, называемые Source Port и Destination Port, которые идентифицируют процессы открывших соединений. Дальше идет поле Sequence Number, которое обозначает номер первого октета данных в этом сегменте. Acknowledgment Number — это номер октета, который мы ожидаем получить от источника на данном этапе соединения. Data Offset указатель на начало данных, поскольку присутствует поле переменного размера Options/Padding. Дальше идут флаги. Window количество октетов, которые в состоянии приемник еще принять до состояния переполнения буфера (элемент flow-контроля). Checksum считается по всем заголовкам и данным. Urgent Pointer неуклюжая попытка внести в байтовый поток некие структуры, выделить некоторые данные, которые отличаются с точки зрения протокола от других данных в потоке.

TCP-заголовок, вставленный в IP

TCP-заголовок, вставленный в IP

Эта картинка показывает важный механизм мультиплексинга. Сверху IP-заголовок, а снизу TCP-заголовок. Нижнее поле Options/Padding принадлежит IP-заголовку, а ниже данные TCP.  Как определить, какой сегмент принадлежит тому или иному соединению? Такое решение делается на основе 4 полей. Source Address + Source Port = Source  Socket, Destination Address + Destination Port = Destination Socket. Эти поля определяют поток данных того или иного соединения.

Если очень быстро открывать и закрывать соединения, то в сети могу еще остаться пакеты, например, дубликаты. А вы уже снова открыли соединение, оно снова существует, а на вас валятся старые дубликаты, принадлежащие старому соединению, при этом номера портов у них могут совпадать. Это пораждает проблемы с выбором начальных адресов.

Флаги обозначают либо особый смысл, придаваемый некому сегменту, или активность некоторых полей.

  • URG (Urgent Pointer field significant) говорит о том, что поле  Urgent Pointer содержит осмысленную информацию.
  • ACK (Acknowledgment field significant) присутствует во всех, кроме первого сегмента — открывающего.
  • PSH (Push Function) устаревшая функция, ставится везде. Означал, что данные нужно немного поднакопить в стеке, а потом только отдать.
  • RST (Reset the connection) — сброс, крайняя мера по выходу из затруднительных ситуаций, когда вы получаете по этому соединению сегмент, которые принадлежит вам, но содержит некорректные данные.
  • SYN (Synchronize sequence numbers) — очень важный флаг, которые обеспечивает открытие соединения.
  • FIN (No more data from sender) — финальный флаг, говорит о том, что эта сторона не имеет и не будет иметь никаких данных больше для посылки.

При открытии соединения хосты обмениваются посылками с флагами SYN и информируют друг друга о начальных значениях счетчиков октетов, установленных на каждом из хостов, начинают не с нуля, иначе бы при быстром пересоединении в сети наступал хаус. Высока вероятность того, что в сети будут пакеты с близкими номерами, которые вы используете сейчас. Стандарт просто предписывает использовать какой-нибудь из системных таймеров для начальной установки Sequence Number.

Acknowledgmentом мы подтверждаем не каждый октет, а отправляем корреспонденту номер октета, которые мы ожидаем получить с его стороны. Acknowledgment посылается со всеми сообщениями, кроме редких исключений.

Urgent-механизм работает следующим образом: если у вас были бы данные, которые нужно обработать срочно, то вы можете пометить конец этих данных указателем Urgent и поставить соответствующий флаг. Можно указать только конец «важных» данных, но нельзя указать их начало. Поэтому в большинстве случаев присутствие Urgent флага бессмысленно.

Checksum. Чтобы использовать достаточную защиту, она использует «спаривание headerов». Получается Checksum, посчитанная по TCP-заголовку, TCP-данным и по некоторой выжимки из TCP-псевдозаголовка. Битая Checksum попадается редко, потому что большинство искаженных frame ловятся на уровне IP, и обычно в случае системных сбоев.

TCP Pseudo-header

TCP Pseudo-header

Опций не много. Вот парочка из них.

  • Maximum Segment Size, которая позволяет вам подсказать вашему корреспонденту максимальный размер сегмента, который тот может использовать. На самом деле мыслилось, что будут какие-то убогие реализации, которые, например, будут не в состоянии обрабатывать сегменты больше определенного размера. Сейчас оно выставляется в 1,5 килобайта. Для тех datagram, которые будут доставляться с помощью маршрутизаторов (то есть из другой сети), размер желателен около 500 байт, чтобы в среднем они примерно нормально пролазила (без фрагментации IP-пакетов).
  • Window Scale Factor — множитель, на который нужно помножить значение поля Window, чтобы получить максимальный размер окнаКак начинает TCP-соединение:У TCP есть определенная диаграмма состояний. Хост В — это сервер, он находится в состоянии Listen, а хост А — это клиент, он является инициатором соединения, изначально находится в состоянии Closed. Хост А инициирует соединение, посылая первый сегмент без данных, без Acknowledge, с флагом SYN и с некоторым выбранным Sequence Number (соответствует начальному значению счетчика). Эта datagram переводит хост В в состояние SYN-RECEIVED, а хост А в состояние SYN-SENT. Переход в состояние SYN-RECEIVED приводит к генерации datagram, которая также не содержит данных, но содержит Acknowledge, который подтверждает прием SYN и сообщает номер следующего октета, который он готов принять. Хост А, получив SYN и Acknowledge, переходит в состояние ESTABLISHED. Теперь считается, что соединение состоялось. После Acknowledge на datagram с SYN от хоста А, переводит хост В в состояние ESTABLISHED. На случай если все плохо, можно послать RESET. Соединение закроется и начнется открытие нового соединения.
    TCP Connection Establishment

    TCP Connection Establishment

    Duplicated SYN

    Duplicated SYN

    Connection Abort

    Connection Abort

    Bulk Dataflow

    Bulk Dataflow

    Slow-start — еще один механизм flow-контроля, необходим для «прощупывания» сети, обычно это дело отправителя. Предупреждает от бездушного поведения: вывалить все-все в сеть за 1 прием. Как же все происходит. После успешного обмена SYNами отправитель посылает 1 сегмент и ждет подтверждения. После этого посылает 2, 4 и т.д. Это продолжается до тех пор, пока сегменты в сети не начнут теряться. После этого начинает свою работу другой процесс — Conditioned Avoidance.  Возвращается на предыдущий успешный шаг Slow-start и начинает аддитивно наращивать количество пакетов до неудачной попытки. Condition Window — количество сегментов, которое можно вывалить в сеть без подтверждения.

    Таймеры.

    • Retransmission timer используется, когда другая сторона перестала отсылать ack вовсе. Будет удваиваться время повтора и высылаться какие-то посылочки для проверки связи, и так будет довольно долго повторяться. Соединение закроется минут через 2-10.
    • Persist timer отвечает за то, чтобы вы получали информацию об окне с другой стороны, даже если размер окна равен 0.
    • Keepalive timer отвечает за периодическую отправку данных для детектирования жизнеспособности соединения. Если обмен не состоится, то соединение закрывается.
    • 2MSL не позволяет другим приложениям открывать новое соединение на те же пары портов в течении некоторого времени, которое необходимо для гарантии того, что никаких пакетов на такую пару соединений уже не останется в сети на момент открытия нового соединения.

    UDP

    Придуман минимальный wrapping, который позволяется вам жить с минимальным сервисом IP, но который позволяет вам отличать некоторые пакеты по ярлычку, этот протокол называется UDP (User Datagram Protocol). UDP позволяет маркировать ваши IP datagramы, как принадлежащие вашему процессу и предлагает совсем небольшой заголовок. Он ни предлагает ни нумерации, ни каких механизмов flow-контроля. Заголовок UDP состоит из следующих полей: sourse port, destinatoin port и чек-сумма (с зацеплением заголовка). DNS и различные протоколы маршрутизации пользуются этим протоколом.

    —————————————————————
    Статья основа на лекциях Беляева Платона Евгеньевича по предмету «Компьютерные сети» на кафедре АФТИ ФФ НГУ.

09.05.2012 This post was written by Categories: Компьютерные сети 2 комментария

2 комментария to “TCP (Transmission Control Protocol) и UDP (User Datagram Protocol)”


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Top