TCP運輸管理分為三個階段
建立連接
數據傳送
斷開連接
TCP的建立連接過程是采用CS模式的,假設C是客戶端發起請求,S是服務端等待連接
S端的TCP進程被動的打開等待連接,C端的TCP進程主動打開,發送請求
首先S的TCP服務器進程先創建傳輸控制塊TCB,然后就處于LISTEN狀態;C的TCP客戶進程也創建傳輸控制塊TCB,然后向S發送請求。
SYN是TCP首部的碼元比特中的一個位,用來連接建立是的同步序號,ACK是在連接時的確認號,就是說沒有連接的時候ACK=0,當建立連接后所有的ACK=1;當SYN=1而ACK=0的時候表示是一個連接請求。
第一次握手:首先C發送請求報文,首部中的SYN=1,同時為自己選擇一個初始序號seq=x,SYN報文段不能攜帶數據,但是消耗一個序列號,TCP客戶進程進入SYN-SENT(同步已發送)狀態。
第二次握手:S收到請求后,如果同意建立連接,則向S發送確認,也就是響應報文,這個時候需要SYN=1,ACK=1,確認號是seq=x+1,同時也為自己選擇一個初始序號seq=y;這個報文也不攜帶數據,但是消耗一個序列號,TCP服務器進程進入SYN-RCVD(同步收到)狀態。
第三次握手:TCP客戶進程收到S的確認后,還要向S發送確認,確認報文段的ACK=1,確認號ack=y+1;而自己的確認號seq=x+1;這個報文段可以攜帶數據,但是如果不攜帶的話,下一個數據報的序號仍然是seq=x+1;這是TCP連接建立,C進入ESTABLISHED(已建立連接)狀態,同時在S收到A的確認后也進入ESTABLISHED(已建立連接)狀態。
為什么要采用三次握手而不是兩次?
如果C向S放松一個請求連接報文,如果這個請求報文在網絡中停滯了,所以超過了超時等待后,C會向S再次發送一個請求報文,假設當本次連接釋放后,停滯的請求到達了S,S則誤以為又是一次新的連接請求,于是發送一個響應,若不采用三次握手,而是兩次,這個時候S就認為已經建立了連接,但是C并沒有數據要發送,所以白白浪費了S的資源。