Заголовки UDP и TCP. Их форматы и назначение. Структура пакета TCP (формат заголовка сегмента)

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

Человек может учиться двумя путями:

  1. Через тупое формальное зазубривание шаблонных способов решения типовых задач (чему сейчас в основном и учат в школе). Такое обучение малоэффективно. Наверняка вам приходилось наблюдать панику и полную беспомощность бухгалтера при смене версии офисного софта - при малейшем изменении последовательности кликов мышки, требуемых для выполнения привычных действий. Или приходилось видеть человека, впадающего в ступор при изменении интерфейса рабочего стола?
  2. Через понимание сути проблем, явлений, закономерностей. Через понимание принципов построения той или иной системы. В этом случае обладание энциклопедическими знаниями не играет большой роли - недостающую информацию легко найти. Главное - знать, что искать. А для этого необходимо не формальное знание предмета, а понимание сути.

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

Итак, начнем.

Принципы работы интернет-протоколов TCP/IP по своей сути очень просты и сильно напоминают работу нашей советской почты.

Вспомните, как работает наша обычная почта. Сначала вы на листке пишете письмо, затем кладете его в конверт, заклеиваете, на обратной стороне конверта пишете адреса отправителя и получателя, а потом относите в ближайшее почтовое отделение. Далее письмо проходит через цепочку почтовых отделений до ближайшего почтового отделения получателя, откуда оно тетей-почтальоном доставляется до по указанному адресу получателя и опускается в его почтовый ящик (с номером его квартиры) или вручается лично. Все, письмо дошло до получателя. Когда получатель письма захочет вам ответить, то он в своем ответном письме поменяет местами адреса получателя и отправителя, и письмо отправиться к вам по той же цепочке, но в обратном направлении.

На конверте письма будет написано примерно следующее:

Адрес отправителя: От кого : Иванов Иван Иванович Откуда : Ивантеевка, ул. Большая, д. 8, кв. 25 Адрес получателя: Кому : Петров Петр Петрович Куда : Москва, Усачевский переулок, д. 105, кв. 110

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

Каждый компьютер (он же: узел, хост) в рамках сети Интернет тоже имеет уникальный адрес, который называется IP-адрес (Internet Protocol Address), например: 195.34.32.116. IP адрес состоит из четырех десятичных чисел (от 0 до 255), разделенных точкой. Но знать только IP адрес компьютера еще недостаточно, т.к. в конечном счете обмениваются информацией не компьютеры сами по себе, а приложения, работающие на них. А на компьютере может одновременно работать сразу несколько приложений (например почтовый сервер, веб-сервер и пр.). Для доставки обычного бумажного письма недостаточно знать только адрес дома - необходимо еще знать номер квартиры. Также и каждое программное приложение имеет подобный номер, именуемый номером порта. Большинство серверных приложений имеют стандартные номера, например: почтовый сервис привязан к порту с номером 25 (еще говорят: «слушает» порт, принимает на него сообщения), веб-сервис привязан к порту 80, FTP - к порту 21 и так далее.

Таким образом имеем следующую практически полную аналогию с нашим обычным почтовым адресом:

"адрес дома" = "IP компьютера" "номер квартиры" = "номер порта"

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

Адрес отправителя (Source address): IP: 82.146.49.55 Port: 2049 Адрес получателя (Destination address): IP: 195.34.32.116 Port: 53 Данные пакета: ...

Конечно же в пакетах также присутствует служебная информация, но для понимания сути это не важно.

Обратите внимание, комбинация: "IP адрес и номер порта" - называется "сокет" .

В нашем примере мы с сокета 82.146.49.55:2049 посылаем пакет на сокет 195.34.32.116:53, т.е. пакет пойдет на компьютер, имеющий IP адрес 195.34.32.116, на порт 53. А порту 53 соответствует сервер распознавания имен (DNS-сервер), который примет этот пакет. Зная адрес отправителя, этот сервер сможет после обработки нашего запроса сформировать ответный пакет, который пойдет в обратном направлении на сокет отправителя 82.146.49.55:2049, который для DNS сервера будет являться сокетом получателя.

Как правило взаимодействие осуществляется по схеме «клиент-сервер»: "клиент" запрашивает какую-либо информацию (например страницу сайта), сервер принимает запрос, обрабатывает его и посылает результат. Номера портов серверных приложений общеизвестны, например: почтовый SMTP сервер «слушает» 25-й порт, POP3 сервер, обеспечивающий чтение почты из ваших почтовых ящиков «слушает» 110-порт, веб-сервер - 80-й порт и пр.

