1. 程式人生 > >為什麼會出現大量的time_wait狀態

為什麼會出現大量的time_wait狀態

TIME_WAIT狀態是什麼?

TIME_WAIT狀態是主動關閉TCP連線的一方(即先發起FIN包的一方),在傳送完最後一個ACK包後進入的狀態。系統需要在TIME_WAIT狀態下等待2MSL(maximum segment lifetime )後才能釋放連線(埠)。根據RFC 793 MSL是2分鐘,一般的TCP實現有30秒、1分鐘和2分鐘不等。

進入TIME_WAIT狀態等待2MSL主要有兩個目的:

一方面是主動關閉連線的一方在對方沒有收到最後一個ACK包時(這時對方還會重發FIN,收到兩個FIN的時間間隔一定小於2MSL)有時間可以重發ACK包;

另一方面處於TIME_WAIT的連線(IP和埠組合)不能重用,這樣可以保證被重新分配的socket不會受到之前殘留的延遲重發報文影響。

分析

        由於主動關閉TCP連線的一方才會進入TIME_WAIT狀態,一般情況伺服器端不會出現TIME_WAIT狀態,因為大多數情況都是客戶端主動發起連線並主動關閉連線。但是某些服務如pop/smtp、ftp卻是服務端收到客戶端的QUIT命令後主動關閉連線,這就造成這類伺服器上容易出現大量的TIME_WAIT狀態的連線,而且併發量越大處於此種狀態的連線越多。另外,對於被動關閉連線的服務在主動關閉客戶端非法請求或清理長時間不活動的連線時(這種情況很可能是客戶端程式忘記關閉連線)也會出現TIME_WAIT的狀態。

什麼情況下伺服器會進行主動關閉的情況?

1)短連線的方式。如http伺服器。

2)已經進入了瓶頸。即連線數已經達到了極限值。