Сетевое программирование в .NET. Расшифровка IP-адреса (IP address specification). Обеспечение надежности доставки пакетов, страница 6

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

Возвращаемое приемником значение, называемое подтверждающим числом (acknowledgement number) должно быть самым большим в рассмотренной последовательности чисел. Эта техника называется скользящим окном (sliding window). Пакеты, нарушающие порядок последовательности, хранятся в специальном буфере, а затем вставляются в поток, чтобы восстановить порядок. Если какой-либо пакет утерян, то это обнаруживается приемником и он посылает подтверждающее число (acknowledgement number), меньшее, чем ожидается. Этот факт трактуется как запрос на повторение передачи. Техника скользящего окна позволяет избежать процедуры подтверждения получения каждого пакета, что увеличило бы объем передаваемых данных (network traffic).

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

Учреждение TCP-сессии

В TCP-заголовке (вслед за полем, указывающим его длину) идет поле флагов (Flags) состояния сессии.

Flag

Description

6 bits

Зарезервированы для будущего использования. Должны быть нулями.

URG  (1-bit)

Помечает пакет, содержащий срочные данные (urgent data)

ACK  (1-bit)

Подтверждение получения (Acknowledge)

PUSH  (1-bit)

Указывает, что данные надо немедленно передать (push) приложению

RESET  (1-bit)

Установка TCP-соединения в исходное состояние (Reset)

SYN  (1-bit)

Указывает, что этот пакет синхронизирует сессию (start-of session)

FIN  (1-bit)

Указывает, что сессия завершается с помощью FIN-пакетов

Для учреждения сессии, слежения за ее статусом и завершения используется специальный протокол рукопожатия (handshaking protocol). Вот его фазы:

¨  Открывающее рукопожатие (opening handshake),

¨  Session communication,

¨  Закрывающее рукопожатие (closing handshake).

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

¨  Хост, инициирующий соединение, посылает SYN-флаг для того. чтобы обозначить начало сессии.

¨  Хост-получатель посылает два флага SYN, ACK, означающие, что он принял сигнал начала сессии.

¨  Хост-отправитель посылает ACK-флаг. Это означает, что сессия открыта и готова работать с пакетами.

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

¨  Хост, инициирующий закрытие, посылает FIN-флаг.

¨  Хост-получатель посылает в одном пакете FIN и ACK-флаги.

¨  Хост-отправитель посылает ACK-флаг. Это означает, что сессия закрыта.

Следующая временная диаграмма иллюстрирует описанные процедуры обмена флагами.

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