Установка соединения или установление соединения



Установка TCP соединения

Почитываю сейчас книжонку ICND, очень хорошо расписано всё. Ну в общем стал лучше разбираться в соединении по протоколу TCP. Исчезли многие вопросы, которые раньше просто не знал. Сейчас намерен поделиться так, чтобы было понятно обычному человеку.

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

Шаг 1. Отправка SYN пакета

Отправляется пакет с выставленным флагом SYN, что означает инициализацию сессии. Разумеется, на этом этапе будет задан порт источника и порт назначения (порт источника выбирается случайно из диапазона 1024-65535), хотя на этом участке можно выделить два диапазона ещё. Порты с 1024 до 49151 используются для проприетарных приложений, контролируется IANA (те же чуваки, которые и выделяют IP адреса). Порт назначения здесь зависит от используемой службы. Стандартные порты ssh – 22, http – 80, pop3 – 110 и т.д. Все эти порты прописаны в c:\Windows\System32\drivers\etc\services ну или аналогичный файл в Linux.

Здесь очень интересным является поле Sequence Number, в которое заносится некоторый номер последовательности. Так же есть поле Acknowledgment Number, которое говорит о подтверждении принятого пакета с этим номером (и всех пакетов до него!). Как же выбирается этот номер? Приведу выдержку из RFC 793: При организации нового соединения генерируется начальный порядковый номер (initial sequence number) ISN. Генерация номера основана на текущем (возможно, фиктивном) 32-битовом значении времени, в котором младший бит инкрементируется приблизительно каждые 4 микросекунды. Таким образом, цикл номеров ISN занимает около 4.55 часа. Поскольку мы предполагаем, что сегмент сохраняется в сети в течение времени, не превышающего MSL (Maximum Segment Lifetime – максимальное время жизни сегмента), и значение MSL < 4.55 час., можно считать значения ISN уникальными.

То есть в первом пакете с битом SYN задается некий номер последовательности. На скрине выше я привел пример, видим бит SYN и ISN 2686526190 .

Шаг 2. Отправка подтверждения SYN+ACK

В ответ на этот пакет, сервер, если он не против соединения, посылает пакет с битами SYN,ACK и произвольным номером последовательности Sequence Number, вычисленным по похожему принципу. А поле Acknowledgment Number будет равняться полю ISN+1.

На примере видно, что сгенерировано число Initial Receive Sequence (IRS) = 675813843 и пакет послан как ответ AN: 2686526191 (предыдущий SN: 2686526190 + 1).

Шаг 3. Отправка подтверждения ACK

Теперь инициатору подключения не остается ничего другого, как ответить ACK и пояснить, что речь идёт об Acknowledgment number предыдущего шага IRS + 1, т.е. 675813843+1 = 675813844! А Sequence nuber остаётся неизменным, AN предыдущего пакета 2686526191.

Источник

Установка соединения

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

В большинстве случаев соединение TCP устанавливается на время передачи единственного файла. Например, подключаясь к серверу в Интернете, браузер сначала устанавливает соединение с ним, затем передает HTTP-запрос с URL и наконец получает файл, указанный в URL. Как только файл передан, системы разрывают соединение. Обрабатывая полученный файл, браузер может найти в нем ссылки на изображения, звукозаписи и другие файлы, необходимые для отображения Web-страницы. Для каждого из них браузер устанавливает новое соединение с сервером, копирует файл и отображает его в составе страницы. Таким образом, обработка одной Web-страницы может обернуться десятком самостоятельных TCP-соединений.

Процесс установления TCP-соединения называется трехшаговым рукопожатием (three-way handshake) и состоит из обмена тремя сообщениями, ни одно из которых не содержит данных прикладного уровня. Помимо проверки существования другого компьютера и его готовности к приему данных, цель этих сообщений состоит в согласовании нумерации передаваемых сообщений. В начале соединения каждый компьютер выбирает для первого сообщения TCP начальный номер последовательности (initial sequence number, ISN). Затем с каждым последующим сообщением системы увеличивают этот номер на 1. Для выбора ISN компьютеры используют специальный алгоритм, который минимизирует вероятность того, что для соединения между одной и той же парой сокетов в одно и то же время будут использованы одинаковые номера последовательности.

