1. 程式人生 > >TCP協議-如何保證傳輸可靠性

TCP協議-如何保證傳輸可靠性

丟包 計算 .html inf 得到 管理 rto detail ash

轉自 https://blog.csdn.net/xuzhangze/article/details/80490362

TCP協議保證數據傳輸可靠性的方式主要有:

(1)檢驗和

在發送數據時,為了計算數據包的校驗和。應該按如下步驟:
(1)把校驗和字段置為0;
(2)把需要校驗的數據看成以16位為單位的數字組成,依次進行二進制反碼求和;
(3)把得到的結果存入校驗和字段中。
在接收數據時,計算數據報的校驗和相對簡單,按如下步驟:
(1)把首部看成以16位為單位的數字組成,依次進行二進制反碼求和,包括校驗和字段;
(2)檢查計算出的校驗和的結果是否等於零(反碼應為16個1);
(3)如果等於零,說明被整除,校驗是和正確。否則,校驗和就是錯誤的,協議棧要拋棄這個數據包。

所謂的二進制反碼求和,即為先進行二進制求和,然後對和取反。

(2)序列號

TCP將每個字節的數據都進行了編號,這就是序列號。
序列號的作用:
a、保證可靠性(當接收到的數據總少了某個序號的數據時,能馬上知道)
b、保證數據的按序到達
c、提高效率,可實現多次發送,一次確認
d、去除重復數據   
數據傳輸過程中的確認應答處理、重發控制以及重復控制等功能都可以通過序列號來實現
(3)確認應答機制(ACK)

  TCP通過確認應答機制實現可靠的數據傳輸。在TCP的首部中有一個標誌位——ACK,此標誌位表示確認號是否有效。接收方對於按序到達的數據會進行確認,當標誌位ACK=1時確認首部的確認字段有效。進行確認時,確認字段值表示這個值之前的數據都已經按序到達了。而發送方如果收到了已發送的數據的確認報文,則繼續傳輸下一部分數據;而如果等待了一定時間還沒有收到確認報文就會啟動重傳機制。

(4)超時重傳機制

  第一種情況:數據包丟失。當數據發出後在一定的時間內未收到接收方的確認,發送方就會進行重傳(通常是在發出報文段後設定一個特定的時間間隔,到點了還沒有收到應答則進行重傳)。

  第二種情況:確認包丟失。當接收方收到重復數據(通過序列號進行識別)的時就將其丟棄,重新發送ACK。

  重傳時間的確定:報文段發出到確認中間有一個報文段的往返時間RTT,顯然超時重傳時間RTO會略大於這個RTT,TCP會根據網絡情況動態的計算RTT,即RTO是不斷變化的。在Linux中,超時以500ms為單位進行控制,每次判定超時重發的超時時間都是500ms的整數倍。其規律為:如果重發一次仍得不到應答,就等待2*500ms後再進行重傳,如果仍然得不到應答就等待4*500ms後重傳,依次類推,以指數形式遞增,重傳次數累計到一定次數後,TCP認為網絡或對端主機出現異常,就會強行關閉連接。

(5)連接管理機制

  三次握手和四次揮手

(6)流量控制

  接收端處理數據的速度是有限的,如果發送方發送數據的速度過快,導致接收端的緩沖區滿,而發送方繼續發送,就會造成丟包,繼而引起丟包重傳等一系列連鎖反應。 因此TCP支持根據接收端的處理能力,來決定發送端的發送速度,這個機制叫做流量控制。在TCP報文段首部中有一個16位窗口長度,當接收端接收到發送方的數據後,在應答報文ACK中就將自身緩沖區的剩余大小,放入16窗口大小中。這個大小隨數據傳輸情況而變,窗口越大,網絡吞吐量越高,而一旦接收方發現自身的緩沖區快滿了,就將窗口設置為更小的值通知發送方。如果緩沖區滿,就將窗口置為0,發送方收到後就不再發送數據,但是需要定期發送一個窗口探測數據段,使接收端把窗口大小告訴發送端。

其過程如下:
技術分享圖片

註意:窗口大小不受16位窗口大小限制,在TCP首部40字節選項中還包含一個窗口擴大因子M,實際窗口大小是窗口字段的值左移M位。

(7)擁塞控制

  流量控制解決了兩臺主機之間因傳送速率而可能引起的丟包問題,在一方面保證了TCP數據傳送的可靠性。然而如果網絡非常擁堵,此時再發送數據就會加重網絡負擔,那麽發送的數據段很可能超過了最大生存時間也沒有到達接收方,就會產生丟包問題。

  擁塞控制方法分為:慢開始、擁塞避免、快重傳和快恢復。

TCP協議-如何保證傳輸可靠性