TCP協議段格式:
?如圖,
端口號:
是其中一個重要的部分,知道端口號才能確認數據交給哪個應用程序(端口號屬于傳輸層的概念).
4位首部長度:4bit表示的范圍是0->15,在此處,單位是"4字節",因此,將這里的數值 * 4,才是真正的報頭長度,即TCP 報頭最大長度,60 字節.
TCP 報頭的前 20 個字節,是固定的.(TCP 報頭的最短長度,20 字節)選項部分,可以有,也可以沒有.可以有一個選項,也可以有多個選項.需要用首部長度,確認報頭到哪結束,載荷數據從哪開始.
保留(6位):
現在不用,先占個位置,以防后面需要用(目前 tcp 也這么多年,大概率是不用了)
其實也就是給未來留下了可以升級擴展的空間.
TCP特點:
有連接,可靠傳輸(內核實現的 可靠傳輸,寫代碼的時候,是感知不到的),面向字節流,全雙工
可靠傳輸實現機制
確認應答(保證"可靠性"最核心的機制)
在TCP的可靠傳輸機制中,“確認應答”(Acknowledgment)是一種用于確認數據的機制。發送方發送數據段給接收方后,接收方會發送一個特殊的確認應答段(ACK)來告知發送方已經成功接收到數據.
工作原理:
發送方發送數據段:發送方將數據分成一個或多個數據段,并通過TCP協議將這些數據段發送到接收方。
接收方接收數據段:接收方收到數據段后,會對數據進行校驗,檢查數據的完整性和是否有錯誤。
發送確認應答:如果數據段沒有錯誤,接收方會發送一個確認應答段(ACK),該段中包含了接收到的數據段的序列號,通知發送方數據已成功接收。
發送方處理確認應答:發送方收到確認應答后,會更新發送窗口的狀態,并根據接收方提供的確認應答信息進行相應處理,如確認成功發送的數據段、啟動定時器等。
超時重傳:如果發送方在指定的時間內未收到確認應答,它會認為該數據段丟失或損壞,觸發超時重傳機制。發送方會重新發送未收到確認應答的數據段,以確保數據的可靠傳輸。
后發先至
當連續發多條數據的時候,可能會出現"后發先至"的情況,即一個數據報,是先發的另一個是后發的后發的反而先到了(由于網絡的延遲、擁塞或丟包等原因,可能會導致部分數據段的順序被打亂,即后收到的數據段可能先到達接收方)
如何解決呢?
對數據進行編號
?
?確認序號的數值,就是收到的最后一個字節的編號再加一.
注意:TCP是面向字節流的,不是按照“條”為單位來傳輸.
?只要知道這一串字節的開始編號,以及數據的長度每個字節的編號自然也就知道了
只需要在 tcp 報頭中,把這-串字節第一個字節的編號,表示出來再結合報文長度,此時每個字節的編號就確定了
?ACK 為 0 表示這是一個普通的報文,此時只有 32 位序號是有效的.ACK為 1,表示這是一個應答報文,這個報文的 序號 和 確認序號 都是有效的
如此就有辦法能區分出,當前這個報文是普通報文,還是一個確認應答報文
超時重傳:
確認應答,是 TCP 保證可靠性的最核心機制
超時重傳,也是 TCP 可靠性機制的有效補充
丟包,在網絡上很可能出現,發一個數據, 然后丟了.
路由器/交換機 就是交通樞紐
結構復雜,傳輸的數據量也是不確定這一會傳輸的數據比較少過一會數據就很多了
如果設備太繁忙了,后面新來的數據等太久了就可能被丟棄了網絡負載越高,越繁忙就越容易丟包
丟包有兩種情況如圖:
?發送方無法區分哪種情況,既然無法區分,那就全都重傳
丟包本質上是一個“概率性”問題
假設丟包的概率是 10%,傳輸成功的概率是 90%
連續兩次傳輸,都丟包的概率是多少?
10%*10% =>1%
隨著你重傳次數的增加,總體能夠傳輸成功的概率,是更大的
是否會存在,連續重傳多次,仍然丟包呢?當然存在!! 如果當前的丟包概率已經極高了,達到 100%(比如網線斷了),不管咋傳,都是丟的
連接管理:
1.建立連接(三次握手)
2.斷開連接(四次握手)
握手: handshake,使用打招呼來觸發“特定場景
發一個打招呼的數據(這個數據并不會攜帶業務信息)
A和 B 完成建立連接的過程,就需要
文樣的打招呼的數據交互
?
?為什么要合并呢?封裝和分用
合并之后,節省了封裝和分用的過程降低了成本,提高了效率原則,能合并就合并
?六個標志位說明總結:
?
SYN(Synchronize):表示建立連接。在TCP的三次握手過程中,用于建立連接的第一個數據段會將SYN標志位設置為1。當接收方收到帶有SYN標志位的數據段時,它會發送一個帶有ACK和SYN標志位的確認應答段,用于確認連接并建立雙向通信。
ACK(Acknowledgment):表示確認。在TCP的確認應答中,ACK標志位用于確認成功接收到數據。它通常與其他標志位一起使用,如SYN、FIN等。
FIN(Finish):表示關閉連接。在TCP的四次握手過程中,用于關閉連接的數據段會將FIN標志位設置為1。當一方發送帶有FIN標志位的數據段時,它表示已經完成數據傳輸,請求關閉連接。另一方收到后會發送一個確認應答,并執行相應的關閉操作。
RST(Reset):表示連接復位。當TCP遇到一些異常情況時,如收到無效的數據段或遇到網絡故障,會發送帶有RST標志位的數據段來中斷連接。RST標志位可以用于快速中止連接,恢復到初始狀態。
PSH(Push):表示立即推送數據。當發送方設置PSH標志位時,接收方會盡快將數據交給應用程序處理,而不是等待緩存區填滿或等待延遲確認。
URG(Urgent):表示緊急數據。當發送方希望發送的數據段中有緊急數據要傳輸時,可以將URG標志位設置為1。接收方在收到含有URG標志位的數據段后,會盡快處理該數據,以便應用程序能夠及時處理。