Я пишу типа обратного прокси. Работает на ура. Но на самом серваке при $netstat -na, оно вываливает что есть 2 потока как Established и 8 Time_wait. Я не могу вдуплить какого у меня тут time_wait появляется. Вроде как только accept возвращает сокет, я сразу создаю поток, считываю с него и закрываю.
Может кто то подскажет почему time_wait появляются и отчего.
Заранее благодарен.
Вот куски кода :
...
///////////////////////////жду подключение/////////////////////////
Здравствуйте, alexora, Вы писали:
A>Может кто то подскажет почему time_wait появляются и отчего.
От того, что ты первый закрываешь соединение.
Плата за спокойствие.
Здравствуйте, clairbee, Вы писали:
C>Здравствуйте, alexora, Вы писали:
A>>Может кто то подскажет почему time_wait появляются и отчего. C>От того, что ты первый закрываешь соединение.
То что я кинул в первой месаги, то это старое было. Я чуть лоханулся
Вот самое последнее :
Тут я все правильно закрываю
////////////////////////////////
closesocket(my_sock); <- это закрывает клиента
closesocket(server_sock); <- это сокет
//////////////////////////////////
Здравствуйте, alexora, Вы писали:
A>Я пишу типа обратного прокси. Работает на ура. Но на самом серваке при $netstat -na, оно вываливает что есть 2 потока как Established и 8 Time_wait. Я не могу вдуплить какого у меня тут time_wait появляется. Вроде как только accept возвращает сокет, я сразу создаю поток, считываю с него и закрываю. A>Может кто то подскажет почему time_wait появляются и отчего.
Если я не сильно ошибаюсь, то система просто держит некоторое время дескриптор сокета со статусом TIME_WAIT. Сильно подозреваю, что это сделано, исходя из таких возможных соображений, как повышение общего быстродействие сокетной подсистемы (чтобы лишний раз не выполнять служебный код по выделению системных ресурсов, связанных с сокетом). Т.е. — так и должно быть... Если не ошибаюсь. В противном случае меня аргументированно поправят...
> Сильно подозреваю, что это сделано, исходя из таких возможных соображений, как повышение общего быстродействие сокетной подсистемы (чтобы лишний раз не выполнять служебный код по выделению системных ресурсов, связанных с сокетом). Т.е. — так и должно быть... Если не ошибаюсь. В противном случае меня аргументированно поправят...
Не совсем так. 2MSL (Maximum Segment Lifetime) система держит сокет в состоянии TIME_WAIT в целях безопасности.
Как происходит закрытие. Инициирующая закрытие сторона шлет FIN (A), после чего ждет ACK (A) на свой FIN (A) и так же ждет FIN (B) от peer'а. Peer получив FIN (A) отсылает ACK (A) на этот FIN (A), ждет close от application после чего шлет свой FIN (B) и дождавшись ACK (B) на свой FIN (B) спокойно уходит (происходит разрушение TCB структуры, то есть система полностью забывает про это соединение), так как он уверен, что другая сторона, получала от него и ACK (A) и FIN (B). Но вот у стороны инициировавшей закрытие, нет уверенности в том, что ее ACK (B) на FIN (B) peer'а дошел до peer'a (так как нет подтверждения на подтверждение, а если б оно было, то потом бы понадобилось подтверждение на подтверждение на подтверждение, и т.д., есть задачка, про два отряда, которые расположены за холмами и должны атаковать в одно время, для связи у них есть голуби, которые они шлют друг другу через холм, вопрос в том, сколько нужно послать голубей что б договориться об одновременной атаке). Поэтому, TCB переходит в состояние TIME_WAIT и ждет здесь 2MSL. Дело в том, что, если бы так не работал TCP, существовала бы вероятность, подхватить, не закрывшееся соединение, что может привести к некорректной дальнейшей работе.
А вообще про TIME_WAIT в этой группе так много писалось, что думаю этот вопрос можно выносить в разряд вопросов по C++, типа "Вот это да, i += ++i + i++;".
Резюме: RFC793, там все очень популярно, со схемами и пояснениями, думаю на много понятней, чем я здесь пытался объяснить.
Здравствуйте, Flamer, Вы писали:
F>Если я не сильно ошибаюсь, то система просто держит некоторое время дескриптор сокета со статусом TIME_WAIT. Сильно подозреваю, что это сделано, исходя из таких возможных соображений, как повышение общего быстродействие сокетной подсистемы (чтобы лишний раз не выполнять служебный код по выделению системных ресурсов, связанных с сокетом). Т.е. — так и должно быть... Если не ошибаюсь. В противном случае меня аргументированно поправят...
Хех,
из таких соображений она держит состояние CLOSED.
А TIME_WAIT, как я и говорил тут раньше, держит та сторона соединения, которая инициировала соединение.
Типа она послала FIN(+ACK) и ждет в ответ FIN и ACK, + еще немного ждет, чтобы ее подтверждение peer'ного FIN'а стопудово дошло.
Здравствуйте, alexora, Вы писали:
A>Там все нормально и вовремя закрывается.
Да!
A>А вот какого х... WAIT появляется пока никто не знает
Я знаю!
И уже не раз все сказали: __так и должно быть__!!!
Хочешь знать почему?
Прочти пост Sashko от 17.06 07:05 и/или RFC по TCP.