Что такое handshake в сетевом взаимодействии
Что проверяют
Понимаете ли вы, что происходит до первого байта полезных данных, и умеете ли связать это с задержками своего сервиса. Java-разработчику вопрос задают не ради теории: пулы соединений, повторное использование каналов и настройка хранилищ сертификатов на JVM растут именно отсюда.
Как отвечать
Handshake это предварительный обмен, в котором стороны договариваются о параметрах и убеждаются, что связь работает в обе стороны. На собеседовании ждут два уровня.
Тройное рукопожатие TCP: клиент шлёт запрос на установление с начальным порядковым номером, сервер подтверждает его и присылает свой, клиент подтверждает серверный. Смысл в синхронизации порядковых номеров и в проверке обоих направлений, цена в одном полном обороте до первых данных. Закрывается соединение уже не тремя, а четырьмя пакетами.
Рукопожатие TLS идёт поверх установленного TCP: согласование версии и набора шифров, аутентификация сервера сертификатом, выработка общего ключа, попутно выбор протокола приложения и имя запрашиваемого хоста. В старых версиях протокола это два оборота, в современной один, а при возобновлении сессии данные можно отправить сразу.
Практический вывод для JVM: рукопожатие платится за соединение, а не за запрос. Поэтому пул соединений к базе и живущий долго HTTP-клиент с повторным использованием канала убирают из каждого вызова заметную часть задержки.
Где спотыкаются
Смешивают уровни: приписывают сертификаты пакетам TCP или считают, что рукопожатие одно. Их два, они идут одно за другим, и суммарная задержка до первого байта складывается из обоих плюс разрешение имени.
Открывают новое соединение на каждый запрос и удивляются задержке. На локальном стенде оборот незаметен, на межрегиональном канале он определяет время ответа целиком, и лечится это включением повторного использования соединений, а не увеличением таймаутов.
Списывают ошибку рукопожатия на сервер, не проверив свою сторону. Чаще всего виноваты локальное хранилище доверенных корней, недосланная промежуточная цепочка или отключённые в среде исполнения старые протоколы и шифры. Стоит помнить и то, что по умолчанию проверяется только сервер, взаимная проверка настраивается отдельно.