Что такое TCP Fast Open?

Опубликовано: 16 Сентября, 2022

Квитирование TCP занимает один полный RTT (время приема-передачи). RTT — это время, за которое пакет проходит путь от отправителя к получателю и обратно. Один RTT — это большое количество времени для «короткоживущего» и «чувствительного ко времени» трафика, такого как веб-трафик; просмотр веб-страниц в браузере, как посещение веб-сайта. Производительность ухудшается еще больше, если задержка распространения очень велика (например, линия связи между наземной станцией и спутником) или если мобильная сеть работает очень медленно. Один RTT (значительно) не ухудшает производительность «эластичного трафика» (например, передачи файлов), потому что накладные расходы одного RTT довольно малы по сравнению с продолжительностью всего соединения.

Предположим, что 1 RTT = 86 мс. это означает, что пользователь посещает www.xyz.com и 86 мс используется только для установления соединения с сервером XYZ . Каждый раз, когда пользователь хочет посетить один и тот же сервер, 86 мс будут потрачены впустую таким же образом. Этот RTT не имеет большого значения, когда происходит передача файлов или обновление приложений, потому что этот процесс обычно занимает минуты или часы, несколько миллисекунд — ничто по сравнению с минутами.

Что такое ТФО?

TFO расшифровывается как TCP Fast Open . Это решение транспортного уровня, позволяющее избежать одного полного RTT между клиентом и сервером. Это позволяет избежать рукопожатия TCP-3 для повторных подключений. TFO предложен командой Google и описан в RFC 7413.

В обычном TCP-соединении один RTT тратится на установление соединения, а затем, начиная с третьего пакета, начинается настоящая связь. TFO говорит, что клиент может сам отправлять запросы GET в первом пакете, не тратя впустую 1 RTT. Но для этого есть ряд условий:

1. Это не должно быть «новое» соединение

TFO работает только для повторных подключений из-за требования криптографического файла cookie. В первый раз, когда клиент взаимодействует с сервером, он должен выполнить трехстороннее рукопожатие. В этом рукопожатии сервер делится с клиентом криптографическим файлом cookie. Для следующего подключения клиент просто добавляет запрос GET и файл cookie в сам пакет SYN. Затем сервер аутентифицирует клиента с помощью файла cookie, принимает запрос на подключение и отправляет данные в пакете ACK.

2. Общий объем данных, содержащихся в пакете SYN, должен находиться в установленных пределах.

Каков указанный предел? Всего в пакет для IPv4 может быть включено 1460 байтов. Следовательно, размер одного сегмента становится 1460 Б.

3. С помощью TFO можно отправлять только определенные типы HTTP-запросов.

GET-запрос поддерживается. TFO не поддерживает POST-запросы, потому что, если он позволяет выполнять операции записи на сервере, хакеры могут выполнять вредоносные действия, которые могут нанести серьезный вред серверу.

Работа ТФО:

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

Поле «Опции» в заголовке TCP используется для TFO.

  • TCP-клиент использует его для запроса файла cookie TFO.
  • TCP-сервер использует его для отправки файла cookie TFO.

В поле параметров переменная Kind хранит значение 32 для файла cookie. Длина файла cookie составляет 16 байт. Когда клиент отправляет пакет SYN на сервер, он устанавливает Kind = 32 в поле параметров. Когда сервер видит значение kind равное 32, он понимает, что клиент поддерживает TFO и запрашивает куки. Сервер создает уникальный файл cookie и шифрует его, используя IP-адрес клиента, чтобы у каждого клиента был уникальный файл cookie. В поле параметров сервер отправляет куки клиенту.

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

Поддерживает ли TFO условные запросы GET?

Он должен поддерживать условный GET. Запросы GET в основном являются операциями только для чтения. Таким образом, они должны быть разрешены TFO. Это не должно рассматриваться с точки зрения временной задержки. Условные запросы GET в основном отправляются с локального сервера на центральный сервер, когда данные на локальном сервере устарели и не могут быть доставлены клиенту. В этом случае свежие данные извлекаются с центрального сервера и кэшируются на локальном сервере для обслуживания локальных клиентов.

Командная строка линукса:

Играем с TFO в ядре Linux с помощью некоторых команд:

Проверка настройки TFO по умолчанию в ядре Linux

$ sysctl net.ipv4.tcp_fastopen

Ожидаемый результат (это означает, что TFO включен на клиенте):

$ net.ipv4.tcp_fastopen = 1

Включение TFO, если ваша машина является сервером

$ sudo sysctl -w net.ipv4.tcp_fastopen=2

Ожидаемый результат:

$ net.ipv4.tcp_fastopen = 2

Включение TFO, если ваша машина является не только сервером, но и клиентом

$ sudo sysctl -w net.ipv4.tcp_fastopen=3

Ожидаемый результат

$ net.ipv4.tcp_fastopen = 3

Отключение TFO

$ sudo sysctl -w net.ipv4.tcp_fastopen=0

Ожидаемый результат

$ net.ipv4.tcp_fastopen = 0