TCP TIME_WAIT состояние характерно для завершающей стадии соединения.

Рассмотрим пример:

  • FIN 1 => 2
  • ACK 1 <= 2
  • FIN 1 <= 2
  • ACK 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