Команды пользователя 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 будет возвращать пользователю имя локального соединения. Имя локального соединения может затем использоваться в качестве сокращенного термина для соединения, определенного парой <локальный сокет внешний сокет>.

Получить и закрыть

Эта команда выделяет буфер получения, связанный с указанным соединением. Если этой команде не предшествует команда OPEN, или вызывающий процесс не уполномочен использовать это соединение, возвращается ошибка.
В простейшей реализации управление не будет возвращаться вызывающей программе, пока не заполнится буфер или не произойдет какая-нибудь ошибка, но эта схема существенно подвержена блокированию. Более развитая реализация будет позволять нескольким командам RECEIVE ожидать выполнения одновременно. Они будут выполняться по мере поступления сегментов. Эта стратегия позволяет увеличить пропускную способность за счет более развитой схемы (возможно, асинхронной) уведомления вызывающей программы, что был получен PUSH или заполнен буфер. Если прибывает количество данных, достаточное для заполнения буфера до появления PUSH, флаг PUSH в ответ на RECEIVE задаваться не будет. Буфер будет заполнен таким количеством данных, сколько он может вместить. Если до заполнения буфера появляется PUSH, буфер возвращается частично заполненным и с указанием PUSH.
При наличии срочных данных пользователь будет проинформирован об этом, как только они появятся, с помощью сигнала TCP пользователю. Получающий пользователь должен поэтому находиться в "срочном режиме". Если установлен флаг URGENT, остаются дополнительные срочные данные. Если флаг URGENT сброшен, то этот вызов RECEIVE вернул все срочные данные, и пользователь может теперь покинуть "срочный режим". Отметим, что данные, следующие за указателем срочности (несрочные данные), нельзя доставить пользователю в тот же буфер с предшествующими срочными данными, если только граница для пользователя четко не обозначена.
Чтобы различить несколько ожидающих RECEIVE и компенсировать буфер, который не полностью заполнен, код возврата сопровождается указателем буфера и счетчиком байтов, указывающим реальную длину полученных данных.
Альтернативные реализации RECEIVE могут иметь TCP, который выделяет буферную память, или TCP может совместно с пользователем использовать кольцевой буфер.
Close (Закрыть)
Эта команда вызывает закрытие указанного соединения. Если соединение не открыто, или же вызывающий процесс не уполномочен использовать это соединение, возвращается ошибка. Закрытие соединения предназначено для элегантной работы в том смысле, что ожидающие SEND будут переданы (и переданы повторно), когда позволит управление потоком, пока все не будет обслужено. Таким образом, допустимо выполнить несколько вызовов SEND, за которыми следует CLOSE, и ожидать, что все данные будут посланы в место назначения. Также должно быть ясно, что пользователи могли бы продолжать RECEIVE (получать) на закрытых соединениях, так как другая сторона могла бы пытаться передавать свои завершающие данные. Фактически CLOSE означает: "У меня для передачи больше ничего нет", а не "Я больше ничего не буду принимать". Может случиться (если протокол на уровне пользователя не очень хорошо проработан), что сторона не сможет избавиться от всех своих данных до того, как закончится выделенное время. В этом случае CLOSE превратится в ABORT, и закрывающий TCP прервется. Пользователь может закрыть соединение в любое время по своей собственной инициативе или в ответ на различные предложения от TCP (например, выполнено удаленное закрытие, превышена задержка передачи, место назначения недоступно).
Так как закрытие соединения требует коммуникации с внешним TCP, соединение может оставаться в закрытом состоянии в течение некоторого времени. Попытки повторно открыть соединение, прежде чем TCP ответит на команду CLOSE, будет приводить к сообщению об ошибке. CLOSE также подразумевает вызов функции push (выталкивания данных).
Status Abort (Прервать)
Эта команда вызывает прерывание всех ожидающих SEND и RECEIVE, удаление ТСВ и отправку специального сообщения RESET для TCP на другой стороне соединения. В зависимости от реализации пользователи могут получать указания о прерывании для каждой ожидающей команды SEND или RECEIVE или просто получить подтверждение команды ABORT.

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 в ответ на каждое из этих событий. Во многих случаях требуемая обработка зависит от состояния соединения.

Происходящие события: пользовательские вызовы

