Лекции 2010-го года (1130544), страница 75
Текст из файла (страница 75)
Рассмотрим случай, когда транспортный сервервзаимодействует с клиентами. Предположим, сервер упал и старается восстановитьфункционирование. Прежде всего, ему надо узнать у клиента, какое TPDU былопоследним неподтвержденным, и попросить повторить его. В свою очередь, клиент можетнаходиться в одном из двух состояний: S1 – есть неподтвержденное TPDU, либо S0 – всеTPDU подтверждены.Казалось бы, все просто. Однако рассмотрим проблему внимательнее. Сервер, получивTPDU, либо сначала шлет подтверждение, а затем записывает полученное TPDU в буферприложения, либо сначала записывает, а потом шлет подтверждение. Если сервер упал,послав подтверждение, но до того, как он осуществил запись, то клиент будет находитьсяпосле восстановления сервера в состоянии S0, хотя подтвержденное TPDU потеряно.Пусть, наоборот, сервер сначала записал TPDU, а потом упал.
Тогда после сбоя сервернайдет клиента в состоянии S1 и решит, что надо повторить неподтвержденное TPDU. Врезультате получим повторное TPDU.Можно формально показать, что эта проблема только средствами транспортного уровняне решается. Надо, записав TPDU, информировать об этом приложение и только послеэтого слать подтверждение. При восстановлении надо опрашивать не только клиента натранспортном уровне, но и приложение.6.3. Транспортные протоколы в Internet: TCP и UDPВ Internet есть два основных транспортных протокола: TCP - ориентированный насоединение и UDP - не ориентированный на соединение. Поскольку сервис, реализуемыйпротоколом UDP - это практически сервис, реализуемый протоколом IP, с добавлениемнебольшого заголовка, то основное внимание здесь мы уделим протоколу TCP.TCP (Transmission Control Protocol) - специально созданный протокол для надежнойпередачи потока байтов по соединению «точка-точка» через ненадежную сеть.
ТСР былсознательно разработан так, чтобы он мог адаптироваться к условиям и особенностямразных сетей, устойчиво и эффективно функционировать в условиях internet (несколькихсетей). На каждой машине, поддерживающей ТСР, есть ТСР-агент, который располагаетсялибо в ядре ОС, либо в процессе пользователя, который управляет ТСР-потоками идоступом к сервису IP-протокола.ТСР получает поток данных от прикладного процесса, дробит их на сегменты не болеечем по 65 Кбайт (на практике не более 1,5 Кбайт) и отправляет их как отдельные IPпакеты.Поскольку IP-уровень не гарантирует доставку каждого пакета, то в задачу ТСР входитопределение потерь и организация повторной передачи потерянного. Поскольку насетевом уровне в Internet соединения не поддерживаются, то сегменты могут поступать кполучателю в неправильном порядке и задача ТСР - восстановить этот порядок.6.3.1. Модель сервиса TCPДоступ к ТСР-сервису происходит через сокет.
Сокет состоит из IP-адреса хоста и 16разрядного локального номера на хосте, называемого порт. Сокеты создаются какотправителем, так и получателем. Порт - это TSAP для ТСР. Каждое соединениеидентифицируется парой сокетов, между которыми оно установлено. Один и тот же сокетможет быть использован для разных соединений. Никаких дополнительных виртуальныхсоединений не создается.Порты с номерами до 256 зарезервированы для стандартного сервиса. Например, еслинадо обеспечить FTP-передачу файла, то надо соединяться через 21-й порт, где находитсяFTP-демон.
Для TELNET - через 23-й порт. Полный список таких портов можно найти вRFC 1700.Все ТСР-соединения - дуплексные, т.е. передача идет независимо в оба направления. ТСРсоединение поддерживает только соединение «точка-точка». Не существует ТСРсоединений от одного ко многим.ТСР обеспечивает поток байтов, а не поток сообщений.
Напомним, это значит, чтограницы сообщений не поддерживаются автоматически в потоке.После того, как приложение передало данные ТСР агенту, эти данные могут бытьотправлены сразу на сетевой уровень, а могут быть буферизованы, как поступить - решаетТСР-агент. Однако в ряде случаев надо, чтобы они были отправлены сразу, например,если эти данные представляют собой команду для удаленной машины. Для этого взаголовке ТСР-пакета есть флаг PUSH. Если он установлен, то это говорит о том, чтоданные должны быть переданы немедленно.Наконец, последняя возможность ТСР-сервиса, которую здесь стоит упомянуть - срочныеданные.
Если для данных установлен флаг URGENT в заголовке, то все данные послеэтого по данному соединению передаются сразу и не буферизуются. Когда срочныеданные поступают к месту назначения, то получателю передают их немедленно.6.3.2. Протокол TCPКаждый байт в ТСР соединении имеет 32-разрядный номер. В сети с пропускнойспособностью 10 Мбит/сек.
потребуется не менее часа, чтобы исчерпать все номера с 0 до2^32. Эти номера используются как для уведомления, так и в механизме управленияокнами.ТСР-агенты обмениваются сегментами данных. Каждый сегмент имеет заголовок от 20байтов и более (по выбору) и тело переменной длины. Один сегмент может включатьбайты от разных отправителей, а может включать часть данных одного. Какой длиныможет быть тело, решает ТСР-агент. Длину сегмента ограничивают два фактора. Вопервых, длина сегмента не должна превышать максимальную длину IP-пакета - 64 Кбайт.Во-вторых, каждая сеть имеет максимальную единицу передачи - MTU (maximum transferunit), и каждый сегмент должен помещаться в MTU. В противном случаемаршрутизаторам придется применять фрагментацию.
При этом возрастают накладныерасходы на передачу в сети, так как каждый фрагмент оформляется как самостоятельныйпакет (с 20-байтным заголовком).Основным протоколом, который используется ТСР-агентом, является протоколскользящего окна. Это значит, что каждый посланный сегмент должен быть подтвержден.Одновременно с отправлением сегмента взводится таймер. Подтверждение придет либо сочередными данными в обратном направлении, если они есть, либо без данных, но сподтверждением. Подтверждение будет иметь порядковый номер очередного ожидаемогополучателем сегмента. Если таймер исчерпается прежде, чем придет подтверждение, тосегмент посылается повторно.Несмотря на кажущуюся простоту, ТСР-протокол достаточно сложен и должен решатьследующие основные проблемы:• восстанавливать порядок сегментов• убирать дубликаты сегментов, в каком бы виде они не поступали• определять разумную задержку для time_out для подтверждений в получениисегмента• устанавливать и разрывать соединения надежно• управлять потоком• управлять перегрузками6.3.3.
Заголовок сегмента в TCPЗаголовок сегмента в ТСР показан на рисунке 6-24. Максимальная длина раздела данных –65 495 байтов.• Поля Source port и Destination port указывают сокеты на стороне отправителя иполучателя соответственно.• Sequence number и Acknowledgement number содержат порядковый номерожидаемого байта и следующего ожидаемого, а не последнего полученногобайта.Рисунок 6-16.
Заголовок TCP• 6-битное поле флагов.Бит Urg используется вместе с полем Urgent pointer, которое указывает наначало области срочных данных.oACK - 1, если поле Acknowledgement number используется, в противномслучае – 0.oPSH - 1, если отправитель просит транспортного агента на сторонеполучателя сразу передать эти данные приложению и не буферизовать их.oRST – используется, чтобы переустановить соединение, которое по какойлибо причине стало некорректным. Получение пакета с таким флагомозначает наличие проблемы, с которой надо разбираться.oSYN – 1, при запросе на соединение.
Флаг ACK указывает на наличие илиотсутствие подтверждения. SYN=1 ACK=0 – запрос на соединение, SYN=1ACK=1 – подтверждение соединения.oFIN - запрос на разрыв соединения. У отправителя нет больше данных.o• Поле Window size используется алгоритмом управления окном.• Поле Options используется для установления возможностей, не предусмотренныхстандартным заголовком. Например, здесь часто указывается максимальныйразмер поля данных, допустимый по данному соединению.6.3.4.
Управление соединениями в TCPКак уже было сказано, установление ТСР-соединения происходит по протоколутрехкратного рукопожатия. Флаги SYN и ASK в заголовке сегмента используются дляреализации примитивов CONNECTION REQUEST и CONNECTION ACCEPTED. ФлагRST используется для реализации примитива REJECT. Это означает, что указанные вышепримитивы вызывают посылку ТСР-пакета с установленным соответствующим флагом.На рисунке 6-17 (а) показаны состояния при установлении соединения.
Когда приходитзапрос на соединение по определенному порту, транспортный агент проверяет, есть липроцесс, который выполнил примитив LISTEN на этом порту. Если такой процесс есть, тоему передается управление. Если такого процесса нет, то в ответ идет отказ отустановления соединения.Рисунок 6-17. Установление TCP-соединенияСлучай (b) показывает ситуацию, когда два хоста одновременно пытаются установитьсоединение между двумя одинаковыми сокетами (коллизия). Поскольку каждоесоединение идентифицируется парой сокетов, то будет установлено только одно изсоединений.Таймер для последовательных номеров сегментов тактируется с частотой 4 мксек.,максимальное время жизни пакета - 120 сек. Напомним, что начальный номер сегментовникогда не равен нулю, по соображениям, приведенным ранее.