https затянувшиеся TIME_WAIT соединения
Со своего клиентского ПК я подключаюсь к веб-серверу, он использует только HTTPS.
Когда я подключаюсь, я вижу в TCPView (альтернативе netstat инструмента sysinternals) множество подключений TIME_WAIT к конечной точке https. Много времени я вижу 11 соединений, задерживающихся на 2 минуты в TIME_WAIT. И это каждый раз, когда я делаю запрос.
2-4 соединения остаются открытыми в УСТАНОВЛЕННО, пока я не установлю сервер Keep-Alive: timeout=xx
Последние соединения в порядке, и они используются соответствующим образом. Первые соединения накапливаются и занимают целых 2 минуты.
Я перехватил трафик с помощью WireShark и увидел обычную передачу FIN, ACK и т. Д. На исходных портах устаревшего соединения. Я часто видел, что Chrome и IE (оба используют стек HTTP Windows), передают 6 запросов TCP, прежде чем поступит любой запрос с реальными данными. Полезная нагрузка мала (около 2000 байт).
Firefox вообще не выдает эти запросы...
Также стоит упомянуть, что сертификат самоподписан и не проверяется в браузере (Firefox имеет совершенно другой способ справиться с этим, чем Chrome).
Почему мой браузер выдает эти запросы? Почему Firefox не выдает эти tcp-соединения?
РЕДАКТИРОВАТЬ, это дамп из первого подключения, которое делает Chrome (захваченный с Wireshark):
"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"
1 ответ
Это совершенно нормально.
Каждый новый запрос, который ваш браузер делает к веб-серверу, является соединением TCP, которое будет использовать новый сокет.
После квитирования, передачи данных и постепенного закрытия сокеты будут находиться в TIME_WAIT до истечения таймера ядра.
Таймер TIME_WAIT определяется в TCP RFC (RFC 793) как 2x Максимальное время жизни сегмента. MSL произвольно определяется как 2 минуты.
В зависимости от реализации TCP в операционной системе этот таймер может или не может быть соблюден. Например, старые BSD варьировались по TIME_WAIT от 1 минуты до 4 минут.
- http://tools.ietf.org/html/rfc793
- http://en.wikipedia.org/wiki/Transmission_Control_Protocol
- http://en.wikipedia.org/wiki/Maximum_Segment_Lifetime
- http://www.tcpipguide.com/free/t_TCPConnectionTermination-4.htm
- http://insidethenteworks.wordpress.com/2011/11/14/after-time-wait-state-why-tcp-waits-for-2-msl-time-instead-going-to-closed-state-immediatly/