Готовый перевод Mastering Swoole PHP: Build High Performance Concurrent System with Async and Coroutines / Осваиваем Swoole PHP: построение высокопроизводительной конкурентной системы с асинхронностью и корутинами: Некоторые факты о TCP-соединениях

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «идёт перевод»

Установка TCP-соединения происходит медленно

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

В последнее время, когда HTTPS стал популярен и принят на большинстве сервисов и веб-сайтов, рукопожатие TLS для установки зашифрованного уровня происходит медленнее; это занимает 250 мс или 1 с.

Чтобы сэкономить время соединения TCP, нам желательно повторно использовать соединение. По сравнению с HTTP 1.0, HTTP 1.1 может повторно использовать одно и то же соединение TCP для нескольких запросов один за другим. В HTTP 2.0 поддерживается мультиплексирование, клиенты могут одновременно отправлять несколько запросов через одно TCP-соединение, что еще больше повышает производительность.

TCP-соединение закрывается

Закрыть TCP-соединение также сложно. Сторона, инициализирующая процесс закрытия, остается в состоянии TIMEWAIT в течение длительного периода времени. Одна и та же комбинация соединений не может быть повторно использована во время состояния TIMEWAIT, чтобы избежать ситуации, когда пакет рассматривается как пакет следующего соединения. Мы также должны убедиться, что удаленная сторона получает последний ACK и закрывает соединение, даже если последний ACK потерян.

В Linux значение TIMEWAIT по умолчанию составляет 120 секунд или 2 минуты. Не рекомендуется изменять это значение. На загруженном сервере, обрабатывающем большое количество кратковременных подключений, вы можете увидеть, что многие TCP-соединения находятся в состоянии TIMEWAIT, в этом случае это значение можно уменьшить, чтобы обрабатывать больше одновременных подключений. Ресурсы сокета передаются серверу быстрее.

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

Вы можете проверить состояние TCP-соединения с помощью команды ss.

ss -s

Total: 169(kernel 2893)
TCP: 11(estab 4, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* ​ 2893 - -
RAW ​ 1 0 1
UDP ​ 1 1 0
TCP ​ 11 9 2
INET ​ 13 10 3
FRAG ​ 0 0 0

Изображение 7.3 Использование команды ss для проверки статуса соединения

Жизненный цикл и время ожидания сокета

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

Жизненный цикл абстрактного ресурса

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

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод

Переведено на Нотабеноиде
http://notabenoid.org/book/81342/496702

Переводчики: bubenok

Настройки

Готово:

100.00% КП = 1.0