Сообщение tcp передается в поле данных дейтаграммы

Обновлено: 18.05.2024

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

Транспортный уровень должен иметь два разных протокола передачи, а именно протокол управления передачей, ориентированный на соединение TCP (протокол управления передачей) и протокол дейтаграмм пользователя без установления соединения UDP (протокол дейтаграмм пользователя).

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

Когда транспортный уровень использует протокол UDP без установления соединения, этот логический канал связи является ненадежным каналом.

Блок данных, передаваемый двумя одноранговыми объектами передачи во время связи, называется блоком данных транспортного протокола (TPDU).

Протокол блока данных, передаваемого по TCP, является сегментом TCP.

Какой протокол выбрать?

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

Протокол пользовательских дейтаграмм (UDP)

UDP только добавляет функцию порта и функцию обнаружения ошибок в службу дейтаграмм IP.

Основные особенности UDP:

UDP не имеет соединения, то есть нет необходимости устанавливать соединение перед отправкой данных.

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

UDP поддерживает интерактивную связь один-к-одному, один-ко-многим, многие-к-одному и многие-ко-многим.

UDP имеет небольшой заголовок, всего 8 байтов.

 UDP

Прикладной уровень передает длину пакетов UDP, и UDP отправляет их такими, какие они есть, то есть по одному пакету за раз.

Формат заголовка UDP

UDP

Пользовательская датаграмма UDP имеет два поля: поле данных и поле заголовка. Поле заголовка имеет 8 байтов и состоит из 4 полей, каждое из которых составляет два байта.

Номер порта UDP

Поскольку многие программы должны использовать протокол UDP, протокол UDP должен использовать флаг, чтобы различать пакеты данных, требуемые различными программами. Функция номера порта лежит здесь. Например, определенная программа UDP A зарегистрировала в системе порт 3000. Затем пакеты UDP с номером порта назначения 3000, переданные извне, будут переданы программе. Номер порта теоретически может иметь 2 16 Так много Потому что его длина составляет 16 бит.

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

Протокол управления передачей (TCP)

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

TCP - это протокол транспортного уровня, ориентированный на соединение.

Каждое TCP-соединение может иметь только две конечные точки, и каждое TCP-соединение может быть только двухточечным (один-к-одному).

TCP предоставляет надежные услуги доставки.

TCP обеспечивает полнодуплексную (полнодуплексную) связь. Эта полнодуплексная связь будет занимать линию связи между двумя компьютерами, пока она не будет закрыта одной или обеими сторонами.

Байт потока ориентированным. Значение ориентированного на байтовые потоки: хотя взаимодействие между приложением и TCP является одним блоком данных за раз, данные, передаваемые TCP, представляют собой только серию неструктурированных байтовых потоков.

TCP-сокет

Каждое TCP-соединение имеет две конечные точки. Конечная точка TCP-соединения называется сокетом или сокетом.

Номер порта соединяется с IP-адресом для формирования сокета.

Сокет = (IP-адрес: номер порта)

Каждое TCP-соединение однозначно определяется двумя конечными точками (то есть двумя сокетами) на обоих концах соединения. То есть:

Работа сокета при установлении TCP-соединения:

Когда сокет создан, его номер порта и IP-адрес пусты, поэтому процесс приложения должен вызвать bind, чтобы указать локальный адрес сокета. При вызове bind на стороне сервера известный номер порта и локальный IP-адрес заполняются в созданный сокет. Это называется привязкой локального адреса к сокету.

После того как сервер вызывает bind, он также должен вызвать listen (listen), чтобы установить сокет в пассивный режим, чтобы в любое время принимать запросы на обслуживание клиентов. Поскольку сервер UDP предоставляет только службы без установления соединения, он не использует системный вызов listen.

Затем сервер вызывает accept, чтобы принять запрос на подключение от процесса удаленного клиента. Одна переменная системного вызова accept должна указывать, из какого сокета произошло соединение.

TCP-ориентированная концепция

TCP

TCP не заботится о том, как долго процесс приложения отправляет пакеты в буфер TCP одновременно.

TCP может разделить слишком длинные блоки данных на более короткие и затем передавать их. TCP также может ожидать накопления достаточного количества байтов, прежде чем формировать сегмент для отправки.

TCP

