TCP(傳輸控制協議詳解)詳解

TCP協議的特點

(1)TCP協議是面向連接的運輸層協議

在數據傳輸前必須建立連接,數據傳輸之後釋放連接。

(2)TCP提供可靠交付的服務

所謂可靠是指在傳輸過程中無重複,無丟失,無錯誤。但是同時會增加開銷。

(3)每一條連接都是點對點連接(一對一)

(4)面向字節流

所謂字節流指的是以傳輸過程中流入進程和流出進程的字節序列,雖然傳輸過程中是一個一個數據報,但這只是爲了方便傳輸,之後在目的端重新裝配。

(5)TCP提供全雙工通信

所謂全雙工是指一端既可以是客戶端,也可以是服務器。

在這裏插入圖片描述

   TCP頭部有20個固定字節,選項部分長度不定,最多40個字節。

(1)源端口和目的端口:各佔2個字節。端口是指傳輸層和應用層的服務端口。傳輸層的分用和複用就是通過端口實現的。

分用:在發送端,多個客戶端進程公用一個傳輸層。

複用:在接收端,傳輸層會根據端口號分配給不同的應用進程。

(2)序號字段:佔4個字節。範圍是0—2^32-1。因爲TCP是面向字節流,所以它爲每一個字節進行編號。

(3)確認號:佔4個字節,是期望收到下一個報文段的數據部分的第一個序號。

(4)數據偏移:佔4個字節。是指TCP報文段的數據開始的部分距TCP報文段起始部分的偏移量。

(5)保留字段:佔6個字節。

(6)標識符:

URG:當URG置1時,表示緊急指針有效,它告訴系統此報文段有緊急數據,應儘快傳送。

ACK:ACK置1,表示確認號字段纔有效。此外,TCP規定,建立連接後,傳輸的所有報文段的ACK都需要被置1.

PSH:當接收者收到PSH=1時,會立即把數據傳輸給應用程序,而不會等到緩衝區滿了,再做提交。

RST:RST=1,表示TCP連接出現了嚴重的問題,必須釋放重連。

SYN:建立連接的時候使用。

    當SYN=1,ACK=0時,表示爲請求連接。

    當SYN=1,ACK=1時,表示爲同意連接的請求應答。

FIN:FIN=1,表示請求釋放連接。

(7)窗口:佔2個字節,表示接受端的接收窗口的大小。用於實現流量控制。將接收端發送過去的窗口大小設置成發送端的發送窗口大小,從而控制了發送端的發送效率。

(8)校驗和:用於檢測發送過程中是否出現錯誤。

(9)緊急指針:用於標識緊急數據的尾部。

(10)選項字段:(需要掌握的幾個選項)MMS—最大報文長度,實際是報文段的最大數據長度。窗口擴大因子。時間戳選項。

TCP可靠傳輸技術

TCP提供的可靠傳輸而使用的方式是序號,確認號,超時重傳,滑動窗口等可靠傳輸機制。

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
開始的時候,客戶端和服務器端分別創建自己的傳輸控制塊(TCB),創建完後server進入Listen狀態,此時準備接受client發送的請求。

第一次握手:客戶端向服務器端發送連接請求。

                SYN=1,ACK=0表示請求連接。

                X表示本次字節流的初始序號。

                TCP規定:此時沒有數據傳輸,但是消耗一個序號。

第二次握手:服務器向客戶端發生應發響應。

                SYN=1,ACK=0表示同意連接的應答響應。

                Y表示本次字節流的初始序號。

                X+1表示希望收到的字節起始序號。

第三次握手:當客戶端收到連接同意的應答後,還要向服務端發送一個確認報文段,表示:服務端發來的連接同意應答已經成功收到。

                該報文段的頭部爲:ACK=1,seq=x+1,ack=y+1。 

客戶端發完這個報文段後便進入ESTABLISHED狀態,服務端收到這個應答後也進入ESTABLISHED狀態,此時連接的建立完成!

爲什麼連接只需要三次握手,而不是兩次握手?

當客戶端接收到應答響應是,就會進入estabished狀態,而服務器端只有收到客戶端的連接請求後纔會進入estabished狀態。

此時如果網絡擁塞,客戶端發送的連接請求遲遲到不了服務端,客戶端便超時重發請求,如果服務端正確接收並確認應答,雙方便開始通信,通信結束後釋放連接。此時,如果那個失效的連接請求抵達了服務端,由於只有兩次握手,服務端收到請求就會進入ESTABLISHED狀態,等待發送數據或主動發送數據。但此時的客戶端早已進入CLOSED狀態,服務端將會一直等待下去,這樣浪費服務端連接資源。

在這裏插入圖片描述
第一次揮手:A已經發送完數據,請求釋放連接,只發送報文頭,此時A進入FIN_WAIT狀態。

                FIN=1,表示釋放連接。

                seq=u,u-1表示確認的最後一個數據序號。

第二次揮手:B收到連接釋放請求之後,會告訴它A到B這個方向已經釋放。B向A發送應答響應,B進入CLOSE_WAIT狀態。

                ACK=1:除TCP連接請求報文段以外,TCP通信過程中所有數據報的ACK都爲1,表示應答。

                seq= v:v-1是B向A發送的最後一個字節的序號。

                ack=u+1表示希望收到從第u+1個字節開始的報文段,並且已經成功接收了前u個字節。

第三次揮手:當B向A發完所有數據後,向A發送連接釋放請求,請求頭:FIN=1,ACK=1,seq=w,ack=u+1。

                B便進入LAST-ACK狀態。

第四次揮手:A收到釋放請求後,向B發送確認應答,此時A進入TIME-WAIT狀態。

                該狀態會持續2MSL時間,若該時間段內沒有B的重發請求的話,就進入CLOSED狀態,撤銷TCB。當B收到確認應答後,也便進入CLOSED狀態,撤銷TCB。

原文鏈接:https://blog.csdn.net/weixin_41191846/article/details/79676110

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章