Большинство программ на домашнем компьютере являются клиентами - например почтовый клиент Outlook, веб-обозреватели IE, FireFox и пр.

Номера портов на клиенте не фиксированные как у сервера, а назначаются операционной системой динамически. Фиксированные серверные порты как правило имеют номера до 1024 (но есть исключения), а клиентские начинаются после 1024.

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

Однако человеку запоминать цифровые IP адреса трудно - куда удобнее работать с буквенными именами. Ведь намного легче запомнить слово, чем набор цифр. Так и сделано - любой цифровой IP адрес можно связать с буквенно-цифровым именем. В результате например вместо 82.146.49.55 можно использовать имя А преобразованием доменного имени в цифровой IP адрес занимается сервис доменных имен - DNS (Domain Name System).

Рассмотрим подробнее, как это работает. Ваш провайдер явно (на бумажке, для ручной настройки соединения) или неявно (через автоматическую настройку соединения) предоставляет вам IP адрес сервера имен (DNS). На компьютере с этим IP адресом работает приложение (сервер имен), которое знает все доменные имена в Интернете и соответствующие им цифровые IP адреса. DNS-сервер «слушает» 53-й порт, принимает на него запросы и выдает ответы, например:

Запрос от нашего компьютера: "Какой IP адрес соответствует имени www.сайт?" Ответ сервера: "82.146.49.55."

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

Например:

IP адрес нашего компьютера: 91.76.65.216 Браузер: Internet Explorer (IE), DNS сервер (стрима): 195.34.32.116 (у вас может быть другой), Страница, которую мы хотим открыть: www.сайт.

Набираем в адресной строке браузера доменное имя и жмем . Далее операционная система производит примерно следующие действия:

Отправляется запрос (точнее пакет с запросом) DNS серверу на сокет 195.34.32.116:53. Как было рассмотренно выше, порт 53 соответствует DNS-серверу - приложению, занимающемуся распознаванием имен. А DNS-сервер, обработав наш запрос, возвращает IP-адрес, который соответствует введенному имени.

Диалог примерно следующий:

Какой IP адрес соответствует имени www.сайт ? - 82.146.49.55 .

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

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

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

Зачем эти принципы надо понимать?

Например, вы заметили странное поведение своего компьютера - непонятная сетевая активность, тормоза и пр. Что делать? Открываем консоль (нажимаем кнопку «Пуск» - «Выполнить» - набираем cmd - «Ок»). В консоли набираем команду netstat -an и жмем . Эта утилита отобразит список установленных соединений между сокетами нашего компьютера и сокетами удаленных узлов. Если мы видим в колонке «Внешний адрес» какие-то чужие IP адреса, а через двоеточие 25-й порт, что это может означать? (Помните, что 25-й порт соответствует почтовому серверу?) Это означает то, что ваш компьютер установил соединение с каким-то почтовым сервером (серверами) и шлет через него какие-то письма. И если ваш почтовый клиент (Outlook например) в это время не запущен, да если еще таких соединений на 25-й порт много, то, вероятно, в вашем компьютере завелся вирус, который рассылает от вашего имени спам или пересылает номера ваших кредитных карточек вкупе с паролями злоумышленникам.

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

Ну и самое главное - эти знания крайне полезны при общении с техподдержкой .

Напоследок приведу список портов, с которыми вам, вероятно, придется столкнуться:

135-139 - эти порты используются Windows для доступа к общим ресурсам компьютера - папкам, принтерам. Не открывайте эти порты наружу, т.е. в районную локальную сеть и Интернет. Их следует закрыть фаерволлом. Также если в локальной сети вы не видите ничего в сетевом окружении или вас не видят, то вероятно это связано с тем, что фаерволл заблокировал эти порты. Таким образом для локальной сети эти порты должны быть открыты, а для Интернета закрыты. 21 - порт FTP сервера. 25 - порт почтового SMTP сервера. Через него ваш почтовый клиент отправляет письма. IP адрес SMTP сервера и его порт (25-й) следует указать в настройках вашего почтового клиента. 110 - порт POP3 сервера. Через него ваш почтовый клиент забирает письма из вашего почтового ящика. IP адрес POP3 сервера и его порт (110-й) также следует указать в настройках вашего почтового клиента. 80 - порт WEB -сервера. 3128, 8080 - прокси-серверы (настраиваются в параметрах браузера).

Несколько специальных IP адресов:

127.0.0.1 - это localhost, адрес локальной системы, т.е. локальный адрес вашего компьютера. 0.0.0.0 - так обозначаются все IP-адреса. 192.168.xxx.xxx - адреса, которые можно произвольно использовать в локальных сетях, в глобальной сети Интернет они не используются. Они уникальны только в рамках локальной сети. Адреса из этого диапазона вы можете использовать по своему усмотрению, например, для построения домашней или офисной сети.