Порядковый номер - каждый байт в потоке данных, передаваемом по TCP-соединению, кодируется порядковым номером. Значение поля порядкового номера относится к порядковому номеру первого байта данных, отправленных в этом сегменте.

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

Emergency URG —— Когда URG = 1, это означает, что поле аварийного указателя является действительным. Он сообщает системе, что в этом сегменте имеются срочные данные, которые следует передавать как можно скорее (эквивалент данных с высоким приоритетом).

Подтверждение ACK-Поле номера подтверждения действительно только тогда, когда ACK = 1. Когда ACK = 0, номер подтверждения недействителен.

Push PSH (PuSH) -Получить TCP После получения сегмента PSH = 1 процесс доставки доставляется как можно скорее, вместо того, чтобы ждать, пока весь кэш заполнится, прежде чем доставить его вверх.

Сброс RST (ReSeT) - когда RST = 1, это указывает на наличие серьезной ошибки в соединении TCP (например, из-за сбоя хоста или по другим причинам), соединение должно быть сброшено, а затем повторно установлено соединение передачи.

Завершить FIN (FINis) - используется для освобождения соединения. FIN = 1 указывает, что данные на передающем конце этого сегмента были отправлены и требует, чтобы соединение для передачи было освобождено.

Поле окна - используется, чтобы позволить другой стороне установить основу для отправки окна, единица измерения - байт.

Контрольная сумма - область проверки и проверки поля включает заголовок и данные. При вычислении контрольной суммы перед сегментом TCP должен быть добавлен 12-байтовый псевдо заголовок.

Поле аварийного указателя - указывает, сколько байтов аварийных данных находится в этом сегменте (аварийные данные помещаются вверху данных в этом сегменте).

Опция поля переменной длины.

Опция расширения окна - занимает 3 байта, один из которых представляет значение сдвига S. Новое значение окна равно числу битов окна в заголовке TCP, увеличенному до (16 + S), что эквивалентно смещению значения окна влево на S битов, чтобы получить фактический размер окна.

Параметр Timestamp занимает 10 байтов, из которых наиболее важными являются поле значения метки времени (4 байта) и поле ответа эхо-метки времени (4 байта).

Выберите опцию подтверждения - скажите отправителю не отправлять полученные данные снова.

Поля заполнения - это сделать всю длину заголовка целым числом, кратным 4 байтам.

TCP надежная передача

TCP надежная передача включает в себя следующее:

  1. Контрольная сумма, тайм-аут, механизм подтверждения
  2. Скользящее окно в потоке байтов
  3. Управление потоком с помощью раздвижных окон
  4. Контроль перегруженности с использованием алгоритмов медленного запуска и предотвращения перегрузок, алгоритмов быстрой повторной передачи и быстрого восстановления
  5. TCP-соединение с использованием трехстороннего рукопожатия
  6. Используйте четыре волны, чтобы освободить соединение TCP

Принцип работы надежной передачи TCP кратко описывается следующим образом:

Данные приложения делятся на блоки данных, которые TCP считает наиболее подходящими для отправки.

Когда TCP отправляет сегмент, он запускает таймер и ожидает назначения, чтобы подтвердить получение сегмента. Если подтверждение не может быть получено вовремя, сегмент будет отправлен повторно.

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

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

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

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

Механизм подтверждения и повторной передачи



  • После отправки пакета копия отправленного пакета должна быть временно сохранена.
  • Обе группы и группа подтверждения должны быть пронумерованы.
  • Время повторной передачи таймера тайм-аута должно быть больше, чем среднее время круговой передачи данных в пакетах.

Используя вышеупомянутые механизмы подтверждения и повторной передачи, мы можем добиться надежной связи в ненадежных сетях передачи.

Этот надежный протокол передачи часто называют ARQ (автоматический запрос повторения). ARQ указывает, что запрос на повторную передачу выполняется автоматически. Получателю не нужно запрашивать отправителя повторно передать ошибочный пакет.

Раздвижное окно

На каждом конце TCP-соединения должно быть два окна - окно отправки и окно приема.

Четыре окна на обоих концах TCP часто находятся в динамических изменениях.

RTT время прохождения соединения TCP не является фиксированным. Для оценки более разумного времени повторной передачи необходимо использовать конкретный алгоритм.

