nginxQuic: медленный ответ от сервера.

Roman Arutyunyan arut на nginx.com
Вс Июн 12 18:27:53 UTC 2022


Добрый день,

On Mon, May 30, 2022 at 04:27:54PM +0400, Roman Arutyunyan wrote:
> Добрый день,
> 
> Да, я видел. спасибо.
> 
> > On 30 May 2022, at 16:22, izorkin на gmail.com wrote:
> > 
> > Добрый день Роман.
> > 
> > Скинул ссылку с дампом на личную почту.
> > Вероятно, что могло попасть в спам, т.к. предыдущее письмо тоже осталось без ответа
> > 
> > 
> > -- 
> > С уважением,
> > Izorkin                          mailto:izorkin на gmail.com
> > 
> > _______________________________________________
> > nginx-ru mailing list -- nginx-ru на nginx.org
> > To unsubscribe send an email to nginx-ru-leave на nginx.org
> 
> ----
> Roman Arutyunyan
> arut на nginx.com

> _______________________________________________
> nginx-ru mailing list -- nginx-ru на nginx.org
> To unsubscribe send an email to nginx-ru-leave на nginx.org

Удалось выяснить следующее.  Имеет место проблема на стороне Хрома.  Если
точнее, в гугловой библиотоке QUICHE.  Проблемa триггерится комбинацией
EarlyData + HelloRetryRequest.  Если Хром отправил EarlyData, которую сервер
проигнорировал, то далее клиент не шлет новый ClientHello в ответ на
HelloRetryRequest т.к. зачем-то ждет подтверждения EarlyData.  В итоге
соединение зависает и таймаутится.

ClientHello ->
EarlyData   -> (ignore)
            <- HelloRetryRequest
(timeout)

Самый простой способ обойти проблему - избежать отправки HelloRetryRequest.
В рассматриваемом случае для этого достаточно было убрать из конфигурации
nginx директиву ssl_ecdh_curve.

Заткнуть это также можно и в QUICHE при помощи следующего патча:

diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc
index d2976006..ad5c4d3c 100644
--- a/quiche/quic/core/quic_session.cc
+++ b/quiche/quic/core/quic_session.cc
@@ -2404,6 +2404,9 @@ bool QuicSession::RetransmitLostData() {
       return false;
     }
   }
+  if (connection()->encryption_level() == ENCRYPTION_ZERO_RTT) {
+    return true;
+  }
   while (!streams_with_pending_retransmission_.empty()) {
     if (!CanWriteStreamData()) {
       break;

----
Roman Arutyunyan
arut на nginx.com



Подробная информация о списке рассылки nginx-ru