http://9195095.blog.51cto.com/9185095/1774460
2016
一、TCP的鏈接建立(三次握手)
如下圖所示:假定最初兩端的TCP進程都處于關閉狀態(tài)。下圖中,client主動打開鏈接,server被動打開鏈接
創(chuàng)建過程:
①、server的TCP服務器進程先創(chuàng)建傳輸控制塊TCB(存儲了每一個鏈接中的重要信息),準備接受client進程的連接請求。然后服務器進程就處于LISTEN(收聽)狀態(tài),等待客戶的連接請求。如有,作出響應。
②、client的TCP客戶進程也是首先創(chuàng)建傳輸控制模塊TCB,然后向server發(fā)出連接請求報文段,這時首部中的同步位SYN =1,同時選擇一個初始序號 seq =1000,TCP規(guī)定,SYN報文段不能攜帶數據,但要消耗一個序號。這時,TCP客戶進程進入SYN-SENT(同步以發(fā)送)狀態(tài)。mss表示最大段尺寸,
如果一個段太大,封裝成幀后超過了鏈路層的最大幀長度,就必須在IP 層分片,為了避免這種情況,客戶端聲明自己的最大段尺寸,建議服務器端發(fā)來的段不要超過這個長度。
③、server收到連接請求報文段后,如同意建立連接,則向client發(fā)送確認。在確認報文段中應把SYN 為和ACK 位都置1,確認號是ack =1001,同時也為自己選擇一個初始序號seq=8000。這個報文段也不能攜帶數據,但同樣要消耗一個序號。這時TCP服務器進程進入SYN-RCVD(同步收到)狀態(tài)。
④、TCP客戶進程收到server的確認后,還要向server給出確認,確認報文段ACK 置1,確認號ack =8001,而自己序號為seq=1002,TCP的標準規(guī)定,ACK 報文段可以攜帶數據。但如果不攜帶數據則不消耗序號,這種情況下,下一個數據報文段的序號仍是seq =1002.這時,TCP連接已經建立,client進去ESTABLISHED(已建立連接)狀態(tài)。
⑤、當servers收到client的確認后,也進入ESTABLISHED狀態(tài)。
****************為什么client還要發(fā)送一次確認呢?主要是為了防止已失效的連接請求報文段突然又傳送到了server,因而產生錯誤。**********************
二、TCP的連接釋放(四次揮手)
如下圖所示:
釋放連接過程:
①、數據傳輸結束后,通信的雙方都可釋放連接?,F在client和server都處于ESTABLISHED狀態(tài)。client的應用進程先向其TCP發(fā)出連接釋放,并停止再發(fā)送數據,主動關閉TCP連接。client把連接釋放報文段首部的FIN置1,其序號 seq=1021,它等于前面已傳送過的數據的最后一個字節(jié)的序號加1.這是client進入FIN-WAIT-1(終止等待1)狀態(tài),等待server的確認。TCP規(guī)定,FIN報文段即使不攜帶數據,它也消耗一個序號。
②、server收到連接釋放報文段后即發(fā)出確認,確認號是ack=1022,然后server就進入CLOSE-WAIT(關閉等待)狀態(tài)。TCP服務器進程這時應通過高層應用進程,而從client到server這個方向的連接就釋放了,這時的TCP連接處于半關閉(half-close)狀態(tài),即client已經沒有數據要發(fā)送了,但server若發(fā)送數據,client仍要接收。也就是說server到client這個方向的連接并未關閉。
③、client收到來自server的確認后,就進入FIN-WAIT-2(終止等待2)狀態(tài),等待server發(fā)出的連接釋放報文段。若server已經沒有要向client發(fā)送的數據,其應用進程就通知TCP 釋放連接。這是B發(fā)出的連接釋放報文段必須使FIN=1 。現假定server的序號為8011.這是server就進入LAST-ACK(最后確認狀態(tài)),等待client的確認。
④、client在收到server的連接釋放報文段后,必須對此發(fā)出確認,在確認報文段中把ACK置1 ,序號為8012,然后進入到TIME-WAIT(時間等待)狀態(tài)。這時候TCP連接還沒有釋放掉。必須經過時間等待計時器設置的時間2MSL后,client才進入到CLOSE狀態(tài)。時間MSL叫做最長報文段壽命,建議設置為2分鐘。
⑤、server接收到了client發(fā)出的確認,就進入CLOSED狀態(tài)。
**************為什么client在TIME-WAIT狀態(tài)必須等待2MSL時間呢?**********
第一,為了保證client發(fā)送的最后一個ACK報文段能夠到達server。
第二,防止“已失效的連接請求報文段”出現在本連接中。
三、TCP有限狀態(tài)基
每個方框中的大寫英文字符串是TCP標準所使用的TCP連接狀態(tài)名。狀態(tài)之間的箭頭表示可能發(fā)生的狀態(tài)變遷。箭頭旁邊的字,表明引起這種變遷的原因,或表明發(fā)生狀態(tài)變遷后又出現什么動作。圖中三種不同的箭頭表示的意義不同,粗實箭頭表示對客戶進程的正常變遷,粗虛箭頭表示對服務器進程的正常變遷。另外一種細線箭頭表示異常變遷。
①、CLOSED 狀態(tài)時初始狀態(tài)。
②、LISTEN:被動打開,服務器端的 狀態(tài)變?yōu)長ISTEN(監(jiān)聽)
③、SYN-RECVD:服務器端收到SYN后,狀態(tài)為SYN;發(fā)送SYN ACK;
④、SYN_SENTY:應用程序發(fā)送SYN后,狀態(tài)為SYN_SENT;
⑤、ESTABLISHED:當連接已經建立,客戶端進入ESTABLISHED狀態(tài),服務器端收到客戶端的確認后,服務器端也進入ESTABLISHED狀態(tài)。
⑥、FIN_WAIT_1:應用程序端發(fā)送FIN,準備斷開TCP連接
⑦、CLOSE_WAIT:服務器端在收到FIN后,發(fā)送ACK,狀態(tài)為CLOSE_WAIT
⑧、FIN_WAIT_2:當客戶端收到來自服務器端的確認后,就進入FIN_WAIT_2.
⑨、LAST_ACK:當服務器端沒有要向客戶端發(fā)送的數據,其應用進程就通知TCP釋放連接。服務器端重復上次已發(fā)送過得確認號。這時服務器端就進入LAST_ACK狀態(tài)。
10、TIME_WAIT:客戶端收到服務器端的連接釋放報文段后,對此發(fā)出確認,然后客戶端就進入了TIME_WAIT狀態(tài)。