Таймер сохранения

TCP имеет непрерывный таймер для каждого соединения.

Как только одна сторона TCP-соединения получает уведомление другой стороны о нулевом окне, она запускает таймер продолжительности.

Если время, установленное непрерывным таймером, истекает, отправляется сегмент обнаружения с нулевым окном (несущий только 1 байт данных), и другая сторона выдает текущее значение окна при подтверждении сегмента обнаружения.

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

Если окно не равно нулю, тупик может быть сломан.

Установление и прекращение TCP-соединения

TCP является протоколом, ориентированным на установление соединения, поэтому обе стороны должны установить соединение перед отправкой данных.

Данные TCP отправляются через следующий процесс:

Обе стороны устанавливают связь.

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

TCP трехстороннее рукопожатие для установления соединения

TCP

Первое рукопожатие: TCP A отправляет сегмент запроса соединения в B. Бит синхронизации в его заголовке равен SYN = 1, и выбран порядковый номер seq = x, указывая, что порядковый номер первого байта данных при передаче данных равен x.

Второе рукопожатие: после того, как TCP B получает сегмент запроса соединения, если он соглашается, он отправляет подтверждение обратно. B. В сегменте подтверждения SYN = 1, ACK = 1, номер подтверждения ack = x + 1 и порядковый номер seq = y по вашему выбору.

Третье подтверждение: после получения этого сегмента A выдает подтверждение B. Его ACK = 1 и номер подтверждения ack = y + 1. TCP A уведомляет верхний прикладной процесс, что соединение установлено. После получения подтверждения от хоста A TCP из B также уведомляет процесс своего верхнего приложения о том, что установлено соединение TCP.

Зачем нам три рукопожатия?

Для трехстороннего рукопожатия для установления соединения необходимо инициализировать начальное значение порядкового номера. Обе стороны связи должны информировать друг друга об их собственном начальном значении порядкового номера, поэтому этот процесс также называется синхронизацией SYN. То есть, x и y на рисунке выше, этот порядковый номер должен использоваться в качестве порядкового номера для будущей связи, чтобы гарантировать, что данные, принятые прикладным уровнем, не будут не в порядке из-за проблем передачи в сети (TCP будет использовать этот порядковый номер для объединения данных).

TCP махнул четыре раза, чтобы освободить соединение

TCP

Первая волна рук: после завершения передачи данных обе стороны могут разорвать соединение. Теперь процесс приложения A сначала отправляет сегмент освобождения соединения в свой TCP, прекращает отправку данных и активно закрывает соединение TCP. A ставит FIN = 1 в начало сегмента разъединения соединения, а его порядковый номер seq = u, ожидая подтверждения B.

Вторая волна: B отправляет подтверждение, номер подтверждения ack = u + 1 и порядковый номер seq = v этого сегмента. Процесс сервера TCP уведомляет процессы приложений высокого уровня. Соединение от A до B разорвано, соединение TCP установленоНаполовину закрыт(TCP предоставляет возможность одному концу соединения получать данные с другого конца после завершения отправки). Если B отправляет данные, A все еще должен их получить.

Третья волна: если B не имеет данных для отправки в A, процесс его приложения уведомляет TCP об освобождении соединения.

Четвертая волна: A должен подтвердить после получения сегмента разъединения соединения. В сегменте подтверждения ACK = 1, номер подтверждения ack = w + 1 и собственный порядковый номер seq = u + 1. Соединение TCP должно быть разорвано после 2MSL.

Почему А должен ждать 2MSL?

Чтобы последний сегмент ACK, отправленный A, мог достичь B.

Интеллектуальная рекомендация


Тема ------ Thread Dead Block Причина, метод Discovery Line Dead Lock, как избежать резьбы мертвого блокировки

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


CSS --- Настройки стиля полосы прокрутки


Используйте pip install в блокноте Jupyter для установки сторонних пакетов Python (возьмите в качестве примера matplotlib)

В одном предложении дается краткое описание установки ноутбука Jupyter (подходит для более озабоченных читателей) Как использовать: вpip install -[Package]Добавить один перед!Просто, например, если вы.


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

Выполняет функции протокола транспортного уровня модели OSI.

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

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

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

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

