TCP的滑動窗口機制
TCP這個協議是網絡中使用的比較普遍,他是一個面向鏈接的可靠的傳輸協議。既然是一個可靠的傳輸協議就須要對數據進行確認。TCP協議裏窗口機制有2種:一種是固定的窗口大小;一種是滑動的窗口。這個窗口大小就是咱們一次傳輸幾個數據。對全部數據幀按順序賦予編號,發送方在發送過程當中始終保持着一個發送窗口,只有落在發送窗口內的幀才容許被髮送;同時接收方也維持着一個接收窗口,只有落在接收窗口內的幀才容許接收。這樣經過調整發送方窗口和接收方窗口的大小能夠實現流量控制。網絡
TCP滑動窗口技術經過動態改變窗口大小來調節兩臺主機間數據傳輸。每一個TCP/IP主機支持全雙工數據傳輸,所以TCP有兩個滑動窗口:一個用於接收數據,另外一個用於發送數據。TCP使用確定確認技術,其確認號指的是下一個所期待的字節。 假定發送方設備以每一次三個數據包的方式發送數據,也就是說,窗口大小爲3。發送方發送序列號爲一、二、3的三個數據包,接收方設備成功接收數據包,用序列號4確認。發送方設備收到確認,繼續以窗口大小3發送數據。當接收方設備要求下降或者增大網絡流量時,能夠對窗口大小進行減少或者增長,本例下降窗口大小爲2,每一次發送兩個數據包。當接收方設備要求窗口大小爲0,代表接收方已經接收了所有數據,或者接收方應用程序沒有時間讀取數據,要求暫停發送。發送方接收到攜帶窗口號爲0的確認,中止這一方向的數據傳輸。spa
咱們能夠看下面一張圖來分析一下固定窗口大小有什麼問題。
這裏咱們能夠看到假設窗口的大小是1,也是就每次只能發送一個數據只有接受方對這個數據進行確認了之後才能發送第2個數據。咱們能夠看到發送方每發送一個數據接受方就要給發送方一個ACK對這個數據進行確認。只有接受到了這個確認數據之後發送方纔能傳輸下個數據。 這樣咱們考慮一下若是說窗口太小,那麼當傳輸比較大的數據的時候須要不停的對數據進行確認,這個時候就會形成很大的延遲。若是說窗口的大小定義的過大。咱們假設發送方一次發送100個數據。可是接收方只能處理50個數據。這樣每次都會只對這50個數據進行確認。發送方下一次仍是發送100個數據,可是接受方仍是隻能處理50個數據。這樣就避免了沒必要要的數據來擁塞咱們的鏈路。因此咱們就引入了滑動窗口機制,窗口的大小並非固定的而是根據咱們之間的鏈路的帶寬的大小,這個時候鏈路是否擁護塞。接受方是否能處理這麼多數據了。
咱們看看滑動窗口是如何工做的。咱們看下面幾張圖。 3d
首先是第一次發送數據這個時候的窗口大小是根據鏈路帶寬的大小來決定的。咱們假設這個時候窗口的大小是3。這個時候接受方收到數據之後會對數據進行確認告訴發送方我下次但願手到的是數據是多少。這裏咱們看到接收方發送的ACK=3(這是發送方發送序列2的回答確認,下一次接收方指望接收到的是3序列信號)。這個時候發送方收到這個數據之後就知道我第一次發送的3個數據對方只收到了2個。就知道第3個數據對方沒有收到。下次在發送的時候就從第3個數據開始發。這個時候窗口大小就變成了2 。
code
這個時候發送方發送2個數據。 blog
看到接收方發送的ACK是5就表示他下一次但願收到的數據是5,發送方就知道我剛纔發送的2個數據對方收了這個時候開始發送第5個數據。
這就是滑動窗口的工做機制,當鏈路變好了或者變差了這個窗口還會發生變話,並非第一次協商好了之後就永遠不變了。
滑動窗口協議
滑動窗口協議,是TCP使用的一種流量控制方法。該協議容許發送方在中止並等待確認前能夠連續發送多個分組。因爲發送方沒必要每發一個分組就停下來等待確認,所以該協議能夠加速數據的傳輸。
只有在接收窗口向前滑動時(與此同時也發送了確認),發送窗口才有可能向前滑動。
收發兩端的窗口按照以上規律不斷地向前滑動,所以這種協議又稱爲滑動窗口協議。
當發送窗口和接收窗口的大小都等於1時,就是中止等待協議。class