TCP 如何保證可靠性與實現高效性傳輸

1. 概念

tcp 是一種面向連接的、可靠的服務。

2. tcp 如何實現可靠性服務

2.1 檢驗和
2.2 序列號
2.3 確認應答

確認應答就是回覆 ack 應答。每當一個主機向另一個已建立連接的主機發送 tcp 報文時,響應主機就會回覆一個 ack 應答,告訴發送 tcp 報文的主機下一個該發送的報文的序列號。

2.4 超時重傳

主機 A 每開始給 主機 B 發送一個 tcp 報文,tcp 便爲其保留一個副本,並啓動一個定時器,開始計時,等待應答方回覆 ack 應答,若在定時器超時前數據未能被確認,tcp 就認爲報文段中的數據報已丟失或損壞,開始重新發送異常報文段。

2.5 流量控制
2.5.1 什麼是衝突

衝突:發送主機發送過快,接受主機來不及接收。

2.5.2 接收緩衝區

在 tcp 連接中,接收端留有一個接收緩衝區,發送主機根據這個接收端的緩衝區大小調節發送速率。如果發送主機發送過快,會導致接收端的緩衝區打滿,這時候如果發送端繼續發送,就會導致丟包。

2.5.3 衝突解決

接收端在確認應答時,每次將現在的接收端緩衝區的大小放到 tcp 首部中的【窗口大小】字段,通過 ack 應答通知發送端。

接收端一旦發現自己的緩衝區滿了,就會將接收窗口大小設置爲一個更小的值通知給發送端,發送端接收到這個窗口大小時,就會減慢自己的發送速度。

這時就會出現一種情況,如果接收端窗口變爲 0 了,發送端不再發送數據,待衝突緩解後,發送端是如何知道什麼時候開始發送數據呢?

其實發送端有一個定時器,當發送發收到接收窗口爲 0 的信息時,就停止發送報文,並且開啓一個定時器,每隔一段時間就發送一個探測報文去詢問對方是否可以發送數據,如果可以,接收方就告訴它接收窗口的大小,否則發送方就再次刷新定時器。

2.6 擁塞控制
2.6.1 tcp 慢啓動

tcp 引入了慢啓動,先發送少量的數據摸清楚當前的網絡擁堵狀況,再決定按照多大的速度傳達。

2.6.2 慢啓動過程

發送開始時,先將擁塞窗口的大小設爲 1,每次收到一個 ack 應答時,擁塞窗口加一,每次發送數據時,將擁塞窗口與接收端的反饋的窗口大小作比較,取其中較小值作爲發送窗口大小。

2.6.3 慢啓動算法

剛開始時候,發送方設置擁塞窗口爲 1,發送報文段,收到接收方的 ack 後,擁塞窗口變爲 2,接着繼續發送,每一次成功接收到 ack 應答,擁塞窗口大小就增加,其呈指數形式增長。但爲了防止擁塞窗口增長過快導致網絡阻塞,需要設置一個慢啓動門限,類似於一個閾值,用來調節擁塞窗口的大小。

  • 當擁塞窗口 < 慢啓動門限時,擁塞窗口大小指數增加
  • 當擁塞窗口 > 慢啓動門限時,擁塞窗口大小加法增大,線性增長
  • 當擁塞窗口增長到網絡擁塞時,擁塞窗口大小變爲 1,同時慢啓動門限會變爲原來的一半

3. tcp 如何提高性能

3.1 滑動窗口

主機 A 與 主機 B 建立 tcp 連接,發送主機 A 可以在沒有收到 接受主機回覆的 ack 的情況下,也可以連續的把發送窗口的數據發送出去,但是已經發送過的數據在還沒有收到接收方回覆的確認之前,還需要暫時保留,以便超時重傳使用,採用滑動窗口可以提高傳輸效率。

3.1.1 1比特滑動窗口協議(發送窗口 = 1,接收窗口 = 1)

相當於停等協議

3.1.2 回退 N 幀協議(發送窗口 > 1,接收窗口 > 1)

發送方在發完一個數據幀後,不停下來等待應答,而是連續發送若干個幀,且發送訪在每發送完一個數據幀時都要設定超時定時器,如果未在規定時間內接收到接收方返回的 ack 應答,就進行超時重傳,將發送出錯幀及其後的 N 幀。

3.1.3 選擇重傳協議(發送窗口 > 1,接收窗口 > 1)

在選擇重傳過程中,只發送出錯的那一幀。

3.2 快重傳
3.3 延遲應答
3.4 捎帶應答
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章