Схема работы пользовательского приложения с TCP в общих чертах состоит в следующем. Для передачи данных пользовательскому процессу надо вызвать соответствующую функцию TCP, с указанием на буфер передаваемых данных. TCP упаковывает эти данные в сегменты своего стека и вызывает функцию передачи протокола нижнего уровня, например IP.

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

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

Краткое описание протоколов семейства TCP/IP с расшифровкой аббревиатур

Состав и предназначение полей заголовка

ТСР-сегменты отправляются как IP-дейтаграммы. Заголовок TCP, следующий за IP-заголовком, содержит информацию TCP-протокола.

Source Port (16 бит). Порт отправителя.

Destination Port (16 бит). Порт получателя.

Sequence Number (32 бита). Номер кадра. Номер кадра первого октета данных в этом сегменте (за исключением пакета, где присутствует флаг SYN). Если в пакете присутствует флаг SYN, то номер данного пакета становится номером начала последовательности (ISN) и номером первого октета данных становится номер ISN+1.

Acknowledgment Number (32 бита). Поле номера кадра подтвержденного получения. Если пакет содержит установленный контрольный бит АСК, то это поле содержит номер следующего пакета данных отправителя, который ожидает получатель. При установленном соединении пакет подтверждения отправляется всегда.

Data Offset (4 бита). Поле величины смещения данных. Оно содержит количество 32-битных слов заголовка TCP-пакета. Это число определяет смещение расположения данных в пакете.

Reserved (6 бит). Резервное поле. Поле зарезервировано.

Флаги управления (слева направо):

  • URG: Флаг срочности
  • АСК: Флаг пакета, содержащего подтверждение получения
  • PSH: Флаг форсированной отправки
  • RST: Переустановка соединения
  • SYN: Синхронизация чисел последовательности
  • FIN: Флаг окончания передачи со стороны отправителя

Window (16 бит). Окно. Это поле содержит количество байт данных, которое отправитель данного сегмента может принять, отсчитанное от номера байта, указанного в поле Acknowledgment Number.

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

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

Options. Поле дополнительных параметров: может быть переменной длины.

Padding. Заполнение: переменная длина. Заполнение (нулями) TCP-заголовка используется для выравнивания его по 32-битному слову.

Эта ссылка на наглядное видео. К сожалению, оно на английском языке, но и так понятно.Принцип работы протокола TCP/IP

Большинство из нас знает TCP/IP как "клей", связующий Internet. Но не многие способны дать убедительное описание того, что этот протокол представляет собой и как работает. Итак, что же такое TCP/IP в действительности?

TCP/IP - это средство для обмена информацией между компьютерами, объединенными в сеть. Не имеет значения, составляют ли они часть одной и той же сети или подключены к отдельным сетям. Не играет роли и то, что один из них может быть компьютером Cray, а другой Macintosh. TCP/IP - это не зависящий от платформы стандарт, который перекидывает мосты через пропасть, лежащую между разнородными компьютерами, операционными системами и сетями. Это протокол, который глобально управляет Internet, и в значительной мере благодаря сети TCP/IP завоевал свою популярность.

Понимание TCP/IP главным образом подразумевает способность разбираться в наборах таинственных протоколов, которые используются главными компьютерами TCP/IP для обмена информацией. Давайте рассмотрим некоторые из этих протоколов и выясним, что составляет оболочку TCP/IP.

TCP/IP - это аббревиатура термина Transmission Control Protocol/Internet Protocol (Протокол управления передачей/Протокол Internet). В терминологии вычислительных сетей протокол - это заранее согласованный стандарт, который позволяет двум компьютерам обмениваться данными. Фактически TCP/IP не один протокол, а несколько. Именно поэтому вы часто слышите, как его называют набором, или комплектом протоколов, среди которых TCP и IP - два основных.

Программное обеспечение для TCP/IP, на вашем компьютере, представляет собой специфичную для данной платформы реализацию TCP, IP и других членов семейства TCP/IP. Обычно в нем также имеются такие высокоуровневые прикладные программы, как FTP (File Transfer Protocol, Протокол передачи файлов), которые дают возможность через командную строку управлять обменом файлами по Сети.