Что такое маска подсети и шлюз по умолчанию (роутер, маршрутизатор)?

(Эти параметры задаются в настройках сетевых подключений).

Все просто. Компьютеры объединяются в локальные сети. В локальной сети компьютеры напрямую «видят» только друг друга. Локальные сети соединяются друг с другом через шлюзы (роутеры, маршрутизаторы). Маска подсети предназначена для определения - принадлежит ли компьютер-получатель к этой же локальной сети или нет. Если компьютер-получатель принадлежит этой же сети, что и компьютер-отправитель, то пакет передается ему напрямую, в противном случае пакет отправляется на шлюз по умолчанию, который далее, по известным ему маршрутам, передает пакет в другую сеть, т.е. в другое почтовое отделение (по аналогии с советской почтой).

Напоследок рассмотрим что же означают непонятные термины:

TCP/IP - это название набора сетевых протоколов. На самом деле передаваемый пакет проходит несколько уровней. (Как на почте: сначала вы пишете писмо, потом помещаете в конверт с адресом, затем на почте на нем ставится штамп и т.д.).

IP протокол - это протокол так называемого сетевого уровня. Задача этого уровня - доставка ip-пакетов от компьютера отправителя к компьютеру получателю. По-мимо собственно данных, пакеты этого уровня имеют ip-адрес отправителя и ip-адрес получателя. Номера портов на сетевом уровне не используются. Какому порту, т.е. приложению адресован этот пакет, был ли этот пакет доставлен или был потерян, на этом уровне неизвестно - это не его задача, это задача транспортного уровня.

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

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

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

Над транспортным уровнем находится прикладной уровень. На этом уровне работают такие протоколы, как http , ftp и пр. Например HTTP и FTP - используют надежный протокол TCP, а DNS-сервер работает через ненадежный протокол UDP.

Как посмотреть текущие соединения?

Текущие соединения можно посмотреть с помощью команды

Netstat -an

(параметр n указывает выводить IP адреса вместо доменных имен).

Запускается эта команда следующим образом:

«Пуск» - «Выполнить» - набираем cmd - «Ок». В появившейся консоли (черное окно) набираем команду netstat -an и жмем . Результатом будет список установленных соединений между сокетами нашего компьютера и удаленных узлов.

Например получаем:

Активные подключения

Имя Локальный адрес Внешний адрес Состояние
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 91.76.65.216:139 0.0.0.0:0 LISTENING
TCP 91.76.65.216:1719 212.58.226.20:80 ESTABLISHED
TCP 91.76.65.216:1720 212.58.226.20:80 ESTABLISHED
TCP 91.76.65.216:1723 212.58.227.138:80 CLOSE_WAIT
TCP 91.76.65.216:1724 212.58.226.8:80 ESTABLISHED
...

В этом примере 0.0.0.0:135 - означает, что наш компьютер на всех своих IP адресах слушает (LISTENING) 135-й порт и готов принимать на него соединения от кого угодно (0.0.0.0:0) по протоколу TCP.

91.76.65.216:139 - наш компьютер слушает 139-й порт на своем IP-адресе 91.76.65.216.

Третья строка означает, что сейчас установлено (ESTABLISHED) соединение между нашей машиной (91.76.65.216:1719) и удаленной (212.58.226.20:80). Порт 80 означает, что наша машина обратилась с запросом к веб-серверу (у меня, действительно, открыты страницы в браузере).

В следующих статьях мы рассмотрим, как применять эти знания, например

Заголовок UDP всегда имеет длину 64 бита. Поля, определённые в сегменте UDP (см. рисунок) включают следующие:
1. Порт отправителя (Source port): номер порта источника(16 бит)
2. Порт получателя (Destination port): номер порта назначения (16 бит)
3. Длина сообщения (Length): длина заголовка UDP и данных UDP (16 бит)
4. Контрольная сумма (Checksum): вычисленная контрольная сумма полей заголовка и данных (16 бит)
5. Данные (Data): данные протокола вышележащего уровня (upper-layer protocol — ULP) (переменная длина)
Примеры протоколов, которые используют UDP: TFTP, SNMP, Network File System (NFS) и Domain Name System (DNS).

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

Сегменты TCP передаются с помощью использования пакетов IP. Заголовок TCP следует за заголовком IP,. Это разделение допускает существование других протоколов на уровне хоста, отличных от TCP. Поля TCP заголовка включают следующие:

Порт отправителя (Source port): номер порта источника (16 бит)