В сообщении с номером ISN для каждой системы установлен флаг синхронизации (SYN). В начале типичной TCP-транзакции сообщение SYN с номером ISN в поле Sequence Number посылает клиентская система. Получив это сообщение, сервер генерирует ответ, который выполняет сразу две функции. Во-первых, за счет установки флага АСК ответное сообщение подтверждает получение первого клиентского сообщения SYN. Во-вторых, в отклике сервера также установлен флаг SYN, а в поле Sequence Number указан его номер ISN.

Получив это сообщение, клиентская система генерирует свой собственный отклик с установленным флагом АСК. Как только сервер получил от клиента это подтверждение, соединение считается установленным и системы готовы обмениваться сообщениями с данными приложений. Таким образом, соединение TCP на самом деле представляет собой два отдельных соединения, работающих в противоположных направлениях. TCP является полнодуплексным протоколом: оба соединения устанавливаются и разрываются независимо друг от друга.

Важно помнить, что между двумя TCP-системами устанавливается только логическое соединение. Индивидуальные сообщения TCP переносятся в IP-дейтаграммах, с использованием служб IP, не ориентированных на соединение. Они могут добираться до места назначения различными маршрутами и даже прибывать туда не в том порядке, в каком были отправлены.

В ходе трехшагового рукопожатия с помощью сообщений SYN компьютеры также информируют друг друга о максимальном размере сегмента (maximum segment size, MSS). По значению MSS для другой системы передающий компьютер определяет количество данных, которое можно включать в последующие сообщения. Значение MSS зависит от того, какой протокол канального уровня используется в сети, где находится соответствующая система. Величина MSS передается в виде 4 байтов, записанных в полях Options заголовков TCP двух пакетов SYN. Значение этих байтов таково.

• Kind (1 байт)— тип дополнительного параметра. В случае передачи MSS значение равно 2.

• Length (1 байт)— длина дополнительного параметра в байтах. В случае передачи MSS значение равно 4.

• Maximum Segment Size (2 байта)— максимальный размер сегмента для данной системы в байтах.

Источник

Что такое TCP и как он работает?

Протокол управления передачей (TCP) является одним из самых важных протоколов пакета Internet Protocols. Это наиболее широко используемый протокол для передачи данных в сети связи, такой как Интернет.

  • TCP — надежный протокол. То есть, приемник всегда отправляет отправителю положительное или отрицательное подтверждение о пакете данных, так что отправитель всегда имеет яркое представление о том, достигнут ли пакет данных адресату или ему нужно повторно отправить его.
  • TCP гарантирует, что данные достигнут назначенного адресата в том же порядке, в котором он был отправлен.
  • TCP ориентирован на соединение. TCP требует установления соединения между двумя удаленными точками перед отправкой фактических данных.
  • TCP обеспечивает механизм проверки и восстановления ошибок.
  • TCP обеспечивает сквозную связь.
  • TCP обеспечивает контроль потока и качество обслуживания.
  • TCP работает в режиме «точка-точка» Client / Server.
  • TCP обеспечивает полный дуплексный сервер, т. Е. Он может выполнять роли как получателя, так и отправителя.

