為什麼說TCP協議是可靠的?

2022-09-12 04:54:11 字數 2757 閱讀 4587

我們都知道 ip 協議是「不太靠譜」。因為 ip 協議是不可靠的,所以 ip 資料報可能在傳輸過程中發生錯誤或者丟失。這就意味著,tcp 協議不得不面對以下三個問題。1)每個資料報有可能傳送不成功 2)資料報在傳輸過程中有可能被丟棄 3)接收端有可能接受不到資料報

tcp 為了解決這丟包問題,提出兩個補救措施。

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

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

雖然採用 「ack 回覆」 + 「重新傳送機制」 方式能實現不丟包,但是會存在兩個問題。

1.效率低的問題。 stop-and-wait。stop-and-wait 雖然實現了 tcp 通訊的可靠性,但同時犧牲了網路通訊的效率。同時,在等待ack的時間段內,我們的網路都處於閒置(idle)狀態

2.有點小缺陷

tcp 為了進一步優化解決這兩個問題,提出滑動視窗(sliding window)的概念。滑動視窗被同時應用於接收方和傳送方, 傳送方和接收方各有乙個滑窗。當片段位於滑窗中時,表示 tcp 正在處理該片段。此外,如果滑窗中可以有多個片段,也就是可以同時處理多個片段。

我們借助一些來進一步了解下滑動視窗內部機制。

黃色框框表示可以容納三個片段的固定大小的滑窗。在圖中,並假設片段從左向右排列。實際運用中,滑動視窗是可變的,視窗大小是位元組(byte)來計算的。

對於傳送方來說,滑窗的左側為已傳送並已 ack 過的片段序列,滑窗右側是尚未傳送的片段序列。如果滑動視窗第乙個片段一直沒有收到 ack 回覆,視窗不會向右滑動。但是傳送方還是可以繼續傳送後面兩個片段資料報。

對於接受方來說,滑窗的左側是已經正確收到並 ack 回覆過的片段,也就是正確接收到的文字流。滑窗中的片段是期望接收的片段。如果滑窗中第乙個片段先收到, 滑窗會向右移動。如果滑窗中後面兩個片段先收到,但是第乙個片段沒有收到。視窗不會向右滑動。

傳送端已經傳送三個資料報(1、2、3),在等待每個資料報的 ack 回覆

接收端成功收到兩個資料報,回覆兩個 ack。還有乙個資料報沒有收到。當收到 資料報 1 時,接收端會回覆乙個 ack 1,然後將視窗向有滑動乙個位置。

傳送端成功接收到 ack 1 回覆

傳送端的視窗向右滑動乙個位置

在沒有收到 ack 2 和 3 的回覆,還能繼續傳送資料報 4

之前資料報 4 已經傳送了。在之後成功收到 ack 2 和 3 的回覆,視窗向右滑動兩個位置,現在又能繼續傳送資料報 5,6

通過上面一系列,我們可以大致知道滑動視窗的機制。我們來做下小總結:

對於傳送端

如果滑動視窗第乙個片段一直沒有收到 ack 回覆,視窗不會向右滑動。但是傳送方還是可以繼續傳送後面兩個片段資料報。

對於接受端

如果滑窗中第乙個片段先收到,滑窗會向右移動。如果滑窗中後面兩個片段先收到,但是第乙個片段沒有收到。視窗不會向右滑動

那麼實際應用中確實是這樣嗎?如果接收方每接受乙個片段,就回覆乙個 ack。這種效率有點低。所以實際應用中, tcp 協議為了減少了 ack 回覆所消耗的流量,採用的是累計 ack 回覆。 接收方往往利用乙個 ack 回覆來知會連續多個片段的成功接收。通過累計 ack,所需要的 ack 回覆通常可以降到 50%。

我們同樣通過的形式來了解累計 ack 回覆的原理。

在圖中,橙色為已經接收的片段。方框為滑窗,滑窗可容納3個片段。

情況1:滑窗還沒接收到片段 7 時,已接收到片段 8,9。這樣就在滑窗中製造了乙個「空穴」(hole)。

情況2:當滑窗最終接收到片段7時,滑窗送出乙個回覆號為 10 的 ack 回覆。傳送方收到該回覆,會意識到,片段 10 之前的片段已經按照次序被成功接收。整個過程中節約了片段 7 和片段 8 所需的兩個 ack 回覆。

為什麼說TCP協議是可靠的

由於ip 資料報的 mtu 有長度限制,tcp報文段過大時,需要切割。切割之後傳送出去,由於網路鏈路的不確定性,接收端接收到包的次序和傳送次序很大概率是不一致的。接收端如何把接收到的 同一批 tcp報文段資料拼接成預期的二進位制資料?傳送方傳送了乙個tcp報文,怎麼樣確認接收方接收到了這個報文?傳送...

TCP為什麼可靠 安全

tcp為什麼安全可靠 1 序列號與確認號 當傳送錯誤的時候,會發生 a 超時重傳機制 傳送方傳送的報文中含有序列號,每當傳送乙個報文後,就啟動乙個計時器 rto 該計時器的時間一般是有當前網路來決定的,乙個rtt指的是當乙個報文從傳送到接收到對應的ack標誌的時間,rto的決定一般是傳送方嘗試傳送幾...

為什麼說ip協議是無連線協議

面向無連線是通訊技術之一。是指通訊雙方不需要事先建立一條通訊線路,二是把每個帶有目的位址的包 報文分組 送到線路上,由系統自主選定路線進行傳輸。在發包之前,不需要建立與對端目標位址之間的連線。上層如果有傳送給ip的資料,該資料會立即被壓縮成ip包傳送出去。1 為了簡化 2 為了提速 面向連線與無連線...