TCP/IP - зародился в результате исследований, профинансированных Управлением перспективных научно-исследовательских разработок (Advanced Research Project Agency, ARPA) правительства США в 1970-х годах. Этот протокол был разработан с тем, чтобы вычислительные сети исследовательских центров во всем мире могли быть объединены в форме виртуальной "сети сетей" (internetwork). Первоначальная Internet была создана в результате преобразования существующего конгломерата вычислительных сетей, носивших название ARPAnet, с помощью TCP/IP.

TCP/IP дает решение проблемы данными между двумя компьютерами, подключенными к одной и той же интрасети, но принадлежащими различным физическим сетям. Решение состоит из нескольких частей, причем каждый член семейства протоколов TCP/IP вносит свою лепту в общее дело. IP - самый фундаментальный протокол из комплекта TCP/IP - передает IP-дейтаграммы по интрасети и выполняет важную функцию, называемую маршрутизацией, по сути дела это выбор маршрута, по которому дейтаграмма будет следовать из пункта А в пункт B, и использование маршрутизаторов для "прыжков" между сетями.

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

Проектировщики вычислительных сетей часто используют семиуровневую модель ISO/OSI (International Standards Organization/Open Systems Interconnect, Международная организация по стандартизации/ Взаимодействие открытых систем), которая описывает архитектуру сетей. Каждый уровень в этой модели соответствует одному уровню функциональных возможностей сети. В самом основании располагается физический уровень, представляющий физическую среду, по которой "путешествуют" данные, - другими словами, кабельную систему вычислительной сети. Над ним имеется канальный уровень, или уровень звена данных, функционирование которого обеспечивается сетевыми интерфейсными платами. На самом верху размещается уровень прикладных программ, где работают программы, использующие служебные функции сетей.

На рисунке показано, как TCP/IP согласуется с моделью ISO/OSI. Этот рисунок также иллюстрирует уровневое строение TCP/IP и показывает взаимосвязи между основными протоколами. При переносе блока данных из сетевой прикладной программы в плату сетевого адаптера он последовательно проходит через ряд модулей TCP/IP. При этом на каждом шаге он доукомплектовывается информацией, необходимой для эквивалентного модуля TCP/IP на другом конце цепочки. К тому моменту, когда данные попадают в сетевую плату, они представляют собой стандартный кадр Ethernet, если предположить, что сеть основана именно на этом интерфейсе. Программное обеспечение TCP/IP на приемном конце воссоздает исходные данные для принимающей программы путем захвата кадра Ethernet и прохождения его в обратном порядке по набору модулей TCP/IP. (Один из наилучших способов разобраться во внутреннем устройстве TCP/IP стоит в использовании программы-"шпиона", чтобы найти внутри кадров, "пролетающих" по сети, информацию, добавленную различными модулями TCP/IP.)

В левой части этой диаграммы показаны уровни модели ISO/OSI. Правая часть диаграммы иллюстрирует корреляцию TCP/IP с этой моделью.

Если браузер и сервер работают на компьютерах, подключенных к различным физическим сетям (как это обычно бывает), дейтаграммы передаются от сети к сети до тех пор, пока не достигнут той, к которой физически подключен сервер. В конце концов дейтаграммы достигают пункта своего назначения и вновь собираются таким образом, чтобы Web-сервер, который считывает цепочки данных из своего гнезда, получал непрерывный поток данных. Для браузера и сервера данные, записанные в гнездо на одном конце, как по волшебству, "всплывают" на другом конце. Но между этими событиями происходят все виды сложных взаимодействий для создания иллюзии непрерывной передачи данных между вычислительными сетями.

И это практически все, чем занимается TCP/IP: превращением множества небольших сетей в одну большую и предоставлением услуг, которые нужны прикладным программам для обмена информацией друг с другом по получающейся в итоге Internet.

О TCP/IP можно было бы рассказать много больше, но есть три ключевых момента:

TCP (Transmission Control Protocol, Протокол управления передачей) был спроектирован в качестве связующего протокола для обеспечения интерактивной работы между компьютерами. TCP обеспечивает надежность и достоверность обмена данными между процессами на компьютерах, входящих в общую сеть. TCP, с одной стороны, взаимодействует с прикладным протоколом пользовательского приложения, а с другой, с протоколом, обеспечивающим "низкоуровневые" функции: маршрутизацию и адресацию пакетов, которые, как правило, выполняет IP.

