創建TCP須要三次握手才能創建,而斷開鏈接則須要四次握手。整個過程以下圖所示:服務器
其中三次握手即創建鏈接網絡
四次揮手則爲關閉鏈接socket
TCP鏈接的11種狀態tcp
客戶端獨有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 。spa
服務器獨有的:(1)LISTEN (2)SYN_RCVD (3)CLOSE_WAIT (4)LAST_ACK 。.net
共有的:(1)CLOSED (2)ESTABLISHED 3d
創建鏈接時的狀態變遷blog
一開始,創建鏈接以前服務器和客戶端的狀態都爲CLOSED。服務器建立socket後開始監聽,變爲LISTEN狀態。客戶端請求創建鏈接,向服務器發送SYN報文,客戶端的狀態變爲SYN_SENT。服務器收到客戶端的報文後向客戶端發送ACK和SYN報文,此時服務器的狀態變爲SYN_RCVD。而後,客戶端收到ACK、SYN,就向服務器發送ACK,客戶端狀態變爲ESTABLISHED,服務器收到客戶端的ACK後也變爲ESTABLISHED。此時,3次握手完成,鏈接創建!請求
斷開鏈接時的狀態變遷im
因爲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丟包的時候,由於網絡傳輸有時會有意外。
內容出處:
(1)http://blog.csdn.net/whuslei/article/details/6667471
(2)http://blog.csdn.net/engrossment/article/details/8104482