Длина заголовка TCP составляет минимум 20 байтов и максимум 60 байт.

  • Source Port (16 бит). Он определяет порт источника процесса приложения на отправляющем устройстве.
  • Destination Port (16 бит) — определяет порт назначения процесса приложения на принимающем устройстве.
  • Sequence Number (32 бита) — порядковый номер байтов данных сегмента в сеансе.
  • Acknowledgement Number (32 бита). Когда установлен флаг ACK, это число содержит следующий порядковый номер ожидаемого байта данных и работает как подтверждение предыдущих полученных данных.
  • Data Offset (4 бита). В этом поле подразумеваются как размер заголовка TCP (32-разрядные слова), так и смещение данных в текущем пакете во всем сегменте TCP.
  • Reserved (3 бита) — зарезервировано для будущего использования, и все по умолчанию устанавливаются в ноль.
  • Флаги (по 1 бит)
    • NS — бит Nonce Sum используется сигнальным процессом Явного сообщения о перегрузке.
    • CWR. Когда хост получает пакет с установленным битом ECE, он устанавливает, что Congestion Windows Reduced подтверждает, что полученная от ЕС.
    • ECE — имеет два значения:
      • Если бит SYN очищен до 0, значит, ECE означает, что пакет IP имеет установленный бит CE (перегрузка).
      • Если бит SYN установлен в 1, ECE означает, что устройство поддерживает ECT.

      Адресация

      Связь TCP между двумя удаленными хостами выполняется с помощью номеров портов (TSAP). Номера портов могут варьироваться от 0 до 65535, которые делятся как:

      • Порты системы (0 — 1023)
      • Порты пользователей (1024 — 49151)
      • Частные / динамические порты (49152 — 65535)

      Управление подключениями

      Связь TCP работает в модели Server / Client. Клиент инициирует соединение, и сервер либо принимает, либо отклоняет его. Для управления подключением используется трехстороннее связывание.

      Установка соединения

      Клиент инициирует соединение и отправляет сегмент с порядковым номером. Сервер подтверждает это со своим собственным порядковым номером и ACK сегмента клиента, который является еще одним номером последовательности клиентов. Клиент после получения ACK своего сегмента отправляет подтверждение ответа сервера.

      Любой из серверов и клиентов может отправлять сегмент TCP с флагом FIN, установленным в 1. Когда принимающая сторона отвечает на это посредством ACKnowlinging FIN, это направление связи TCP закрывается и соединение освобождается.

      Управление полосой пропускания

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

      Например, клиент использует размер окна 2 и отправляет 2 байта данных. Когда подтверждение этого сегмента получено, размер окна удваивается до 4, а следующий отправленный сегмент отправляется длиной 4 байта данных. Когда получено подтверждение 4-байтового сегмента данных, клиент устанавливает размер окна 8 и т. Д.

      Если упущено подтверждение, то есть данные, потерянные в транзитной сети или полученные NACK, размер окна уменьшается до половины, а медленная начальная фаза начинается снова.

      Контроль ошибок и контроль потока

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

      Если порядковый номер недавно полученного сегмента не совпадает с порядковым номером, который ожидал приемник, он отбрасывается и NACK отправляется обратно. Если два сегмента поступают с одинаковым порядковым номером, значение временной метки TCP сравнивается для принятия решения.

      Мультиплексирование

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

      Используя TCP Multiplexing, клиент может взаимодействовать с несколькими различными процессами приложения за один сеанс. Например, клиент запрашивает веб-страницу, которая, в свою очередь, содержит различные типы данных (HTTP, SMTP, FTP и т. Д.), Тайм-аут сеанса TCP увеличивается, и сеанс остается открытым на более длительное время, так что накладные расходы на трехстороннюю рукопожатие могут избегать.

      Это позволяет клиентской системе получать несколько соединений по одному виртуальному соединению. Эти виртуальные соединения не подходят для серверов, если тайм-аут слишком длинный.

      Контроль перегрузок

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

      • Аддитивное увеличение, мультипликативное уменьшение
      • Медленный старт
      • Время ожидания

      Управление таймером

      TCP использует различные типы таймеров для управления и управления различными задачами:

      Таймер сохранения:

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

      Таймер повторной передачи:

      • Этот таймер поддерживает сеанс передачи данных с сохранением состояния.
      • Если подтверждение отправленных данных не будет получено в течение времени повторной передачи, сегмент данных будет отправлен снова.

      Постоянный таймер:

      • Сеанс TCP может быть приостановлен хостом, отправив Размер окна 0.
      • Чтобы возобновить сеанс, хосту необходимо отправить размер окна с некоторым большим значением.
      • Если этот сегмент никогда не достигнет другого конца, оба конца могут ждать друг друга в течение бесконечного времени.
      • Когда таймер Persist истекает, хост повторно отправляет свой размер окна, чтобы узнать другой конец.
        Persist Timer помогает избежать взаимоблокировок в общении.

      Timed-Wait:

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

      Восстановление после аварий

      TCP — очень надежный протокол. Он предоставляет порядковый номер для каждого байта, отправленного в сегменте. Он обеспечивает механизм обратной связи, т.е. когда хост получает пакет, он привязан к ACK, чтобы ожидал пакет, имеющий следующий порядковый номер (если он не является последним сегментом).

      Когда TCP-сервер прерывает связь в середине и перезапускает его процесс, он отправляет трансляцию TPDU всем своим хостам. Затем хосты могут отправить последний сегмент данных, который никогда не был непризнан и продолжен.

      Источник

      Установка соединения или установление соединения

      "Подтверждение трех путей" — это процедура, используемая при установлении соединения. Эта процедура обычно инициируется программой протокола TCP в ответ на запрос другой программы TCP. Данная процедура также работает, если две программы TCP инициируют ее одновременно. Когда попытка инициализации осуществляется с обоих концов одновременно, каждая программа протокола TCP получает сегмент "SYN", который не несет подтверждения для уже отправленного ею "SYN". Конечно, прибытие старых дубликатов сегмента "SYN" может произвести впечатление на получателя, будто осуществляется одновременное открытие соединения. Корректное применение сегментов "перезагрузки" может предотвратить двусмысленность таких ситуаций.

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

      Простейшая процедура подтверждения трех путей показана ниже на рисунке 5. Рисунки следует интерпретировать следующим образом. Для удобства каждая строка пронумерована. Правые стрелки (—>) показывают отправление TCP сегмента от программы TCP A в программу TCB B, или же получение сегмента программой B из программы A. Левые стрелки (<—) показывают обратные процессы. Многоточие (. ) показывает сегмент, который все еще задерживается в сети. "XXX" указывает на сегмент, который потерян или отвергнут. Комментарии появляются в скобках.

      Здесь "состояния" программы протокола TCP соответствуют моменту сразу после посылки или получения сегмента (содержимое этого сегмента показано в средней колонке каждой строки). Содержимое сегмента в приводится в сокращенной форме и представляет собой номер очереди, флаги управления и поле ACK. Остальные поля сегмента, такие как окно, длина и поле данных остаются за рамками нашего интереса.

      Рис. 5 Основная процедура подтверждения трех путей для
      синхронизации соединения

      На строке 2 рисунка 5 программа TCP A начинает с посылки сигнала SYN, показывая тем самым, что она будет использовать номера очереди, начиная с номера 100. На строке 3 программа TCB B посылает сигнал SYN, а также подтверждение о том, что сигнал SYN со стороны программы TCP A получен. Заметим, что поле подтверждения информирует о том, что программа TCP B в данный момент ожидает получение номера 101. Последнее также подтверждает, что сигнал SYN уже занял место в очереди под номером 100.

      На строке 4 для отправленного программой TCP B в строке 3 сигнала SYN программа TCP A дает ответ с помощью пустого сегмента, содержащего сигнал ACK . В строке 5 программа TCP A передает по сети уже некую порцию данных. Заметим, что сегмент в строке 5 имеет тот же номер очереди, что был у сегмента в строке 4, поскольку сигнал ACK в очереди места не занимает (если бы это было не так, то нам следовало обзавестись подтверждением -ACK- для самого подтверждения!).

      На рисунке 6 показана та же инициализация с незначительными усложнениями. Каждая программа TCP проходит по очереди состояния CLOSED, SYN-SENT, SYN-RECIEVED и наконец, ESTABLISHED.

      . TCP A . TCP B
      1. CLOSED . CLOSED
      2. SYN-SENT —> <SEQ=100><CTL=SYN> .
      3. SYN-RECEIVED <— <SEQ=300><CTL=SYN> <— SYN-SENT
      4. . . <SEQ=100><CTL=SYN> —> SYN-RECEIVED
      5. SYN-RECEIVED —> <SEQ=100><ACK=301><CTL=SYN,ACK> . .
      6. ESTABLISHED <— <SEQ=300><ACK=101><CTL=SYN,ACK> <— SYN-RECEIVED
      7. . . <SEQ=101><ACK=301><CTL=ACK> —> ESTABLISHED

      Рис. 6 Одновременная синхронизация соединения

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

      Если получающая сигнал программа TCP находится не в синхронизированном состоянии (т.е. в SYN-SENT, SYN-RECEIVED), то она возвращает сигнал LISTEN, показывая, что она получила приемлемый сигнал перезагрузки. Если же программа TCP находится в одном из синхронизированных состояний (ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT), то она ликвидирует соединение и проинформирует об этом своего клиента. Мы обсудим ниже такую ситуацию при рассмотрении "наполовину открытых" соединений.

      . TCP A . TCP B
      1. CLOSED . LISTEN
      2. SYN-SENT —> <SEQ=100><CTL=SYN> . .
      3. (дубликат) . <SEQ=90><CTL=SYN> —> SYN-RECEIVED
      4. SYN-SENT <— <SEQ=300><ACK=91><CTL=SYN,ACK> <— SYN-RECEIVED
      5. SYN-SENT —> <SEQ=91><CTL=RST> —> LISTEN
      6. . . <SEQ=100><CTL=SYN> —> SYN-RECEIVED
      7. SYN-SENT <— <SEQ=400><ACK=101><CTL=SYN,ACK> <— SYN-RECEIVED
      8. ESTABLISHED —> <SEQ=101><ACK=401><CTL=ACK> —> ESTABLISHED

      Рис. 7 Получение старого дубликата сигнала SYN

      В качестве простого примера рассмотрим ситуацию с получением старых дубликатов на рисунке 7. На строке 3 старый дубликат сигнала SYN достигает программу TCP B. Последняя не может определить, что это старый дубликат, и поэтому отвечает обычным образом (строка 4).

      Программа TCP A обнаруживает ошибочное значение в поле ACK и поэтому возвращает сигнал RST (перезагрузка). При этом значение поля SEQ выбирается таким образом, чтобы сделать сегмент правдоподобным. Про грамма TCP B по получении сигнала RST переходит в состояние LISTEN. Когда на строке 6 сигнал SYN, действительный, а не устаревший, достигает программу TCP B, процесс синхронизации происходит нормально. Если же сигнал SYN на строке 6 достигает программу TCP B прежде сигнала RST, может возникнуть более сложная комбинация обмена с посылкой RST в обоих направлениях.

      Наполовину открытые соединения и другие аномалии

      Уже установившееся соединение называется "наполовину открытым", если одна из программ TCP закрыла соединение, или отказалась от него. Причем сделала это на своем конце, не предупредив своего партнера. Также такая ситуация может возникнуть, если нарушена синхронизация на концах линии вследствие сбоя, приведшего к потере информации в памяти. Если на таких соединениях делается попытка отправить данные в каком-либо направлении, то автоматически производится перезагрузка соединения. Однако предполагается, что наполовину открытые соединения являются редкостью, а процедура восстановления применяется в сети весьма умеренно.

      Если на конце A соединение считается уже несуществующим, а клиент на конце B пытается послать данные, то это приведет к тому, что программа TCP на конце B получит контрольное сообщение о перезагрузке. Такое сообщение показывает программе TCP на конце B, что что-то неправильно и ей предлагается ликвидировать это соединение.

      Предположим, что два клиента в точках A и B общаются друг с другом, и в этот момент происходит крах, приводящий к потере информации в памяти у программы TCP на конце A. В зависимости от операционной системы, обслуживающей программу TCP A, вероятно, будет задействован некий механизм исправления ошибки. Когда программа TCP A будет запущена вновь, она, вероятно, вновь начнет свою работу с самого начала или же с инструкции преодоления сбоя. В результате, программа A, вероятно, попытается открыть (OPEN) соединение или послать информацию (SEND) через соединение, которое, как она полагает, является открытым. В последнем случае от местной программы TCP (на конце A) будет получено сообщение "соединение не открыто". При попытке установить соединение программа TCP A будет посылать сегмент, содержащий сигнал SYN. Такой сценарий приводит к ситуации, показанной на рисунке 8. После того, как программа TCP A потерпит крах, пользователь попытается повторно открыть соединение. Программа TCP B тем временем продолжает полагать, будто соединение остается открытым.

      Рис. 8 Обнаружение наполовину открытого соединения

      Когда на строке 3 сигнал SYN достигает программу TCP B, находящуюся в синхронизированном состоянии, а пришедший сегмент находится за пределами окна, программа TCP B отвечает на это его подтверждением, показывает номер очереди, который она желает получить (ACK=100). Программа TCP A, видя, что сегмент на строке 4 не подтвердил отправленную ею информацию, фиксирует отсутствие синхронизации и посылает сигнал перезагрузки (RST), поскольку обнаружено, что соединение является открытым наполовину. На строке 5 программа TCP B ликвидирует соединение. Программа TCP A будет продолжать попытки установить соединение.

      Теперь возникшая проблема решается простым подтверждением трех путей (рисунок 5).

      Другой интересный сюжет имеет место, если программа TCP A терпит крах, а программа TCP B, полагая, что находится в состоянии синхронизации, пытается послать данные. Эта ситуация показана на рисунке 9.

      В этом случае данные, отправленные программой TCP B, и пришедшие на программу TCP A (строка 2). будут отвергнуты, поскольку используемого ими соединения не существует. На основании этого программа TCP A посылает сигнал RST. Как только сигнал RST принят программой TCP B, он будет рассмотрен, а использованное прежде соединение будет ликвидировано.

      На рисунке 10 показано, что две программы TCP — A и B — ,имея пассивное состояние, ждут сигнала SYN. Старый дубликат сигнала, достигает программу TCP B (строка 2), запускает ее. Возвращается сигнал SYN-ACK (строка 3) и заставляет программу TCP A генерировать сигнал RST (на строке 3 сигнал ACK неприемлем). Программа TCP B принимает команду перезагрузки и возвращается в пассивное состояние LISTEN.

      Может быть множество других вариаций, которые могут быть объяснены нижеописанными правилами для создания и обработки сигналов RST.

      Создание сигнала перезагрузки

      Согласно главному правилу, сигнал перезагрузки (RST) должен посылаться всякий раз, когда приходит сегмент, который очевидным образом не предназначен для данного соединения. Если непонятно, имеет ли место данный случай, следует воздержаться от перезагрузки.

      Можно выделить три группы состояний для соединения:

      Если соединения не существует (CLOSED), то сигнал перезагрузки посылается в ответ на любой пришедший сегмент, за исключением встречного сигнала перезагрузки. В частности, сигналы SYN, адресованные на несуществующее соединение, отвергаются именно таким образом. Если приходящий сегмент имеет флаг в поле ACK, то сегмент с сигналом перезагрузки получает номер для очереди из поля ACK первого сегмента. В противном случае сегмент с сигналом перезагрузки имеет нулевой номер очереди и значение в поле ACK, равным сумме номера очереди пришедшего сегмента и его же длины. Соединение остается в состоянии CLOSED.

      Если соединение находится в каком-либо не синхронизированном состоянии (LISTEN, SYN-SENT, SYN-RECEIVED), если какие-либо подтверждения пришедшего сегмента еще не отправлены (сегмент несет неприемлемое значение в поле ACK) или пришедший сегмент имеет уровень безопасности/закрытости не соответствующий уровню и защите данного соединения, то отправляется сигнал перезагрузки.

      Если наш сигнал SYN не был подтвержден, а уровень приоритета пришедшего сегмента больше запрошенного уровня, то либо будет увеличен местный уровень приоритета (если это приемлемо для пользователя и системы), либо будет послан сигнал перезагрузки. Или же если уровень приоритета пришедшего сегмента меньше запрошенного, то обработка будет продолжена далее, как если бы уровень был таким же (если чужая программа TCP не может повысить уровень приоритета до нашего, то это будет отмечено в следующем отправляемом ею сегменте, тогда и будет закрыто соединение). Если наш сигнал SYN получил подтверждение (возможно в пришедшем к нам сегменте), то уровень приоритета пришедшего сегмента должен точно соответствовать мест ному уровню. Если последнее условие не выполняется, посылается сигнал перезагрузки.

      Если приходящий сегмент несет сигнал ACK, то сигнал перезагрузки будет иметь номер в очереди, соответствующий номеру сигнала ACK в пришедшем сегменте. В противном случае сигнал перезагрузки будет иметь нулевой номер очереди, а сигнал ACK — номер, равный сумме номера пришедшего сегмента и его же длины. Соединение не меняет своего состояния.

      Если соединение находится в синхронизированном состоянии (ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST ACK, TIME-WAIT), то любой неприемлемый сегмент (не попадающий в окно номеров очереди, несущий неправильный номер подтверждения) должен приводить к появлению сегмента с пустым полем подтверждения, содержащего текущий номер в очереди на посылку, а также подтверждение, указывающее на следующий ожидаемый с этого соединения номер. Соединение остается в своем прежнем состоянии. Если пришедший сегмент имеет уровень защиты, изоляции или приоритета, не соответствующий местному уровню соединения, то отправляется сигнал перезагрузки, а соединение переходит в состояние CLOSED. Сигнал перезагрузки имеет номер очереди, соответствующий номеру сигнала ACK в пришедшем сегменте.

      Обработка сигнала на перезагрузку

      Для всех состояний, кроме SYN-SENT, все сегменты с сигналом перезагрузки (RST) проходят проверку полей SEQ. Сигнал перезагрузки признается, если его номер очереди попадает в окно. В состоянии же SYN SENT (сигнал RST получен в ответ на посылку инициирующего сигнала SYN), сигнал RST признается, если поле ACK подтверждает ранее сделанную посылку сигнала SYN.

      Получатель сигнала RST сперва проверяет его, и лишь потом меняет свое состояние. Если получатель находился в состоянии LISTEN, то он игнорирует сигнал. Если получатель находился в состоянии SYN- RECEIVED, то он возвращается вновь в состояние LISTEN. В иных случаях получатель ликвидирует соединение и переходит в состояние CLOSED. Если получатель находится в каком-либо ином состоянии, то он ликвидирует соединение и прежде чем перейти в состояние CLOSED, оповещает об этом своего клиента.

      Источник

      Протокол TCP

      TCP — это протокол транспортного уровня, предоставляющий транспортировку (передачу) потока данных, с необходимостью предварительного установления соединения, благодаря чему гарантирует уверенность в целостности получаемых данных, также выполняет повторный запрос данных в случае потери данных или искажения. Помимо этого протокол TCP отслеживает дублирование пакетов и в случае обнаружения — уничтожает дублирующиеся пакеты. TCP — это аббревиатура от Transmission Control Protocol (Протокол Управления Передачей) — является обязательным протоколом стандарт TCP/IP, определенный в стандарте RFC 793, «Transmission Control Protocol (TCP)».

      В отличие от протокола UDP гарантирует целостность передаваемых данных и подтверждения отправителя о результатах передачи. Используется при передаче файлов, где потеря одного пакета может привести к искажению всего файла.

      TCP обеспечивает свою надежность благодаря следующему:

      • Данные от приложения разбиваются на блоки определенного размера, которые будут отправлены.
      • Когда TCP посылает сегмент, он устанавливает таймер, ожидая, что с удаленного конца придет подтверждение на этот сегмент. Если подтверждение не получено по истечении времени, сегмент передается повторно.
      • Когда TCP принимает данные от удаленной стороны соединения, он отправляет подтверждение. Это подтверждение не отправляется немедленно, а обычно задерживается на доли секунды
      • TCP осуществляет расчет контрольной суммы для своего заголовка и данных. Это контрольная сумма, рассчитываемая на концах соединения, целью которой является выявить любое изменение данных в процессе передачи. Если сегмент прибывает с неверной контрольной суммой, TCP отбрасывает его и подтверждение не генерируется. (Ожидается, что отправитель отработает тайм-аут и осуществит повторную передачу.)
      • Так как TCP сегменты передаются в виде IP датаграмм, а IP датаграммы могут прибывать беспорядочно, также беспорядочно могут прибывать и TCP сегменты. После получения данных TCP может по необходимости изменить их последовательность, в результате приложение получает данные в правильном порядке.
      • Так как IP датаграмма может быть продублирована, принимающий TCP должен отбрасывать продублированные данные.
      • TCP осуществляет контроль потока данных. Каждая сторона TCP соединения имеет определенное пространство буфера. TCP на принимающей стороне позволяет удаленной стороне посылать данные только в том случае, если получатель может поместить их в буфер. Это предотвращает от переполнения буферов медленных хостов быстрыми хостами.

      Заголовок TCP

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

        Рассмотрим структуру заголовка TCP с помощью сетевого анализатора Wireshark:

        TCP порты

        Так как на одном и том же компьютере могут быть запущены несколько программ, то для доставки TCP-пакета конкретной программе, используется уникальный идентификатор каждой программы или номер порта.

        Номер порта — это условное 16-битное число от 1 до 65535, указывающее, какой программе предназначается пакет.

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

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

        Все номера портов TCP, которые меньше чем 1024 — зарезервированы и зарегистрированы в Internet Assigned Numbers Authority (IANA).

        Номера портов UDP и TCP не пересекаются.

        TCP программы используют зарезервированные или хорошо известные номера портов, как показано на следующем рисунке.

        Установление соединения TCP

        Давайте теперь посмотрим, как устанавливается TCP-соединения. Предположим, что процесс, работающий на одном хосте, хочет установить соединение с другим процессом на другом хосте. Напомним, что хост, который инициирует соединение называется «клиентом», в то время как другой узел называется «сервером».

        Перед началом передачи каких-либо данных, согласно протоколу TCP, стороны должны установить соединение. Соединение устанавливается в три этапа (процесс «трёхкратного рукопожатия» TCP).

        • Запрашивающая сторона (которая, как правило, называется клиент) отправляет SYN сегмент, указывая номер порта сервера, к которому клиент хочет подсоединиться, и исходный номер последовательности клиента (ISN).
        • Сервер отвечает своим сегментом SYN, содержащим исходный номер последовательности сервера. Сервер также подтверждает приход SYN клиента с использованием ACK (ISN + 1). На SYN используется один номер последовательности.
        • Клиент должен подтвердить приход SYN от сервера своим сегментов SYN, содержащий исходный номер последовательности клиента (ISN+1) и с использованием ACK (ISN+1). Бит SYN установлен в 0, так как соединение установлено.

        После установления соединения TCP, эти два хоста могут передавать данные друг другу, так как TCP-соединение является полнодуплексным, они могут передавать данные одновременно.

        Источник

        Читайте также:  Установка фаркопа лексус gx460
Adblock
detector