Схема работы пользовательского приложения с TCP, в общих чертах, состоит в следующем. Для передачи данных пользовательскому процессу надо вызвать соответствующую функцию TCP, с указанием на буфер передаваемых данных. TCP упаковывает эти данные в сегменты своего стека и вызывает функцию передачи протокола нижнего уровня, например IP.

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

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

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

Простейшая модель работы TCP-протокола выглядит обманчиво гладко, поскольку на самом деле реальная работа изобилует множеством деталей и тонкостей.

Логическая структура сетевого программного обеспечения, реализующего протоколы семейства TCP/IP в каждом узле сети Internet, изображена на рис. 2.12.

Прямоугольники обозначают обработку данных, а линии, соединяющие прямоугольники, - пути передачи данных. Горизонтальная линия внизу рисунка обозначает кабель сети Ethernet, которая используется в качестве примера физической среды. Понимание этой логической структуры является основой для понимания всей технологии TCP/IP.

Рис. 2.12.Структура сетевого программного обеспечения семейства протоколов TCP/IP

Потоки данных, стек протоколов, механизм гнезд и мультиплексирование соединений

Для установления соединения между двумя процессами на различных компьютерах сети необходимо знать не только Internet-адреса компьютеров, но и номер ТСР-порта, который процесс использует на данном компьютере. В совокупности с Internet-адресом компьютера порты образуют систему гнезд (sockets). Пара гнезд уникально идентифицирует каждое соединение или поток данных в сети Internet, а порт обеспечивает независимость каждого ТСР-канала на данном компьютере. Безусловно, несколько процессов на машине могут использовать один и тот же ТСР-порт, но с точки зрения удаленного процесса между этими процессами не будет никакой разницы.

Рассмотрим потоки данных, проходящие через протоколы. При использовании протокола TCP данные передаются между прикладным процессом и модулем TCP. Типичным прикладным процессом, использующим протокол TCP, является модуль FTP (File Transfer Protocol, Протокол передачи фай-лов). Стек протоколов в этом случае будет FTP/TCP/IP/ENET. При использовании протокола UDP (User Datagram Protocol, Протокол дейтаграмм пользователя) данные передаются между прикладным процессом и модулем UDP. Например, SNMP (Simple Network Management Protocol, Простой протокол управления сетью) пользуется транспортными услугами UDP. Его стек протоколов выглядит так: SNMP/UDP/IP/ENET.

Одно гнездо на компьютере может быть задействовано в соединениях с несколькими гнездами на удаленных компьютерах. Кроме того, одно и то же гнездо может передавать поток данных в обоих направлениях. Таким образом, механизм гнезд позволяет на одном компьютере одновременно работать нескольким приложениям и уникально идентифицирует каждый поток данных сети. Это называется мультиплексированием соединений.

Модули TCP, UDP и драйвер Ethernet являются мультиплексорами типа n x 1. Действуя как мультиплексоры, они переключают несколько входов на один выход. Они также являются демультиплексорами типа 1 х n. Как демультиплексоры, они переключают один вход на один из многих выходов в соответствии с полем типа в заголовке протокольного блока данных. Когда Ethernet-кадр попадает в драйвер сетевого интерфейса Ethernet, он может быть направлен либо в модуль ARP, либо в модуль IP. (Значение поля типа в заголовке кадра указывает, куда должен быть направлен Ethernet-кадр).

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

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

Установление соединения и передача данных

Соединение определяется вызовом команды OPEN с аргументами в виде номера локального порта и гнезда (IP-адрес + порт) удаленного процесса. Функция OPEN вызывается и в том случае, когда данный процесс намерен передавать информацию (активный OPEN), и когда процесс ожидает поступления информации (пассивный OPEN). Функция возвращает идентификатор соединения, по которому пользователь может ссылаться в своих последующих вызовах. Идентификатор соединения указывает на структуру данных, в которой хранятся переменные и информация данного TCP-соединения. Эта структура данных называется Управляющая Структура Передачи - Transmission Control Block (TCB).

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

Процесс может вызвать функцию пассивного открытия канала и ждать получения сигнала активного открытия канала от другого процесса, и только после получения такого сигнала соединение будет установлено. Соединение будет так же установлено, если два процесса активно откроют канал навстречу друг другу. Эта гибкость в установлении соединения особенно важна в распределенных сетях, когда компьютеры работают асинхронно.

