Категории

понедельник, 30 января 2012 г.

Уменьшение количества соединений в состоянии TCP TIME_WAIT

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 секунд.
FreeBSD# echo "net.inet.tcp.msl=15000" >> /etc/sysctl.conf
FreeBSD# /etc/rc.d/sysctl start
В Linux немного сложнее, там msl спрятано в ядре в файле /net/tcp.h
#define TCP_TIMEWAIT_LEN (60*HZ)