TCP TIME_WAIT состояние характерно для завершающей стадии соединения.
Рассмотрим пример:
FIN
1 => 2ACK
1 <= 2FIN
1 <= 2ACK
1 => 2
В первой строке хост 1 инициирует завершение соединение отправкой пакета с флагом FIN
.
Хост 2, получив такой пакет подтверждает его флагом ACK
, после чего в свою очередь отправляет хосту 1 свой пакет с флагом FIN
и закрывает соединение.
С момента получения этого пакета хостом 1, соединение переходит в состояние TIME_WAIT
.
Это время дается на случай, если последний ACK
не дойдет до хоста 2, тогда он снова отправит FIN
, на который хост 1 еще раз отошлет ACK
.
Соединение может еще долгое время находится в состоянии TIME_WAIT
, согласно RFC 1323 это время должно равнятся 2 минутам, двум msl
(Maximum Segment Lifetime).
MSL
- это время, в течение которого сегмент может путешествовать по сети (RFC рекомендует 60 секунд).
На загруженном сервере при таком значении msl
число соединений time_wait
расчет очень быстро, к тому же упомянутый RFC составлялся достаточно давно и пропускная способность каналов с тех пор возросла многократно,
поэтому многие уменьшают это значение.
Во FreeBSD есть переменная sysctl net.inet.tcp.msl
, по умолчанию равная 30 секундам.
Можно уменьшить его до 20 или даже 15 секунд.
echo "net.inet.tcp.msl=15000" >> /etc/sysctl.conf
/etc/rc.d/sysctl start
В Linux немного сложнее, там msl
спрятано в ядре в файле /net/tcp.h
#define TCP_TIMEWAIT_LEN (60*HZ)
Comments
comments powered by Disqus