TCP協議-如何保證傳輸可靠性
轉自 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時確認首部的確認字段有效。進行確認時,確認字段值表示這個值之前的數據都已經按序到達了。而發送方如果收到了已發送的數據的確認報文,則繼續傳輸下一部分數據;而如果等待了一定時間還沒有收到確認報文就會啟動重傳機制。
第一種情況:數據包丟失。當數據發出後在一定的時間內未收到接收方的確認,發送方就會進行重傳(通常是在發出報文段後設定一個特定的時間間隔,到點了還沒有收到應答則進行重傳)。
第二種情況:確認包丟失。當接收方收到重復數據(通過序列號進行識別)的時就將其丟棄,重新發送ACK。
重傳時間的確定:報文段發出到確認中間有一個報文段的往返時間RTT,顯然超時重傳時間RTO會略大於這個RTT,TCP會根據網絡情況動態的計算RTT,即RTO是不斷變化的。在Linux中,超時以500ms為單位進行控制,每次判定超時重發的超時時間都是500ms的整數倍。其規律為:如果重發一次仍得不到應答,就等待2*500ms後再進行重傳,如果仍然得不到應答就等待4*500ms後重傳,依次類推,以指數形式遞增,重傳次數累計到一定次數後,TCP認為網絡或對端主機出現異常,就會強行關閉連接。
三次握手和四次揮手
(6)流量控制
接收端處理數據的速度是有限的,如果發送方發送數據的速度過快,導致接收端的緩沖區滿,而發送方繼續發送,就會造成丟包,繼而引起丟包重傳等一系列連鎖反應。 因此TCP支持根據接收端的處理能力,來決定發送端的發送速度,這個機制叫做流量控制。在TCP報文段首部中有一個16位窗口長度,當接收端接收到發送方的數據後,在應答報文ACK中就將自身緩沖區的剩余大小,放入16窗口大小中。這個大小隨數據傳輸情況而變,窗口越大,網絡吞吐量越高,而一旦接收方發現自身的緩沖區快滿了,就將窗口設置為更小的值通知發送方。如果緩沖區滿,就將窗口置為0,發送方收到後就不再發送數據,但是需要定期發送一個窗口探測數據段,使接收端把窗口大小告訴發送端。
其過程如下:
註意:窗口大小不受16位窗口大小限制,在TCP首部40字節選項中還包含一個窗口擴大因子M,實際窗口大小是窗口字段的值左移M位。
(7)擁塞控制
流量控制解決了兩臺主機之間因傳送速率而可能引起的丟包問題,在一方面保證了TCP數據傳送的可靠性。然而如果網絡非常擁堵,此時再發送數據就會加重網絡負擔,那麽發送的數據段很可能超過了最大生存時間也沒有到達接收方,就會產生丟包問題。
擁塞控制方法分為:慢開始、擁塞避免、快重傳和快恢復。
TCP協議-如何保證傳輸可靠性