Только в двух случаях принципиально важно, чтобы гнездо на данном компьютере было открыто как пассивное, а на другой стороне как активное:
1. Когда локальное пассивное открытие соединения полностью определяет гнездо на другой стороне.
2. Локальное пассивное открытие гнезда не предполагает каких-либо ограничений на гнездо с другой стороны, т. е. любое гнездо может присоединиться к данному сервису.

Если у вас на одном гнезде открыто пассивно, с соответствующими записями ТСВ, несколько соединений, то при открытии активного соединения на другом конце будет задействовано ТСВ, соответствующее параметрам, заданным активным гнездом. Если такого не существует, выбирается любое другое открытое гнездо.

Инициализация соединения начинается с обмена пакетами, которые отправляются при открытии канала пользователем, например, командой OPEN, и содержат флаг SYN и свой начальный порядковый номер пакетов данных. После этого гнезда ожидают пакет с ТСВ-партнера. Соединение считается установленным, когда в обоих направлениях синхронизируются нумерующие последовательности передаваемых пакетов, т. е. и клиент и сервер "знают", пакет с каким номером поступит с противоположного конца соединения.

Соединение закрывается, когда гнезда обмениваются пакетами, содержащими команду FIN. При этом все ресурсы системы, занятые ТСВ-данных соединений, должны быть освобождены.

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

Примечание:
Под словом "пользователь" здесь и далее будет пониматься пользовательский процесс или приложение, которое работает с TCP.

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

Назначение PUSH-функции и PUSH-флага состоит только в "проталкивании" данных к пользователю, минуя механизм кэширования. Команда PUSH не производит никаких дополнительных группировок или других действий над данными.

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

Механизмы обеспечения достоверности передаваемых данных

Протокол ТСР должен уметь работать с поврежденными, потерянными, дублированными или поступившими с изменением порядка пакетами. Это достигается благодаря механизму присвоения порядкового номера каждому передаваемому пакету данных и механизму проверок получения пакетов подтверждения доставки.

Когда TCP передает сегмент данных, копия этих данных помещается в очередь повтора передачи и запускается таймер ожидания подтверждения. Когда система получает подтверждение - сегмент TCP, содержащий управляющий флаг АСК, что этот пакет данных получен, она удаляет его из очереди. Сегмент подтверждения получения содержит номер полученного сегмента, на основании которого и происходит контроль доставки данных адресату. Если подтверждение не поступило до истечения срока таймера, пакет отправляется еще раз. Уведомление TCP о получении пакета данных еще не означает, что он был доставлен конечному пользователю. Оно только означает, что TCP выполнил возложенные на него функции.

При передаче информации каждому байту данных присваивается порядковый номер, поэтому, в какой бы последовательности эти пакеты не достигали точки назначения, они всегда будут собраны в изначально заданной последовательности. Порядковый номер первого байта данных в передаваемом сегменте называется порядковым номером сегмента. Нумерация проводится "с головы состава", т. е. от заголовка пакета. TCP-пакет также содержит "подтверждающий номер" (acknowledgment number), который представляет собой номер следующего ожидаемого пакета данных передачи в обратном направлении. Иными словами, номер обозначает: "до сих пор я все получил". Механизм с использованием "подтверждающего номера" позволяет исключать дублирование пакетов при повторной отправке недоставленных данных.

Кроме определения порядка следования информационных пакетов, "порядковый номер" играет большую роль в механизме синхронизации соединения и контроле потерянных пакетов при разрывах соединения. Однако необходимо помнить, что величина счетчика - нумератора все же ограничена. Пакеты могут нумероваться числами от 0 до 2(32-1). Таким образом, все арифметические операции со счетчиком пакетов производятся по модулю 232. Это не означает, что гнезда, в процессе соединения, могут обмениваться только ограниченным количеством пакетов. Поскольку в процессе обмена получатель и отправитель знают предыдущий, последующий номера пакетов и длину пакета, а эти величины хранятся в структуре ТСВ при образовании соединения, все операции сравнения по модулю 232 проводятся корректно.

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

