linux網絡編程:三次握手與四次揮手

創建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

相關文章
相關標籤/搜索