1. 程式人生 > >TCP協議三次握手和四次分手以及資料傳輸過程

TCP協議三次握手和四次分手以及資料傳輸過程

 1、三次握手

     TCP是面向連線的,在面向連線的環境中,開始傳輸資料之前,在兩個終端之間必須先建立一個連線。建立連線同步的過錯稱為三次握手,具體過程如下:

(1)當主機A想同主機B建立連線,主機A會發送SYN給主機B,初始化序列號seq=x。主機A通過向主機B傳送SYS報文段,實現從主機A到主機B的序列號同步,即確定seq中的x。

(2)主機B接收到報文後,同意與A建立連線,會發送SYN、ACK給主機A。初始化序列號seq=y,確認序號ack=x+1。主機B向主機A傳送SYN報文的目的是實現從主機B到主機A的序列號同步,即確定seq中的y。

(3)主機A接收到主機B傳送過來的報文後,會發送ACK給主機B,確認序號ack=y+1,建立連線完成,傳輸資料。

2、傳輸過程 

     在建立連線後,TCP將以全雙工方式傳輸資料,在同一時間主機A與主機B之間可以同時進行TCP報文段傳輸,並對接收到的TCP報文進行確認。具體過程如下:

(1)假設主機A向主機B傳送1800位元組的資料,主機B向主機A傳送1000位元組的資料。

(2)主機A取seq=8001作為第一個位元組的編號(seq不一定從0開始,0-(2^32 - 1)之間的隨機數),由於資料長度是1800,位元組編號就是8001-9801。同理主機B編號是18001-19000。

(3)當對位元組編號後,TCP就給每個報文分配一個序號,該序號即這個報文中的第一個位元組的編號,在圖中主機A資料被拆分兩個報文段(主機A限定傳送有效值1000位元組,所以會分兩段傳送一個1000位元組,一個800位元組),因此第一段報文序號是seq=8001,第二段報文序號seq=9001。同理主機B一段報文傳送,序號是seq=18001。

(4)接收端接收到報文需要進行確認,TCP確認號被定義下一個希望接收到的位元組的編號,所以當主機B成功接收到主機A傳送的第二段報文時,發現報文的位元組編號9001-9800,所以主機B傳送給主機A確認序號ack=9801。同理主機A接收到主機B傳送的報文位元組編號是18001-19000,會給主機B傳送確認報文,確認序號ack=19001。

(5)報文傳輸完成,這裡主機A最後一次只發送一個ack,代表主機A已經沒有資料傳送給主機B了。為了提高TCP傳輸資料效率,接收端主機不會對傳送端主機發送的每一段報文都進行報文確認,而是當同時接收到多個報文後再發送確認報文ack。

3、四次分手 

(1)當主機A的應用程式通知TCP資料已經發送完畢時,TCP向主機B傳送一個帶有FIN附加標記的報文段,初始化序號seq=x。

(2)主機B收到這個FIN報文段,並不立即用FIN報文段回覆主機A,而是想主機A傳送一個確認序號ack=x+1,同時通知自己的應用程式,對方要求關閉連線(先發ack是防止主機A重複傳送FIN報文)。

(3)主機B傳送完ack確認報文後,主機B 的應用程式通知TCP我要關閉連線,TCP接到通知後會向主機A傳送一個帶有FIN附加標記的報文段,初始化序號seq=x,ack=x+1。

(4)主機A收到這個FIN報文段,向主機B傳送一個ack確認報文,ack=y+1,表示連線徹底釋放。