TCP滑動視窗

2021-05-25 13:49:15 字數 2144 閱讀 3514

目前建立在tcp協議上的網路協議特別多,有telnet,ssh,有ftp,有http等等。這些協議又可以根據資料吞吐量來大致分成兩大類:(1)互動資料型別,例如telet,ssh,這種型別的協議在大多數情況下只是做小流量的資料交換,比如說按一下鍵盤,回顯一些文字等等。(2)資料成塊型別,例如ftp,這種型別的協議要求tcp能盡量的運載資料,把資料的吞吐量做到最大,並盡可能的提高效率。針對這兩種情況,tcp給出了兩種不同的策略來進行資料傳輸。

對於互動性要求比較高的應用,tcp給出兩個策略來提高傳送效率和減低網路負擔:(1)捎帶ack。(2)nagle演算法(一次盡量多的發資料)。通常,在網路速度很快的情況下,比如用lo介面進行telnet通訊,當按下字母鍵並要求回顯的時候,客戶端和伺服器將經歷 傳送按鍵資料->伺服器傳送按鍵資料的ack -> 伺服器端傳送回顯資料->客戶端傳送回顯資料的ack的過程,而其中的資料流量將是40bit + 41bit+41bit+40bit = 162bit,如果在廣域網裡面,這種小分組的tcp流量將會造成很大的網路負擔。

1.1.捎帶ack的傳送方式

這個策略是說,當主機收到遠端主機的tcp資料報之後,通常不馬上傳送ack資料報,而是等上乙個短暫的時間,如果這段時間裡面主機還有傳送到遠端主機的tcp資料報,那麼就把這個ack資料報「捎帶」著傳送出去,把本來兩個tcp資料報整合成乙個傳送。一般的,這個時間是200ms。可以明顯地看到這個策略可以把tcp資料報的利用率提高很多。

1.2.nagle演算法

上過bbs的人應該都會有感受,就是在網路慢的時候發貼,有時鍵入一串字串以後,經過一段時間,客戶端「發瘋」一樣突然回顯出很多內容,就好像資料一下子傳過來了一樣,這就是nagle演算法的作用。

nagle演算法是說,當主機a給主機b傳送了乙個tcp資料報並進入等待主機b的ack資料報的狀態時,tcp的輸出緩衝區裡面只能有乙個tcp資料報,並且,這個資料報不斷地收集後來的資料,整合成乙個大的資料報,等到b主機的ack包一到,就把這些資料「一股腦」的傳送出去。雖然這樣的描述有些不準確,但還算形象和易於理解,我們同樣可以體會到這個策略對於低減網路負擔的好處。

在編寫插口程式的時候,可以通過tcp_nodelay來關閉這個演算法。並且,使用這個演算法看情況的,比如基於tcp的x視窗協議,如果處理滑鼠事件時還是用這個演算法,那麼「延遲」可就非常大了。

對於ftp這樣對於資料吞吐量有較高要求的要求,將總是希望每次盡量多的傳送資料到對方主機,就算是有點「延遲」也無所謂。tcp也提供了一整套的策略來支援這樣的需求。tcp協議中有16個bit表示「視窗」的大小,這是這些策略的核心。

2.1.傳輸資料時ack的問題

在解釋滑動視窗前,需要看看ack的應答策略,一般來說,傳送端傳送乙個tcp資料報,那麼接收端就應該傳送乙個ack資料報。但是事實上卻不是這樣,傳送端將會連續傳送資料盡量填滿接受方的緩衝區,而接受方對這些資料只要傳送乙個ack報文來回應就可以了,這就是ack的累積特性,這個特性大大減少了傳送端和接收端的負擔。

2.2.滑動視窗

滑動視窗本質上是描述接受方的tcp資料報緩衝區大小的資料,傳送方根據這個資料來計算自己最多能傳送多長的資料。如果傳送方收到接受方的視窗大小為0的tcp資料報,那麼傳送方將停止傳送資料,等到接受方傳送視窗大小不為0的資料報的到來。書中的p211和p212很好的解釋了這一點。

關於滑動視窗協議,書上還介紹了三個術語,分別是:

視窗合攏:當視窗從左邊向右邊靠近的時候,這種現象發生在資料被傳送和確認的時候。

視窗張開:當視窗的右邊沿向右邊移動的時候,這種現象發生在接受端處理了資料以後。

視窗收縮:當視窗的右邊沿向左邊移動的時候,這種現象不常發生。

tcp就是用這個視窗,慢慢的從資料的左邊移動到右邊,把處於視窗範圍內的資料傳送出去(但不用傳送所有,只是處於視窗內的資料可以傳送。)。這就是視窗的意義。圖20-6解釋了這一點。視窗的大小是可以通過socket來制定的,4096並不是最理想的視窗大小,而16384則可以使吞吐量大大的增加。

2.3.資料擁塞

上面的策略用於區域網內傳輸還可以,但是用在廣域網中就可能會出現問題,最大的問題就是當傳輸時出現了瓶頸(比如說一定要經過乙個slip低速鏈路)所產生的大量資料堵塞問題(擁塞),為了解決這個問題,tcp傳送方需要確認連線雙方的線路的資料最大吞吐量是多少。這,就是所謂的擁塞視窗。

以上就是tcp資料傳輸的大致流程,雖然並不細緻,但是足以描述tcp的工作原理,重點是tcp的流量控制原理,滑動視窗,擁塞視窗,ack累計確認等知識點。

原文:相關:

TCP滑動視窗

假設a和b之間新建立了一條tcp連線。裝置a需要傳送一長串資料流,但裝置b無法一次全部接收,所以它限制裝置a每次傳送分段指定數量的位元組數,直到分段中已傳送的位元組數得到確認。之後,裝置a可以繼續傳送更多位元組。每乙個裝置都對傳送,接收及確認資料進行追蹤。tcpbuffer中資料可以分為以下四類 1...

TCP滑動視窗

tcp滑動視窗是用來控制流量的,避免擁塞的發生。滑動視窗又包括接收端滑動視窗和傳送端滑動視窗,下面我們簡單分析一下。上圖顯示的是接收緩衝區,其中接收視窗也在其中。接收視窗的大小是8,即4 12,此時由a可知,接收端下乙個預計接收序列號4,當接收端接收到4 7之後,滑動視窗就會右移,此時接收端預計接收...

TCP 滑動視窗

push 慢啟動 隔乙個報文段確認 的策略實際就是因為 delayed ack,同時接收到兩個待確認的ack包時,就立即傳送確認包。滑動視窗例項 解決了快的傳送方 慢的接收方 隨後從接收方傳來另外兩個 ack,它們確認了最後的 4096位元組的資料 從4097到8192位元組 和fin 標號為819...