Порт получателя (Destination port): номер порта назначения (16 бит)

Порядковый номер (Sequence number): порядковый номер первого октета данных
сегмента, используемый для гарантии правильного упорядочения приходящих данных
(32 бита)

Номер подтверждения (Acknowledgment number): следующий ожидаемый октет
TCP (32 бита)

Длина заголовка (Header length): количество 32-битных слов в заголовке (4 бита)

Зарезервировано (Reserved): установлено в 0 (3 бита)

Управляющие биты (Control bits): функции управления — такие как установка,
перегрузка и разрыв сеанса (9 бит). Одиночный бит, который имеет специальное
значение, часто рассматриваемое как флаг.

Окно (Window): число октетов, которое устройство согласно принять (16 бит)

Контрольная сумма (Checksum): вычисленная контрольная сумма полей заголовка и
данных (16 бит)

Указатель срочности данных (Urgent): показывает конец срочных данных (16 бит)

Опции (Options): в настоящее время определена одна опция — максимальный размер
сегмента TCP (0 или 32 бита)

Данные (Data): данные протокола вышележащего уровня (upper-layer protocol — ULP)
(переменная длина)

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

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

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

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

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

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

Характеристики протокола TCP:

    Перед передачей данных протокол устанавливает соединение

    Полнодуплексная передача – есть 2 логических канала – входной и выходной

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

    TCPрассматривает данные как байтовый поток

    Управление потоком со стороны отправителя и получателя

Структура TCP-сегмента:IP | TCP | данные IP= 20 байт;TCP+ данные = 65515 байт; => данные = 65515 – 20 = 65495 байт

Структура TCP-заголовка:

    Порт отправителя

    Порт получателя

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

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

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

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

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

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

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

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

    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 ).

Межсетевой протокол IP . Модуль IP является базовым элементом технологии Internet. Его центральной частью является таблица маршрутов. Таблица маршрутов заполняется администратором сети и обычно инициализируется в момент загрузки системы. Когда речь идет о простой локальной IP-сети, то протокол IP мало что добавляет к услугам Ethernet, за исключением того, что в сети будут работать все прикладные программы, реализованные для IP-технологии. Однако ситуация меняется, если речь идет о сетях, сопряженных шлюзом.

Протокол RIP (Routing Information Protocol) . Протокол предназначен для автоматического обновления таблицы маршрутов. При этом используется информация о состоянии сети, которая рассылается маршрутизаторами (routers). В соответствии с протоколом RIP любая машина может быть маршрутизатором. При этом все маршрутизаторы делятся на активные и пассивные. Активные маршрутизаторы сообщают о маршрутах, которые они поддерживают в сети. Пассивные маршрутизаторы читают эти широковещательные сообщения и исправляют свои таблицы маршрутов, но при этом сами информации в сеть не предоставляют. Обычно в качестве активных маршрутизаторов выступают шлюзы, а в качестве пассивных - обычные машины (hosts).

Протокол UDP . Этот протокол является одним из двух основных транспортных протоколов, расположенных сразу над IP. К заголовку IP-пакета UDP добавляет два поля: порт и контрольная сумма. Поле “порт” позволяет мультиплексировать информацию между разными прикладными процессами. Поле "контрольная сумма" позволяет поддерживать целостность данных

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

Прикладные программы взаимодействуют с модулем TCP также через порты. Существуют определенные стандартом номера портов, которые отведены под обслуживание стандартных сервисов Internet. Так telnet обслуживается через 23 порт, почта (SMTP) - через 25 и т.п.

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

Согласно протоколу TCP, поток байтов разбивается на пакеты. Любые данные для модуля TCP представляются в виде потока байтов. На другом конце виртуального канала данные снова собираются в поток. Модуль TCP не сохраняет разделения потоков данных на записи. Так можно записать в канал 5 записей по 80 байт, а прочитать одну в 400 байтов длиной

Подробное описание протокола tcp

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

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

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

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

Пользовательский интерфейс с TCP может выполнять такие команды как открыть (OPEN) или закрыть (CLOSE) соединение, отправить (SEND) или принять (RECEIVE) данные, или получить статус соединения (STATUS). Эти вызовы подобны любым другим вызовам функций операционной системы из пользовательской программы, таким как открытие, чтение или закрытие файла.

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

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

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

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

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

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

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

 Процедура установления соединения и передача данных

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

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

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

Транспортный уровень

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

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

Transmission Control Protocol

Transmission Control Protocol (TCP) (протокол управления передачей) - является обязательным протоколом стандарт TCP/IP , определенный в стандарте RFC 793, "Transmission Control Protocol (TCP)".

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

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