Так, при установлении нового соединения генерируется 32-битное число ISN (Initial Sequence Number). Генератор использует 32 младших разряда машинного таймера, который меняется каждые 4 микросекунды (полный цикл - 4,55 часа). Это число и служит отсчетом нумератора пакетов. Кроме того, каждая дейтаграмма в сети имеет ограниченное время жизни MSL - Maximum Life Time, которое значительно меньше периода генератора. Таким образом, в сети гарантируется невозможность возникновения конфликтов пакетов с одинаковыми номерами.

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

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

Протокол TCP позволяет получателю последовательности пакетов регулировать передаваемый отправителем поток данных. Этот механизм основан на том, что при передаче флага подтверждения получения пакета (АСК) в ТСР-сегменте передается размер буфера данных, который может быть передан отправителем, не дожидаясь разрешения на отправку очередной порции данных от получателя. Иными словами - передается размер свободного места в стеке протокола, куда записываются только что принятые и ожидающие дальнейшей обработки данные. Из стека данные обрабатываются и передаются соответствующим процессам. Этот механизм позволяет избегать "пробок" при передаче данных между системами различной производительности.

"Окно" задается в количестве байт, отсчитываемых от номера байта, заданного в поле номера пакета "подтвержденного получения" (acknowledgment number) данных. Нулевой размер окна означает для отправителя команду приостановить передачу до готовности принимать данные получателем. Необходимо заметить, что в этом случае отправитель посылает однобайтные пакеты и на основании информации пакетов подтверждения возобновляет или нет дальнейшую передачу данных.

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

Флаг важности пакета, средства обеспечения безопасности протокола

Протокол TCP наследует все параметры секретности и приоритетности пакета, используемые IP и позволяет работать с ними для обеспечения собственной безопасности. В TCP-спецификации термин "секретность и изолированность" обозначает безопасность соединения, изолированность потоков данных и другие ограничения, которые обеспечивает IP.

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

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

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

Состав и предназначение полей заголовка

ТСР-сегменты отправляются как IP-дейтаграммы. Заголовок TCP, следующий за IP-заголовком, содержит информацию TCP-протокола (рис. 2.13).

Source Port (16 бит). Порт отправителя.

Destination Port (16 бит). Порт получателя.

Sequence Number (32 бита). Номер кадра. Номер кадра первого октета данных в этом сегменте (за исключением пакета, где присутствует флаг SYN). Если в пакете присутствует флаг SYN, то номер данного пакета становится номером начала последовательности (ISN) и номером первого октета данных становится номер ISN+1.

Рис. 2.13. Заголовок TCP-пакета

Acknowledgment Number (32 бита). Поле номера кадра подтвержденного получения. Если пакет содержит установленный контрольный бит АСК, то это поле содержит номер следующего пакета данных отправителя, который ожидает получатель. При установленном соединении пакет подтверждения отправляется всегда.

Data Offset (4 бита). Поле величины смещения данных. Оно содержит количество 32-битных слов заголовка TCP-пакета. Это число определяет смещение расположения данных в пакете.

Reserved (6 бит). Резервное поле. Поле зарезервировано.

Флаги управления (слева направо):

URG: Флаг срочности
АСК: Флаг пакета, содержащего подтверждение получения
PSH: Флаг форсированной отправки
RST: Переустановка соединения
SYN: Синхронизация чисел последовательности
FIN: Флаг окончания передачи со стороны отправителя

Window (16 бит). Окно. Это поле содержит количество байт данных, которое отправитель данного сегмента может принять, отсчитанное от номера байта, указанного в поле Acknowledgment Number.

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

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

Options. Поле дополнительных параметров: может быть переменной длины.

Padding. Заполнение: переменная длина. Заполнение (нулями) TCP-заголовка используется для выравнивания его по 32-битному слову.

Псевдозаголовок

Между TCP-заголовком и IP-заголовком располагается так называемый псевдозаголовок (рис. 2.14). Он состоит из IP-адреса отправителя (Source Address), IP-адреса получателя (Destination Address), типа протокола (PTCL) и длины TCP-пакета (TCP Length). Он предназначен для "страховки" неправильной маршрутизации TCP-пакета. Информация, расположенная в этом заголовке передается TCP от IP-протокола как аргумент или результат обработки вызова IP-функции.

Рис. 2.14. Формат псевдозаголовка
Более подробное описание протокола TCP можно найти в RFC-793, RFC-1180.

Читайте также: