Подробное объяснение TCP

задняя часть

1. TCP

1.1 Концепция

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

1.2 TCP-заголовок

TCP 报文头

1.3 Значение полей заголовка TCP

1. Исходный порт и порт назначения:

Занимает 16 бит соответственно, указывая номер порта источника и номер порта назначения, которые используются для различения различных процессов на хосте, а IP-адрес используется для различения разных хостов.Номер исходного порта и номер порта назначения совпадают с исходным IP в заголовке IP.Адрес и IP-адрес назначения могут однозначно идентифицировать соединение TCP.

2. Sequence Number:

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

3. Acknowledgment Number:

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

4. Offset:

Учитывая количество 32-битных слов в заголовке, это значение является обязательным, поскольку необязательные поля имеют переменную длину. Это поле занимает 4 бита (оно может представлять до 15 32-битных слов, то есть 4*15=60 байтов длины заголовка), поэтому TCP имеет максимум 60 байтов заголовков. Однако необязательных полей нет, а нормальная длина составляет 20 байт.

5. TCP Flags:

В заголовке TCP есть 6 флаговых битов, многие из которых могут быть одновременно установлены в 1, в основном используемые для управления конечным автоматом TCP, которые последовательно представляют собой URG, ACK, PSH, RST, SYN, FIN. Значение каждого бита флага следующее:

  • URG: этот флаг указывает, что поле срочного указателя TCP-пакета (которое вскоре будет обсуждаться) допустимо, чтобы гарантировать, что TCP-соединение не будет прервано, и побудить устройство среднего уровня обработать эти данные как можно скорее. .

  • ACK Этот флаг указывает на то, что поле ответа допустимо, что означает, что указанный выше номер ответа TCP будет включен в пакет данных TCP, существует два значения: 0 и 1. Когда он равен 1, это означает, что поле ответа заполнено. действительно, иначе 0.

  • PSH: этот логотип представляет операцию PUSH. Так называемая операция PUSH относится к приложению сразу после того, как пакет достигает получателя, а не к очередям в буфере.

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

  • SYN: указывает порядковый номер синхронизации, который используется для установления соединения. Флаг SYN используется в сочетании с флагом ACK: при запросе на соединение SYN=1, ACK=0, при ответе на соединение SYN=1, ACK=1, пакеты с этим флагом часто используются для порта сканирование . Сканер отправляет пакет данных только с SYN. ​​Если другой хост отвечает пакетом данных, это указывает на то, что у хоста есть этот порт, но поскольку этот метод сканирования является только первым рукопожатием трехэтапного рукопожатия TCP, это метод сканирования Успех указывает на то, что сканируемая машина не очень безопасна, и защищенный хост будет применять строгое трехстороннее рукопожатие TCP для соединения.

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

6. Window:

Размер скользящего окна (управление потоком).

7. Контрольная сумма:

Четность, эта контрольная сумма вычисляется в 16-битных словах по всему сегменту TCP, включая заголовок TCP и данные TCP. Рассчитывается и сохраняется отправителем и проверяется получателем.

8. Аварийный указатель:

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

9. Опции и отступы:

Наиболее распространенным необязательным полем является самый длинный размер сообщения, также известный как MSS (Maximum Segment Size. Этот параметр указывается в сегменте), который указывает длину максимального сегмента, который может принять локальный конец. Длина параметра не обязательно является целым числом, кратным 32 битам, поэтому добавляются биты заполнения, то есть в это поле добавляются дополнительные нули, чтобы гарантировать, что заголовок TCP является целым числом, кратным 32.

10. Раздел данных:

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

2. Трехстороннее рукопожатие

2.1 Причины

Зачем нужны три рукопожатия:

  • IP — это коммуникационный протокол без установления соединения, расположенный на сетевом уровне. Протокол IP отвечает только за отправку IP-пакетов в пункт назначения, но не гарантирует их отправку в пункт назначения. Поэтому на транспортном уровне используется метод соединения для обеспечить передачу данных. вверх.

2.2 Концепция

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

2.3 Блок-схема трехстороннего рукопожатия

三次握手的流程图

2.4 Интерпретация блок-схемы

  • Первое рукопожатие: клиент устанавливает флаг SYN в 1, случайным образом генерирует значение seq=J и отправляет пакет данных на сервер.Клиент входит в состояние SYN_SENT и ждет подтверждения от сервера.
  • Второе рукопожатие: после того, как сервер получает пакет данных, флаг SYN=1 знает, что клиент запрашивает установление соединения, и сервер устанавливает флаги SYN и ACK в 1, ack=J+1 и случайным образом генерирует значение seq= K и отправляет пакет данных клиенту для подтверждения запроса на соединение, а сервер переходит в состояние SYN_RCVD.
  • Третье рукопожатие: после того, как клиент получил подтверждение, он проверяет, соответствует ли подтверждение J+1 и равно ли ACK 1. Если все верно, бит флага ACK устанавливается в 1, подтверждение=K+1 и отправляется на сервер Сторона сервера проверяет, соответствует ли ACK K+1 и ACK равно 1. Если это правильно, соединение устанавливается успешно.Клиент и сервер переходят в состояние ESTABLISHED, завершают трехэтапное рукопожатие, и тогда клиент и сервер могут начать передавать данные.

2.5 Риски безопасности

2.5.1 Первое рукопожатие — тайм-аут SYN

После того, как сервер получает SYN от клиента, он не получает подтверждения ACK при ответе на SYN-ACK, в результате чего сервер продолжает повторять попытки до истечения времени ожидания.

2.5.2 Атака SYN Flood

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

2.5.3 Как бороться с атаками SYN Flood
  • После заполнения очереди SYN отправьте обратно файл cookie SYN с помощью параметра tcp_syncookies.
  • Если это обычное соединение, Клиент отправит обратно файл cookie SYN для установления соединения.

2.6 После установления соединения Клиент не работает

2.6.1 Механизм поддержания активности

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

3. Помашите четыре раза

3.1 Причины

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

3.2 Концепция

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

3.3 Блок-схема четырех взмахов рук

四次挥手流程图

3.4 Зачем клиенту нужно TIME-WAIT после отправки последнего пакета ACK

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

3.5 Причины большого количества состояний CLOSE-WAIT на сервере

Клиент закрывает сокетное соединение, сервер занят чтением или записью, а соединение не закрывается вовремя

  • Проверьте код, особенно код выпуска ресурса.
  • Проверьте конфигурацию, особенно конфигурацию потока, который обрабатывает запрос.

4. Скользящее окно TCP

4.0 Должен знать и должен знать

RTT

Время, прошедшее между отправкой пакета и получением соответствующего ACK

RTO

Интервал повторной передачи (рассчитывается по RTT)

4.1 Роль скользящего окна

TCP использует скользящие окна для управления потоком и переупорядочивания не по порядку.