1. 流量控制
我們都知道當網路上資料流量超過網路硬體負荷時就會出現網路擁塞,就是我們平常遇到的網路緩慢的現象。對應影響網路速度的原因主要有網路傳輸裝置的效能和傳輸的資料多少,網路傳輸裝置包含傳送接收主機、路由器、傳輸線路等。為了解決這個問題,tcp引入了流量控制,顧名思義,就是採用某種方法,控制收發端傳輸資料的速度,從而維持網路資料傳輸的平衡。針對收發主機的處理速度,tcp使用滑動視窗來控制資料流量,減輕網路壓力。
2. 滑動視窗
通過我們對tcp連線的建立和終止以及對tcp報文的學習,我們知道tcp連線是全雙工的,即可以雙向通訊。tcp報文段首部中主要有序列號、確認號、標誌字段、視窗等其他字段屬性,其中的視窗字段就是用來實現滑動視窗的。該欄位表示傳送該視窗字段資訊的通訊方為即將到來的資料預留的儲存空間大小,也就是它能接收的資料大小。另一方受到這個視窗值後,就會動態傳送資料。視窗字段長度為16個位元組,可以表示最大65535的值,即視窗最大為65535位元組。
tcp連線中有傳送方和接收方,傳送方會維護乙個傳送視窗,接收方會維護乙個接收視窗。
先來分析傳送視窗,視窗結構如下。
在傳送方一側會將要傳送的資料組成乙個佇列,依次傳送佇列裡的資料。佇列裡面的資料報含幾個部分,有已經傳送且已經確認的資料、已經傳送但未確認的資料、即將傳送的資料、現在還不能傳送的資料這四個部分,其中的數字標號是資料序列號。在通訊連線建立和每次傳遞資料時,收發兩方會交換各自視窗大小
,表面自己能接收的資料大小,一般以位元組為單位。上圖中提供的視窗即對方通告的視窗大小,可以看出為6個位元組,同時視窗的左邊界為3,表明在序列號3及之前的資料已經傳送並完成確認,則可以算出視窗的右邊界為9。同時我們可以知道有多少已經傳送但未收到確認的資料,總共有3個位元組,則傳送邊界為6,所以最後我們可知可用視窗,即馬上能傳送的資料序列號範圍為7-9。
隨著時間的推移,當我們收到已經傳送的資料的ack時,滑動視窗的左邊界就能右移,如果視窗大小未發生改變,那麼視窗的右邊界也會右移,相當於整個視窗右移。其中在視窗的變化過程中有三個運動狀態:
tcp報文的頭部中有兩個字段,乙個是ack確認號,乙個是window視窗值,在每次資料傳遞過程中,收發兩方都會傳遞這兩個字段,ack表示對方已對小於ack-1的報文進行確認,傳送方能夠以此動態調整視窗的左邊界,window視窗字段表示對方能接受的資料大小,傳送方能夠據此動態調整視窗的右邊界。這樣就形成了視窗的向前滑動,所以形象地稱之為滑動視窗。
當ack確認號增大,而視窗變小,即視窗的左右邊界靠攏,最後左右邊界相等,此時視窗大小為0,表示不能傳送資料,稱之為0視窗。出現0視窗時,當接收端可接受空間變大時,會給傳送端傳送乙個視窗更新ack,使得傳送端能夠繼續傳送資料。但我們知道我們並未對ack進行確認,那麼ack也有可能丟失。為了解決這個問題,傳送端一般會採用tcp持續計時器見隔一段時間對接收端視窗進行探測,要求接收端返回自己的視窗大小,傳送端隨時準備傳送資料。
接收方也會維護乙個視窗。儲存已經接收到的資料狀態。
相比傳送端維護的視窗,接收端維護的視窗就簡單很多了。只有已經接收並被確認,能接收資料的空間和不能接收的資料。當到達的資料序列號小於左邊界時,代表收到的是重複資料,因為這些資料已經被接收並已經被確認,接收端會選擇放棄這些資料。當收到的資料序列號大於右邊界時,代表該資料已超過了傳送端處理範圍,也會被拋棄。只有收到的資料序列號再左邊界和右邊界之間時,才會接收儲存,這樣視窗才會向前移動。
滑動視窗 TCP流量控制
問題 如果傳送端傳送的速度較快,接收端接收到資料後處理的速度較慢,而接收緩衝區的大小是固定的,就會丟失資料。tcp協議通過 滑動視窗 sliding window 機制解決這一問題。看下圖的通訊過程 1.傳送端發起連線,宣告最大段尺寸是 1460 初始序號是 0,視窗大小是 4k,表示 我的接收緩衝...
滑動視窗與流量控制 擁塞控制
每個tcp連線的兩端都維護一組視窗 傳送視窗結構 send window structure 和接收視窗結構 receive window structure tcp以位元組為單位維護其視窗結構。tcp頭部中的視窗大小字段相對ack號有乙個位元組的偏移量。傳送端計算其可用視窗,即它可以立即傳送的資料...
TCP滑動視窗與流量控制
tcp採用可變滑動視窗來實現流量控制。tcp連線的兩端互動作用,互相提供資料流的相關資訊,包括報文段序列號 ack號和視窗大小 即接收端的可用空間 傳送端根據這些資訊動態調節視窗大小來控制傳送,以達到流量控制的目的。每個tcp頭部的視窗大小字段表明接收端可用快取空間的大小,以位元組為單位。該字段長度...