Почему все браузеры при HTTPS-запросе открывают сразу две TLS-сессии, а HTTP-библиотеки только одну?
Начну с начала.
Был сделан бот для сайта с HTTPS. А потом он сломался. Оказалось, что проблема не в HTTP-запросах, а гораздо раньше - уже в самом подключении TLS. То есть Handshake Failure. При этом в браузерах с того же самого IP и при прочих равных (очистка всего и вся) хендшейк отрабатывает нормально. Если кто не понял - сайт НАРОЧНО каким-то образом детектит и отсекает TLS ботов. С другими HTTPS сайтами все отлично.
И я решил взять Wireshark и сравнить, как происходит TLS подключение там и там.
Пробовал браузеры Chrome, Internet Explorer и Firefox.
А в боте (он написан на C#) пробовал библиотеки xNet, System.Net.WebClient и напрямую SslStream.
Все это под ОС Windows.
И увидел, что во всех браузерах почему-то открывается сразу 2 сессии.
То есть дважды отправляется сегмент с [SYN, ECN, CWR], и также дважды отправляется TLS v1 Client Hello.
А во всех библиотеках все это только по одному.
(В то же время, еще и сами TLS v1 Client Hello отличаются по своему содержимому у библиотек и у браузеров. Может быть, дело в этом. Но может, и в том, что не 2 сессии.)
Изменить эти библиотеки не представляется возможности. Они все завязаны на стандартных классах .NET, у которых огромный код, так что собирать только весь дотнет целиком, а это слишком большой гемор.
(Собирать хромиум - уже делал однажды, но тоже геморно, и дорого в плане покупки облачных мощностей)
Мне нужна какая-то своя, опенсорсная реализация SSL/TLS, чтобы я там все доработал. Ну и возможно есть какие-то библиотеки для каких-то языков программирования (а я готов на любой язык переписать), которые содержат свою реализацию и работают корректнее.
А пока нужен ответ на вопрос - почему у браузеров сразу 2 сессии?