Назад | Перейти на главную страницу

https, существующие соединения (TIME_WAIT)

Со своего клиентского ПК я подключаюсь к веб-серверу, он использует только HTTPS.

Когда я подключаюсь, я вижу в TCPView (инструмент sysinternals, альтернативный netstat) множество подключений TIME_WAIT к конечной точке https. Часто я вижу 11 подключений, задерживающихся на 2 минуты в TIME_WAIT. И это каждый раз, когда я делаю просьбу. 2-4 соединения остаются открытыми в состоянии ESTABLISHED, пока я установил сервер Keep-Alive: timeout=xx

Последние соединения в порядке, и они повторно используются соответствующим образом. Прежние соединения устанавливаются и занимают полные 2 минуты.

Я захватил трафик с помощью WireShark и увидел нормальный проход FIN, ACK и т. Д. На исходных портах затяжного соединения. Я часто видел, что Chrome и IE (оба используют стек Windows HTTP) выдают 6 TCP-запросов до того, как появится какой-либо запрос с реальными данными. Полезная нагрузка небольшая (около 2000 байт).

Firefox вообще не выдает эти запросы ...

Также стоит упомянуть, что сертификат является самоподписанным и не проверяется в браузере (Firefox имеет совершенно другой способ справиться с этим, чем Chrome).

Почему мой браузер выдает эти запросы? Почему Firefox не выдает эти TCP-соединения?

ИЗМЕНИТЬ, это дамп из первого подключения Chrome (захвачено с помощью wirehark):

    "https","0.000000",local-ip,dest-ip,"443","TCP","53890 > https [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=8 SACK_PERM=1"
    "53890","0.012749",dest-ip,local-ip,"53890","TCP","https > 53890 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1400 WS=1 SACK_PERM=1"
    "https","0.012828",local-ip,dest-ip,"443","TCP","53890 > https [ACK] Seq=1 Ack=1 Win=65792 Len=0"
    "53890","0.025979",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1 Ack=222 Win=128578 Len=0"
    "53890","0.026099",dest-ip,local-ip,"53890","TLSv1.1","Server Hello, Certificate, Server Hello Done"
    "53890","0.038848",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1093 Ack=436 Win=128364 Len=0"
    "53890","0.040474",dest-ip,local-ip,"53890","TLSv1.1","Change Cipher Spec, Encrypted Handshake Message"
    "https","0.041191",local-ip,dest-ip,"443","TCP","53890 > https [FIN, ACK] Seq=436 Ack=1168 Win=64512 Len=0"
    "53890","0.053312",dest-ip,local-ip,"53890","TCP","https > 53890 [ACK] Seq=1168 Ack=437 Win=128364 Len=0"
    "53890","0.053313",dest-ip,local-ip,"53890","TCP","https > 53890 [FIN, PSH, ACK] Seq=1168 Ack=437 Win=128364 Len=0"
    "https","0.053345",local-ip,dest-ip,"443","TCP","53890 > https [ACK] Seq=437 Ack=1169 Win=64512 Len=0"

Это совершенно нормально.

Каждый новый запрос вашего браузера к веб-серверу представляет собой TCP-соединение, которое будет использовать новый сокет.

После установления связи, передачи данных и корректного закрытия сокеты будут находиться в состоянии TIME_WAIT, пока не истечет таймер ядра.

Таймер TIME_WAIT определен в TCP RFC (RFC 793) как удвоенное максимальное время жизни сегмента. MSL произвольно определяется как 2 минуты.

В зависимости от реализации TCP в операционной системе этот таймер может соблюдаться, а может и не соблюдаться. Например, старые BSD изменяли TIME_WAIT от 1 до 4 минут.