農林漁牧網

您現在的位置是:首頁 > 農業

乾貨|三點帶你快速瞭解TCP協議的可靠性,乾貨滿滿

2022-03-02由 竹文科技 發表于 農業

資料包損壞是什麼意思

TCP 協議是 TCP/IP 協議棧中的傳輸層的協議,TCP協議又叫傳輸控制協議(Transport Control Protocal)。眾所周知,它是一個可靠協議。那它為什麼有可靠性呢?

乾貨|三點帶你快速瞭解TCP協議的可靠性,乾貨滿滿

一、什麼是可靠性

可靠性即能確保一個程序從其接收快取中讀出的資料流是無損壞,無間隔,非冗餘和按序的資料流;即位元組流與連線的另一方端系統傳送出的位元組流是完全相同的。

二、而在網路中要想實現無損壞、無間隔、非冗餘和按序這幾點,就要面對以下問題:

干擾

:網路的干擾可能是因為硬體故障導致資料包受到破壞, 也有可能是網路波動導致資料包的某些 bit 位產生了變化。

亂序

:傳送方連續先後傳送兩個資料包, 後傳送的資料包可能先到達接收方,如果接收方按接收順序處理資料包,這就會導致接收的資料包與傳送的資料包不一致。

丟包:

網路丟包是一個很常見的現象,造成的原因也多種多樣,比較常見的有:

①接收方由於快取溢位,導致無法再處理到來的資料包了,直接丟棄從而造成丟包

②網路擁塞導致資料包丟包

③資料包被檢測到損壞了,被接收方丟棄造成了丟包

冗餘

:傳送方可能因為某些原因重複傳送了同一個資料包,接收方要有能力處理這種冗餘資料包。

乾貨|三點帶你快速瞭解TCP協議的可靠性,乾貨滿滿

三、在tcp協議中是怎麼來解決這些干擾的呢?

1. tcp引入checksum,它能夠檢測資料包在傳輸過程中是否發生差錯

checksum 是一個 16bit 長的欄位,傳送方在計算 checksum 時會先將報文中的 Checksum 置零,然後基於整個報文(頭部 + 資料部分)計算出 checksum 。

接收方在收到報文後也會計算 checksum:

①如果計算結果符合期望值,說明資料包沒有受到干擾/損壞

②如果不符合期望,一般會直接丟棄該資料包

2. tcp協議為報文加上了序號,解決了亂序和冗餘

TCP 的報文結構上維護著一個 seq (Sequence Number ),如下圖的紅色區域所示:

乾貨|三點帶你快速瞭解TCP協議的可靠性,乾貨滿滿

TCP 的傳送端和接收端各自獨立維護一個 seq , seq 的初始值是在建立連線時初始化的(值是隨機的)。

有一個控制位 SYN 就是專門用來在傳送方和接收方同步 seq 的 (這裡的同步指的是讓對方知道自己的 seq 初始值是多少)。

建立連線後,傳送的每一個報文都會攜帶 seq。

接收方接收到多個報文後,可以基於 seq 對資料包進行升序排序,並且透過檢查 seq 的值,可以判斷接收的資料包之間是否有間隔。

除此之外,seq 使得 TCP 有能力處理重複資料包的問題(冪等),因為接收方可以根據 seq 判斷出該資料包是不是已經被接收了,這樣順帶還解決了資料冗餘的問題。

乾貨|三點帶你快速瞭解TCP協議的可靠性,乾貨滿滿

3. tcp採用了ACK回覆和重新發送機制來解決丟包問題

ACK回覆:在每收到一個正確的、符合次序的片段之後,就向傳送方(也就是連線的另一段)傳送一個特殊的 TCP 片段,用來知會(ACK,acknowledge)傳送方:我已經收到那個片段了。這個特殊的 TCP片段 叫做 ACK 回覆。如果一個片段序號為 L,對應ACK 回覆有回覆號 L+1,也就是接收方期待接收的下一個傳送片段的序號。

重新發送機制:如果傳送方在一定時間等待之後,還是沒有收到 ACK 回覆,那麼它推斷之前傳送的片段一定發生了異常。傳送方會重複傳送(retransmit)那個出現異常的片段,等待 ACK 回覆,如果還沒有收到,那麼再重複傳送原片段… 直到收到該片段對應的 ACK 回覆(回覆號為 L+1 的 ACK)。

tcp透過checksum、seq、ack等機制,達到了一個可靠性的基本要求,但是實際場景中比較複雜的,tcp針對在複雜網路環境中還有很多東西來實現可靠性,比如說滑動視窗、擁塞控制、路由選擇等,我們會在以後的文章中慢慢講到。