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