Межсетевое экранирование

         

Установление ТСР-соединения


ТСР является надежным протоколом в сетях, основанных на коммутации пакетов. Так как и пакетные фильтры, и stateful inspection firewall’ы анализируют параметры ТСР-протокола, рассмотрим подробно этот протокол. Стек протоколов TCP/IP выглядит следующим образом:

Таблица 1.3. Стек протоколов TCP/IP

Прикладной уровень
ТСР
IP
Коммуникационная сеть

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

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

Надежность обеспечивается с помощью того, что каждый пакет содержит свой последовательный номер и номер полученного пакета. С каждым октетом данных связывается последовательный номер. Этот номер указывается для первого октета данных в передаваемом сегменте. Сегменты также содержат номер подтверждения, который является последовательным номером следующего ожидаемого октета данных, передаваемых в обратном направлении. Когда один из концов ТСР-соединения передает сегмент, содержащий данные, он помещает его копию в очередь повторной передачи и запускает таймер; когда подтверждение о получении этих данных получено, сегмент удаляется из очереди. Если подтверждение не получено по истечении таймера, сегмент передается повторно.

Для идентификации начальной и конечной точек ТСР-соединения вводится понятие номера порта. Номера портов выбираются независимо для каждого соединения ТСР, при этом они могут не быть уникальными. Для обеспечения уникальной идентификации внутри каждого соединения ТСР, выполняется конкатенация IP-адреса и номера порта. Эта конкатенация определяет сокет.

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

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

Каждый конец ТСР-соединения является либо клиентом, либо сервером. Соединение инициируется клиентом. Сервер ждет установления соединения от клиента. Поэтому ТСР-соединение может быть открыто либо в пассивном режиме — сервером, либо в активном — клиентом.

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

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

Процедура установления соединений использует флаг управления синхронизацией (SYN) и включает обмен тремя сообщениями.

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

Очистка соединения включает обмен сегментами, содержащими управляющий флаг FIN.

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

Таблица 1.4. Формат заголовка ТСР
Порт источникаПорт получателя
Sequence Number
Acknowledgement Number


Data OffsetReserved


URGACKPSHRSTSYNFIN
Window
ChecksumUrgent Pointer
Options Padding
Данные
Порт источника – 16 бит.

Порт получателя – 16 бит.

Sequence Number – 32 бита. Последовательный номер первого октета данных в данном сегменте. Исключением является случай, когда присутствует флаг SYN. В этом случае последовательный номер есть начальный последовательный номер (Initial Sequence Number — ISN), и номер первого октета данных равен ISN+1.



Acknowledgement Number – 32 бита. Если установлен управляющий бит ACK, то данное поле содержит значение следующего последовательного номера, который ждет получатель. Это значение посылается всегда, если соединение установлено.

Data Offset – 4 бита. Число 32-битных слов в ТСР-заголовке. Оно определяет положение начала данных. Длина ТСР-заголовка всегда кратна 32.

Управляющие биты: 6 бит.

URG — указывает, что сегмент содержит экстренные данные и поле Urgent Pointer заголовка определяет их положение в сегменте.

ACK — указывает, что поле номера подтверждения содержит номер последнего полученного сегмента.

PSH — указывает, что данные из буфера могут быть переданы немедленно.

RST — указывает на необходимость сброса соединения.

SYN — указывает, что выполняется синхронизация последовательных номеров.

FIN — указывает, что от отправителя больше не будут передаваться данные.

Window — 16 бит. Количество октетов данных, начиная с номера, указанного в подтверждении, которое отправитель данного сегмента может получить. Используется для управления интенсивностью передаваемого потока данных.

Checksum – 16 бит. Контрольная сумма всех слов в заголовке и данных.

Urgent Pointer – 16 бит. Данное поле содержит положительное смещение экстренных данных относительно последовательного номера в данном сегменте.

Options – переменной длины. Опции могут быть указаны в конце ТСР-заголовка. Определены два варианта формата опций:

  • Один октет для типа опции.
  • Октет типа опции, октет длины опции и октеты с конкретными данными опции.


Padding – переменной длины. Данное добавление ТСР-заголовка используется для того, чтобы гарантировать, что ТСР-заголовок кончается, и данные начинаются на 32-битной границе.

Установление ТСР-соединения происходит с использованием так называемого "тройного рукопожатия". Соединение инициирует клиент, посылая сообщение с установленным битом SYN. Сервер отвечает клиенту сообщением с установленными битами SYN и ACK. Сервер также указывает начальный порядковый номер в поле Sequence Number.


Наконец, клиент посылает серверу сообщение с установленным битом ACK, в поле Sequence Number указывает свой начальный номер, в поле Acknowledgement Number указывает полученный от сервера начальный порядковый номер, увеличенный на единицу.

В течение своего жизненного цикла соединение проходит через несколько состояний.

На стороне клиента:

CLOSED

SYN-SENT

ESTABLISHED

FIN-WAIT-1

CLOSE-WAIT

CLOSING

LAST-ACK

CLOSED,

На стороне сервера:

CLOSED

LISTEN

SYN-RESEIVED

ESTABLISHED

FIN-WAIT-1

CLOSE-WAIT

CLOSING

FIN-WAIT-2

TIME-WAIT

CLOSED

Рассмотрим смысл каждого состояния.

Состояние CLOSED является фиктивным, потому что оно представляет собой состояние, для которого не существует структуры данных Transmission Control Block (ТСВ) и, следовательно, нет соединения.

LISTEN – состояние сервера, которое представляет собой ожидание запроса соединения от любой удаленной стороны.

SYN-SENT – состояние клиента, которое представляет собой ожидание ответа на запрос соответствующего соединения после того как послан запрос на соединение.

SYN-RECEIVED – состояние сервера, которое представляет собой ожидание подтверждения на запрос соединения после того как и клиент, и сервер получили и послали запрос на соединение.

ESTABLISHED – состояние как клиента, так и сервера, которое представляет собой открытое соединение: полученные данные могут быть доставлены на прикладной уровень. Обычное состояние для фазы пересылки данных по соединению.

Инициатором закрытия соединения может быть как клиент, так и сервер.

FIN-WAIT-1 – состояние как клиента, так и сервера, при котором сторона, инициировавшая закрытие (был послан пакет в флагом FIN), ожидает подтверждения на запрос закрытия соединения.

CLOSE-WAIT – состояние как клиента, так и сервера, при котором было послано подтверждение ACK на запрос закрытия (FIN). При этом канал становится симплексным: передача возможна только в одном направлении – от того, кто послал подтверждение ACK. Происходит ожидание закрытия канала от локального процесса.

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

LAST-ACK – состояние как клиента, так и сервера, представляет собой подтверждение (пакет с установленным флагом FIN) завершения соединения, ранее посланного удаленной стороне.

CLOSING – представляет собой ожидание подтверждения запроса завершения соединения от удаленной стороны.

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

ТСР-соединение переходит из одного состояния в другое в результате возникновения событий. Событиями являются вызовы функций OPEN, SEND, RECEIVE, CLOSE, ABORT и STATUS, входящие сегменты, содержащие флаги SYN, ACK, RST и FIN, а также таймауты.


Содержание раздела