2010-09-17 3 views
8

Я пишу простой HTTP-сервер и узнаю о TIME_WAIT. Как реальные веб-серверы в тяжелых средах обрабатывают запросы от тысяч пользователей без того, что все сокеты застревают в TIME_WAIT после обработки запроса? (Не спрашивайте о keep-alive - это поможет одному клиенту, но не для тысяч разных клиентов).Как веб-серверу избежать TIME_WAIT?

Я прочитал, что вы пытаетесь закрыть клиент первым, чтобы все TIME_WAIT распространялись среди всех клиентов, а не концентрировались на сервере.

Как это делается? В какой-то момент сервер должен вызвать close/closesocket.

ответ

9

Параметр, который инициирует активное закрытие, является тем, который переходит в TIME_WAIT. До тех пор, пока клиент закрывает соединение, клиент получает TIME_WAIT, а не сервер. Я вхожу в это все чуть подробнее in this blog posting.

+0

Так сервер просто держится и ждет, когда клиент закроется? Я бы подумал, что в какой-то момент ему захочется тайм-аут и закрыть соединение. – DougN

+0

Что заставляет меня думать о другом вопросе :) Предположите ли вы, что настоящий веб-сервер (IIS/Apache?) Просто вызывает выбор в сокете с 5 (?) Вторым таймаутом - считая, что для клиента должно быть достаточно времени отключить (и позволить выбрать return с гнездом ошибки)? – DougN

+3

Если вы сбросите соединение, а не закрываете его, вы также не попадете в TIME_WAIT. Поэтому, если вы хотите добавить тайм-аут для незанятых подключений, вы должны закрыть их, сначала отключив задерживание, а затем выступив с закрытием. Это отправит RST, и вы не попадете в TIME_WAIT. –

Смежные вопросы