TCP連線的狀態變遷
全部11種狀態 客戶端獨有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。 伺服器獨有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。 共有的:(1)CLOSED (2)ESTABLISHED 。  狀態變遷 1、建立連線時的狀態變遷 一開始,建立連線之前伺服器和客戶端的狀態都為CLOSED。伺服器建立socket後開始監聽,變為LISTEN狀態。客戶端請求建立連線,向伺服器傳送SYN報文,客戶端的狀態變為SYN_SENT。伺服器收到客戶端的報文後向客戶端傳送ACK和SYN報文,此時伺服器的狀態變為SYN_RCVD。然後,客戶端收到ACK、SYN,就向伺服器傳送ACK,客戶端狀態變為ESTABLISHED,伺服器收到客戶端的ACK後也變為ESTABLISHED。此時,3次握手完成,連線建立!  2、斷開連線時的狀態變遷 由於tcp連線是全雙工的,斷開連線會比建立連線麻煩一點點。客戶端先向伺服器傳送FIN報文,請求斷開連線,其狀態變為FIN_WAIT1。伺服器收到FIN後向客戶端發生ACK,伺服器狀態變為CLOSE_WAIT。客戶端收到ACK後就進入FIN_WAIT2狀態。此時連線已經斷開了一半了。如果伺服器還有資料要傳送給客戶端,就會繼續傳送。直到發完了,就傳送FIN報文,此時伺服器進入LAST_ACK狀態。客戶端收到伺服器的FIN後,馬上傳送ACK給伺服器,此時客戶端進入TIME_WAIT狀態,再過了2MSL長的時間後進入CLOSED狀態。伺服器收到客戶端的ACK就進入CLOSED狀態。  至此,還有一個狀態沒有提及:CLOSING狀態。CLOSING狀態表示客戶端發生了FIN,但沒有收到伺服器的ACK,卻收到了伺服器的FIN。這種情況發生在伺服器傳送的ACK丟包的時候,因為網路傳輸有時會有意外。