TCP обеспечивает свою надежность благодаря следующему:

  • Данные от приложения разбиваются на блоки определенного размера, которые будут отправлены.
  • Когда TCP посылает сегмент, он устанавливает таймер, ожидая, что с удаленного конца придет подтверждение на этот сегмент. Если подтверждение не получено по истечении времени, сегмент передается повторно.
  • Когда TCP принимает данные от удаленной стороны соединения, он отправляет подтверждение. Это подтверждение не отправляется немедленно, а обычно задерживается на доли секунды
  • TCP осуществляет расчет контрольной суммы для своего заголовка и данных. Это контрольная сумма, рассчитываемая на концах соединения, целью которой является выявить любое изменение данных в процессе передачи. Если сегмент прибывает с неверной контрольной суммой, TCP отбрасывает его и подтверждение не генерируется. (Ожидается, что отправитель отработает тайм-аут и осуществит повторную передачу.)
  • Так как TCP сегменты передаются в виде IP датаграмм, а IP датаграммы могут прибывать беспорядочно, также беспорядочно могут прибывать и TCP сегменты. После получения данных TCP может по необходимости изменить их последовательность, в результате приложение получает данные в правильном порядке.
  • Так как IP датаграмма может быть продублирована, принимающий TCP должен отбрасывать продублированные данные.
  • TCP осуществляет контроль потока данных. Каждая сторона TCP соединения имеет определенное пространство буфера. TCP на принимающей стороне позволяет удаленной стороне посылать данные только в том случае, если получатель может поместить их в буфер. Это предотвращает от переполнения буферов медленных хостов быстрыми хостами.

  • Порядковый номер выполняет две задачи:
    • Если установлен флаг SYN, то это начальное значение номера последовательности - ISN (Initial Sequence Number), и первый байт данных, которые будут переданы в следующем пакете, будет иметь номер последовательности, равный ISN + 1.
    • В противном случае, если SYN не установлен, первый байт данных, передаваемый в данном пакете, имеет этот номер последовательности.
  • Номер подтверждения - если установлен флаг ACK, то это поле содержит номер последовательности, ожидаемый получателем в следующий раз. Помечает этот сегмент как подтверждение получения.
  • Длина заголовка - задается словами по 32бита.
  • Размер окна - количество байт, которые готов принять получатель без подтверждения.
  • Контрольная сумма - включает псевдо заголовок, заголовок и данные.
  • Указатель срочности - указывает последний байт срочных данных, на которые надо немедленно реагировать.
  • URG - флаг срочности, включает поле "Указатель срочности", если =0 то поле игнорируется.
  • ACK - флаг подтверждение, включает поле "Номер подтверждения, если =0 то поле игнорируется.
  • PSH - флаг требует выполнения операции push, модуль TCP должен срочно передать пакет программе.
  • RST - флаг прерывания соединения, используется для отказа в соединении
  • SYN - флаг синхронизация порядковых номеров, используется при установлении соединения.
  • FIN - флаг окончание передачи со стороны отправителя

Рассмотрим структуру заголовка TCP с помощью сетевого анализатора Wireshark:


TCP порты

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

Номер порта - это условное 16-битное число от 1 до 65535, указывающее, какой программе предназначается пакет.

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

Каждый отдельный порт сервера TCP может предложить общий доступ к нескольким соединениям, потому что все TCP соединения идентифицируются двумя значениями: IP-адресом и TCP портом (сокет).

Все номера портов TCP, которые меньше чем 1024 - зарезервированы и зарегистрированы в Internet Assigned Numbers Authority (IANA).

Номера портов UDP и TCP не пересекаются.

TCP программы используют зарезервированные или хорошо известные номера портов, как показано на следующем рисунке.

Установление соединения TCP

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

Перед началом передачи каких-либо данных, согласно протоколу TCP, стороны должны установить соединение. Соединение устанавливается в три этапа (процесс «трёхкратного рукопожатия» TCP).

  • Запрашивающая сторона (которая, как правило, называется клиент) отправляет SYN сегмент, указывая номер порта сервера, к которому клиент хочет подсоединиться, и исходный номер последовательности клиента (ISN).
  • Сервер отвечает своим сегментом SYN, содержащим исходный номер последовательности сервера. Сервер также подтверждает приход SYN клиента с использованием ACK (ISN + 1). На SYN используется один номер последовательности.
  • Клиент должен подтвердить приход SYN от сервера своим сегментов SYN, содержащий исходный номер последовательности клиента (ISN+1) и с использованием ACK (ISN+1). Бит SYN установлен в 0, так как соединение установлено.

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