Наиболее используемым протоколом набора протоколов Интернета является протокол управления передачей (Transmission Control Protocol - TCP) [Cerf & Kahn, 1974; Postel, 1981b]. TCP является надежным, ориентированным на соединение потоковым транспортным протоколом, поверх которого располагается большинство прикладных протоколов.
TCP протокол включает несколько особенностей, которых нет в других транспортных и сетевых протоколах, описанных до сих пор.
- Явные и подтверждаемые инициализация и завершение соединения.
- Надежная, упорядоченная доставка данных без дублирования.
- Управление потоком.
- Внеполосное указание срочных данных.
- Избежание перегрузки.
Из-за этих особенностей реализация TCP протокола намного более сложна, чем реализации UDP и IP. Эти осложнения, вместе с преобладанием использования TCP, делают подробности реализации протокола TCP как более критичными, так и более интересными, чем реализации более простых протоколов. На рис. показан поток данных через соединение TCP. Мы начнем с исследования самого протокола TCP, а затем продолжим с описания его реализации в FreeBSD.
TCP-соединение можно представить как двунаправленный упорядоченный поток данных, передаваемых между двумя узлами. Данные могут передаваться в пакетах различных размеров через разные промежутки времени - например, когда они используются для поддержки сеансов регистрации через сеть. Инициация и завершение потока являются явными событиями TCP в начале и конце потока и занимают положения в пространстве последовательностей потока таким образом, что их можно подтверждать тем же самым способом, как и данные. Номера последовательностей являются 32-разрядными числами из циклического пространства; т.е. сравнения делаются по модулю 232, поэтому ноль является следующим последовательным номером после 2-1.
Номера последовательностей для каждого направления начинаются с произвольного значения, которое называется начальным номером последовательности, отправляемым в первоначальном пакете для соединения. Вслед за Bellovin [1996] реализация протокола TCP выбирает начальный номер последовательности путем вычисления функции 4-элементного кортежа локального порта, внешнего порта, локального адреса, внешнего адреса, уникально идентифицирующего соединение, а затем добавления небольшого смещения, основанного на текущем времени. Этот алгоритм предотвращает имитацию TCP-соединений атакующим на основе угадывания следующего начального номера последовательности для соединения. Это должно также гарантировать то, что старый дублированный пакет не подойдет к пространству последовательностей текущего соединения.
TCP)" alt="Протокол управления передачей (TCP)" src="http://gateway.uz/images/stories/tcp.jpg" />
Каждый пакет TCP-соединения несет номер последовательности первого элемента данных и (за исключением момента установления соединения) подтверждение всех полученных непрерывных данных. Пакет TCP протокола называется сегментом, поскольку он начинается в определенном месте пространства последовательностей и имеет определенную длину. Подтверждения указываются в виде следующего еще не полученного номера последовательности. Подтверждения являются кумулятивными и поэтому могут подтверждать данные, полученные более чем в одном (или в части одного) пакете. Пакет может содержать или не содержать данные, но он всегда содержит номер последовательности следующего элемента данных для отправки.
Управление потоком в протоколе TCP осуществляется посредством схемы скользящего окна. Каждый пакет с подтверждением содержит окно, которое представляет собой число октетов данных, которые получатель готов принять, начиная с номера последовательности в подтверждении. Окно является 16-разрядным полем, ограничивая по умолчанию окно 65 535 октетами; однако можно договориться на использование большего окна. Срочные данные обрабатываются аналогичным образом; если установлен флаг, указывающий на срочные данные, указатель на них используется в качестве положительного смещения от номера последовательности пакета для указания размера срочных данных. Таким образом, TCP может отправить уведомление о срочных данных, не отправляя всех промежуточных данных, даже если окно управления потоком не позволило бы отправить промежуточные данные.

Полный заголовок TCP-пакета показан на рисунке. Флаги включают SYN и FIN, обозначая инициацию (синхронизацию) и завершение соединения. Каждый из этих флагов занимает в пространстве последовательностей один номер. Таким образом, полное соединение состоит из SYN, нуля или более октетов данных и FIN, отправленных каждым узлом и подтвержденных другим узлом. Дополнительные флаги указывают, действительны ли поля подтверждения (АСК) и срочных данных (URG), и включают сигнал прерывания соединения (RST). Опции кодируются тем же способом, что и опции IP: опции нет-операции и конец-опций являются простыми октетами, а все другие опции включают тип и размер.
Единственная опция в первоначальной спецификации протокола TCP обозначает максимальный размер сегмента (пакета), который корреспондент хочет принять; эта опция используется лишь в ходе первоначального установления соединения. Было определено несколько других опций. Чтобы избежать путаницы, стандарт протокола разрешает использовать эти опции в пакетах данных, лишь если обе конечные точки включили их в ходе установления соединения.
- 30/01/2010 11:53 - Кеш SYN
- 24/01/2010 19:31 - MTU. Установление соединения
- 21/01/2010 09:34 - Оценка времени обращения
- 16/01/2010 11:38 - Отметка времени. Номер последовательности. Переменные последовательности
- 16/01/2010 11:25 - SYN. Состояния ТСР-соединения
- 16/01/2010 11:03 - Процедура пересылки IP-пакетов
- 16/01/2010 10:58 - Процедура ввода IPv4. Входная процедура.
- 16/01/2010 10:46 - Размер пакета IP. Выходная процедура IP.
- 16/01/2010 10:40 - Протокол Интернета IP (ШЗ)
- 15/01/2010 17:34 - Управляющие операции