2010-09-17 72 views
8

我正在寫一個簡單的HTTP服務器並瞭解TIME_WAIT。在處理請求後,沉重環境中的真實Web服務器如何處理來自數千用戶的請求,而不會在TIME_WAIT中卡住所有套接字? (不要詢問保持活力 - 這對單個客戶有幫助,但對成千上萬的不同客戶來說是如此)。Web服務器如何避免TIME_WAIT?

我讀過,你試着讓客戶端先關閉,這樣所有的TIME_WAITs都會分散到所有的客戶端中,而不是集中在服務器上。

這是如何完成的?在某些時候,服務器必須調用close/closesocket。

回答

9

啓動主動關閉的對等體是進入TIME_WAIT的對等體。所以只要客戶端關閉連接,客戶端就會獲得TIME_WAIT而不是服務器。我進一步詳細瞭解一下in this blog posting

+0

那麼服務器只是在等待客戶端關閉?我想在某種程度上它會想超時並關閉連接本身。 – DougN 2010-09-17 21:26:46

+0

這讓我想到另一個問題:)你是否認爲一個真正的Web服務器(IIS/Apache?)只需在第5秒(?)秒的超時時間內調用套接字選擇 - 計算出應該足夠的時間讓客戶端斷開(並讓選擇返回一個錯誤套接字)? – DougN 2010-09-17 21:33:17

+3

如果您重置連接而不是關閉連接,那麼您也不會以TIME_WAIT結束。所以如果你想爲閒置連接增加一個超時時間,你可以先關閉他們,然後再發出關閉。這會發送一個RST,你不會在TIME_WAIT結束。 – 2010-09-18 06:53:42

相關問題