Модель TCP/интерфейс пользователя является моделью, где команды пользователя получают немедленный ответ и, возможно, ответ с задержкой с помощью события или псевдопрерывания. В следующих описаниях термин "сигнал" означает "причина задержанного ответа". Ответы об ошибках предоставляются как строки символов. Например, пользовательские команды, обращающиеся к соединениям, которые не существуют, получают в ответ сообщение "Ошибка: соединение не открыто" ("error: connection not open").
Отметим, что в последующем все арифметические операции с номерами последовательности, номерами подтверждений, окнами и т.д. выполняются по модулю 2 ', так как это размер пространства номеров последовательности. Отметим также, что "=<" означает "меньше или равно (по модулю 232)". Обработка входящих сегментов состоит в том, что они сначала проверяются на правильный номер последовательности (т.е. содержатся в диапазоне ожидаемого "окна получения" в пространстве номеров последовательности), а затем обычно выстраиваются в очередь и обрабатываются в порядке номеров последовательности. Когда сегмент перекрывает другие уже полученные сегменты, он реконструируется, чтобы содержать только новые данные, и соответствующим образом изменяются поля заголовка. Обратите внимание, что если не упомянуто никакое изменение, TCP остается в том же состоянии (т.е. ТСВ не существует). Создайте новый блок управления передачей (ТСВ) для хранения информации о состоянии соединения. Запишите информацию об идентификаторе локального сокета, внешнем сокете, приоритете, безопасности/ячейке и времени ожидания пользователя. Некоторые части внешнего сокета могут быть не определены при пассивном OPEN и должны заполняться параметрами входящего сегмента SYN. Проверьте, что апрошенные безопасность и приоритет допустимы для этого пользователя; если нет, верните "ошибка: приоритет недопустим" или "ошибка: защита/ячейка недопустимы". Если соединение активно, введите состояние LISTEN и вернитесь. Если в активном состоянии и определен внешний сокет, пошлите сегмент SYN. Выбирается начальный номер посылаемой последовательности (ISS). Сегмент SYN посылается в форме <SEQ=ISS><CTL=SYN>. Задайте SND.UNA как ISS, SND.NXT как ISS+1, введите состояние SYN-SENT и вернитесь. Если вызывающая сторона не имеет доступа к указанному локальному сокету, возвращается "ошибка: соединение недопустимо для этого процесса". Если нет места для создания нового соединения, возвращается "ошибка: недостаточно ресурсов".
Состояние прослушивания
Если текущее состояние соединения ACTTV и определен внешний сокет, то измените состояние на активное и выберите ISS. Пошлите сегмент SYN, задайте SND.UNA как ISS, SND.NXT как ISS+1.Введите состояние SYN-SENT. Данные, связанные с SEND, могут быть посланы с сегментом SYN или выстроены в очередь для передачи после ввода состояния ESTABLISHED. Бит срочности (если запрошен в команде) должен посылаться с сегментами данных, посланными в результате этой команды. Если для занесения запроса в очередь нет места, возвращается сообщение "ошибка: недостаточно ресурсов". Если внешний сокет не определен, возвращается сообщение "ошибка: внешний сокет не определен".

Интерфейсы сеансов и дейтаграмм

NCP разрешает клиенту общаться с сервером с помощью системы доставки сообщений, например IPX или SPX. SPX имеет преимущество, поддерживая упорядочивание и гарантированную доставку сообщений. Если понадобится, то может запрашиваться IPX, с целью улучшения производительности. Он предлагает преимущество использования низкоуровневого ненадежного интерфейса дейтаграмм, такого как IPX. Кроме того, дейтаграммы предлагают перенос NCP в сети, где стандартные интерфейсы сеанса не существуют.
В настоящее время большинство клиентов ограничены не более чем одним ожидающим запросом NCP для каждого соединения. Однако между двумя компьютерами может существовать несколько соединений. Если клиент пользуется мультипользовательской системой, каждый пользователь может иметь отдельное соединение с сервером, а каждому соединению разрешено иметь ожидающий запрос NCP.
Так как система безопасности доступа к серверу определяется на основе каждого соединения, то для нескольких задач принято использовать общее единственное соединение. При необходимости для каждой задачи могут быть созданы новые соединения в мультизадачной среде. Каждое новое соединение интерпретируется как отдельная сущность, несмотря на физическую машину, которая осуществляет соединение. Таким образом, клиент может поддерживать столько соединений с различными серверами, сколько потребуется.
Структуры заголовка сообщений
Посмотрим теперь на сообщение NСР. Сообщение NСР содержит семи-байтный заголовок запроса, за которым следует восьмибайтный заголовок ответа. Заголовок запроса содержит общую статусную информацию о текущем состоянии соединения и указывает требуемую службу