Протокол управления передачей (протокол TCP) может выполнять базовую пересылку данных, используя непрерывный поток данных размером в байт. Данные упаковываются в сегменты для передачи протоколом Интернета. В общем TCP сам выполняет управление потоком и сам решает, когда передавать и когда задержать данные, если потребуется. Определена функция push, которая позволяет пользователю узнать, когда TCP успешно передал все данные, предоставленные ему приложением. Посылающий TCP может собирать данные от посылающих пользователей и посылать эти данные в сегментах по своему собственному усмотрению, пока не будет вызвана функция push, после чего он должен послать все не отосланные данные. Когда принимающий TCP видит флаг PUSH, он не должен ждать дополнительные данные от посылающего TCP, прежде чем передать данные в получающий процесс. Push заставляет TCP переслать и доставить полученные до этого момента данные прямо получателю. Мы увидим флаг push в некоторых примерах.
Чтобы восстановить поврежденные, потерянные, пришедшие в неправильном порядке или как-нибудь иначе поврежденные данные, TCP присваивает порядковый номер каждому передаваемому октету. Это позволяет уровню TCP на получающей машине знать, в каком порядке должны прийти пакеты, чтобы правильно их собрать. В дополнение к порядковым номерам, каждый правильно полученный пакет должен также подтверждаться (путем передачи служебного сообщения АСК) получающим TCP. Если АСК не получен в течение периода ожидания, данные будут посланы повторно. Для определения, что пакет был поврежден, используется контрольная сумма. Она добавляется к каждому сегменту, передаваемому посылающей машиной, и проверяется получателем.
Управление потоком обеспечивается с помощью "окна", которое посылается назад с каждым АСК. Это окно является диапазоном порядковых номеров, которые могут быть переданы в следующем раунде коммуникации. Они находятся за последним успешно полученным сегментом. Окно указывает число октетов, которое может послать отправитель, прежде чем получить следующее разрешение. Чтобы хост разрешал общаться через TCP в одно время нескольким процессам, используются порты. Добавление номера порта в конце адреса IP (например: 123.123.123.123:29) формирует со-кет. Пара сокетов используется для идентификации соединения, поэтому сокет можно использовать для переноса данных в обоих направлениях в одно время, т.е. это "дуплексная передача".
Хотя каждый хост отвечает за номера портов, которые он использует для этих соединений, некоторые функции были присвоены "хорошо известным портам". Эти службы доступны по известным адресам. Список этих хорошо известных портов находится в Приложении А. Комбинация сокетов, номеров последовательности и размеров окон называется соединением. Два процесса общаются, устанавливая сначала соединение. Когда коммуникация заканчивается, соединение закрывается, чтобы освободить ресурсы.
Есть два интерфейса, поддерживаемые протоколом управления передачей. Это интерфейс пользователя и интерфейс Интернета. Интерфейс пользователя позволяет вызвать пять основных функций протокола. Этими функциями являются: Открыть соединение, Закрыть соединение, Передать данные, Получить данные и Статус. Функция "Статус" выдает информацию о соединении. Эти пять вызовов действуют так же, как их аналоги в любой другой программе. Например, можно открыть или закрыть файл таким же образом, как TCP выполняет функции аналогичного типа. Пассивный запрос OPEN (открыть) означает, что процесс хочет принять входящие запросы соединения, а не пытается инициировать соединение.
Часто процесс, запрашивающий пассивный OPEN, будет принимать запрос соединения от любого вызывающего абонента. В этом случае для обозначения неуказанного сокета будет использоваться внешний сокет только из нулей. Неопределенные внешние сокеты допускаются только на пассивных OPEN. Процесс службы, которая желает предоставлять услуги для других неизвестных процессов, будет создавать пассивный запрос OPEN с неопределенным внешним сокетом. Затем можно будет создать соединение с любым процессом, который запрашивает соединение с этим локальным сокетом. Это полезно, если известно, что этот локальный сокет связан с данной службой.
Хорошо известные сокеты являются удобным механизмом связывания адреса сокета со стандартной службой. Например, процесс "TelnetServer" постоянно присвоен определенному сокету, а другие сокеты зарезервированы для передачи файлов. Интерфейс Интернета, поддерживаемый TCP, предоставляет только два вызова. Он может посылать или получать дейтаграммы, адресованные модулям TCP на других хостах. Эти вызовы имеют ряд параметров, которые можно задавать. Они задаются как флаги в кадре, как мы увидим в примерах трассировок. Эти параметры включают тип службы, приоритеты, безопасность и другую управляющую информацию.
Следующие разделы объясняют, как работают некоторые из наиболее общих команд TCP, и дают значительно лучшее понимание ситуации при поиске неисправностей. Описанные ниже пользовательские команды определяют базовые функции, которые будет выполнять TCP для поддержки коммуникации между процессами. Хотя эти команды не обязательно будут видны, мы найдем признаки их работы в рассматриваемых примерах трассировки. Различные реализации могут изменять точный формат или предоставлять комбинации или подмножества базовых функций в одиночных вызовах. В частности, некоторые реализации могут захотеть открывать соединение автоматически при получении команды пользователя SEND (послать) или RECEIVE (получить) для данного соединения. При предоставлении средств коммуникации между процессами TCP должен не только принимать команды, но также и возвращать информацию процессам, которые он обслуживает. Она представляет собой общую информацию о соединении (т.е. прерывания, удаленное закрытие, связывание неопределенного внешнего сокета). Ответы на специальные команды пользователя указывают успех или различные виды отказов.
Мы предполагаем, что локальный TCP знает идентичность процессов, которые он обслуживает, и будет проверять полномочия процесса на использование указанного соединения. В зависимости от реализации TCP идентификаторы локальной сети и TCP для адреса источника будут поставляться либо TCP, либо протоколом нижнего уровня (например, IP). Эти свойства являются результатом рассмотрения вопросов безопасности, чтобы один TCP не смог маскировать другой, и т.д. Аналогичным образом, ни один процесс не может маскировать другой без возникновения конфликта TCP.
Если флаг "активный/пассивный" (Active/Passive) задан как пассивный, то он представляет собой вызов LISTEN для входящего соединения. Пассивное открытие может иметь либо полностью специфицированный внешний сокет, ожидающий определенное соединение, либо не специфицированный внешний сокет, ожидающий любой вызов. Полностью специфицированный пассивный вызов можно сделать активным последующим выполнением команды SEND. Блок управления передачей (ТСВ) создается и частично заполняется данными из параметров команды OPEN. На активной команде OPEN TCP сразу начнет процедуру синхронизации (т.е. создания) соединения.
Параметр задержки (если присутствует) позволяет вызывающей стороне установить задержку для всех данных, переданных TCP. Если данные не будут доставлены в место назначения в течение времени задержки, TCP прервет соединение. По умолчанию в настоящее время используется пять минут.
TCP или некоторый компонент операционной системы будет проверять полномочия пользователя на открытие соединения с указанным приоритетом или защитой/ячейкой. Отсутствие приоритета или спецификации защиты/ячейки в вызове OPEN указывает, что должны использоваться значения по умолчанию.
TCP будет принимать входящие запросы как подходящие только в том Случае, если информация защиты/ячейки в точности совпадает и если приоритет равен или выше приоритета, запрошенного в вызове OPEN.
Приоритет соединения равен большему из значений, запрошенному в вызове OPEN и полученному из входящего запроса, и фиксируется на этом значении в течение жизни соединения. Реализации могут захотеть предоставить пользователю управление этим согласованием приоритета. Например, пользователь может определять, что приоритет должен точно совпадать, или что любая попытка увеличить приоритет подтверждается пользователем.
TCP будет возвращать пользователю имя локального соединения. Имя локального соединения может затем использоваться в качестве сокращенного термина для соединения, определенного парой <локальный сокет внешний сокет>.
TCP вызывает модуль низкоуровневого протокола для реальной отправки и получения информации через сеть. Одним из случаев является система взаимодействия сетей ARPA, где низкоуровневым протоколом будет IP. Если низкоуровневым протоколом является IP, он предоставляет аргументы для типа службы и для времени жизни. TCP использует следующие настройки для этих параметров: Type of service = precedence: routine; Delay: normal; Throughput: normal; Reliability: normal; или 00000000. Время жизни = одна минута, или 00111100. Отметим, что предполагаемое максимальное время жизни сегмента равно двум минутам. Здесь мы явно указываем, что сегмент будет уничтожен, если его окажется невозможно доставить по Интернету в течение одной минуты. Если нижним уровнем является IP (или другой протокол, который предоставляет это свойство) и используется маршрутизация источника, интерфейс должен разрешать передавать информацию о маршруте. Особенно важно, чтобы адреса источника и места назначения, используемые в контрольной сумме TCP, принадлежали исходному источнику и конечному месту назначения. Также важно сохранить маршрут возврата для ответа на запросы соединения.
Любой низкоуровневый протокол должен предоставлять адрес источника, адрес места назначения, поля протокола и некоторый способ определения "длины TCP" одновременно для предоставления функционально эквивалентной службы IP и для использования в контрольной сумме TCP. Обработка, показанная в этом разделе, является примером одной возможной реализации. Другие реализации могут иметь иную последовательность обработки, но они должны отличаться от приведенной в данном разделе только в деталях, а не по существу. Активность TCP можно охарактеризовать как реакцию на события. Происходящие события можно разделить на три категории: пользовательские вызовы, прибывающие сегменты и истечение времени ожидания. Этот раздел описывает обработку, которую выполняет TCP в ответ на каждое из этих событий. Во многих случаях требуемая обработка зависит от состояния соединения.
Сетевые протоколы предоставляют так называемые службы канала данных и составляют нижние три уровня модели OSI. Эти протоколы обрабатывают информацию адресации и маршрутизации, контроль ошибок и запросы повторной пересылки. Сетевые протоколы определяют также правила для коммуникации в сетевом окружении, таком как Ethernet или Token Ring. Наиболее популярные сетевые протоколы перечислены ниже:
1. IP (Internet Protocol), протокол TCP/IP для маршрутизации и пересылки пакетов.
2. IPX (Internetwork Packet Exchange), протокол NetWare для пересылки пакетов и маршрутизации.
3. NWLink, реализация Microsoft протокола IPX/SPX.
4. NetBEUI, транспортный протокол, который предоставляет службы транспорта данных для сеансов NetBIOS и приложений.
5. DDP (Datagram Delivery Protocol), протокол транспорта данных AppleTalk.
Мы увидели, как эти протоколы укладываются в модель OSI, и получили представление о функциях каждого из них. Теперь следует рассмотреть, как все это отображается в совокупности, после чего можно исследовать различия в поведении этих протоколов, как используется каждый из них, а также различные уровни функциональности.
Рассмотрим структуру заголовка IPX. Он состоит из следующих полей:
контрольная сумма (checksum) длина пакета (packet length)
• управление транспортом (transport control)
• тип пакета (packet type)
• сеть назначения (destination network)
• узел назначения (destination node)
• сокет назначения (destination socket)
• сеть источника (source network)
• узел источника (source node)
• сокет источника (source socket)
Контрольная сумма Поле контрольной суммы используется для обеспечения целостности пакета. Контрольная сумма используется новыми версиями Netware, так как 3.x и более ранние версии задают поле как OxFFFF и не используют контрольную сумму.
Длина пакета Поле длины пакета является длиной заголовка IPX плюс длина данных в байтах. Длина пакета должна быть не менее 30 байтов, чтобы предоставить достаточно места для заголовка IPX.
Управление транспортом Управление транспортом является числом маршрутизаторов, которые пересек пакет на пути к месту назначения. Посылающие узлы при создании пакета IPX всегда задают это поле как ноль. Когда маршрутизатор получает пакет, требующий дальнейшей маршрутизации для достижения конечного места назначения, значение поля увеличивается на единицу и пакет передается дальше.
Тип пакета Поле типа пакета указывает вид службы, которая либо предлагается, либо требуется пакету. В таблице 3.2 перечислены некоторые часто используемые типы пакетов, которые могут встретиться в трассировках сетей.
Сеть назначения Сеть назначения является номером сети, к которой присоединен узел назначения. Когда посылающий компьютер задает это поле как 0x0, предполагается, что узел назначения находится в том же сетевом сегменте, что и посылающий узел.
Существует особый случай, когда рабочая станция посылает широковещательные запросы протоколов маршрутизации SAP — Get Neareast Server (Найти ближайший сервер) и RIP — Get Local Target (Найти локального получателя) (или Route Request — Запрос маршрута) во время инициализации. Так как рабочая станция еще не знает, к какой сети принадлежит, она задает поля сети источника и сети назначения как 0 для этих запросов. Когда маршрутизатор получает один из этих запросов, он посылает ответ непосредственно посылающей рабочей станции, заполняя поля сети источника и сети назначения соответствующими сетевыми номерами.
В дополнение к сетевому номеру 0 номера OxFFFFFFFF и OxFFFFFFFE зарезервированы для специальных целей. В связи с этим они не должны назначаться никакой сети IPX. Дополнительную информацию о зарезервированных сетевых номерах можно найти ниже в разделе о зарезервированных номерах.
Узел назначения Поле узла назначения содержит физический адрес узла назначения. Узел в сети Ethernet будет использовать все шесть байтов этого поля для определения своего адреса. Некоторые другие методы доступа к сети могут использовать здесь меньше шести байтов. Адрес узла OxFFFFFFFFFFFF (т.е. шесть байтов по OxFF) посылает пакет всем узлам в сети назначения.
Сокет назначения Поле сокета назначения является адресом сокета процесса назначения пакета. Эти сокеты будут направлять пакеты в различные процессы внутри одной машины.
Сеть источника Поле сети источника является номером сети, к которой присоединен узел источника. Если посылающий узел задает это поле равным нулю, это означает, что локальная сеть машины источника неизвестна. Для маршрутизаторов правила, применяемые к полю сети назначения, также применимы к полю сети источника, за исключением того, что маршрутизаторы могут пересылать полученные пакеты, у которых это поле задано как ноль.
