1. 程式人生 > >TCP/IP學習筆記(11) --TCP互動資料流,成塊資料流

TCP/IP學習筆記(11) --TCP互動資料流,成塊資料流

目前建立在TCP協議上的網路協議特別多,有telnet,ssh,有ftp,有http等等。這些協議又可以根據資料吞吐量來大致分成兩大類:

(1)互動資料型別,例如telnet,ssh,這種型別的協議在大多數情況下只是做小流量的資料交換,比如說按一下鍵盤,回顯一些文字等等。

(2)資料成塊型別,例如ftp,這種型別的協議要求TCP能儘量的運載資料,把資料的吞吐量做到最大,並儘可能的提高效率。針對這兩種情況,TCP給出了兩種不同的策略來進行資料傳輸。

TCP的互動資料流

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

捎帶ACK的傳送方式

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

Nagle演算法

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

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

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

TCP的成塊資料流

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

傳輸資料時ACK的問題

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

滑動視窗

滑動視窗本質上是描述接受方的TCP資料報緩衝區大小的資料,傳送方根據這個資料來計算自己最多能傳送多長的資料。如果傳送方收到接受方的視窗大小為0的TCP資料報,那麼傳送方將停止傳送資料,等到接受方傳送視窗大小不為0的資料報的到來。

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

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

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

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

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

資料擁塞

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

擁塞視窗的原理很簡單,TCP傳送方首先發送一個數據報,然後等待對方的迴應,得到迴應後就把這個視窗的大小加倍,然後連續傳送兩個資料報,等到對方迴應以後,再把這個視窗加倍(先是2的指數倍,到一定程度後就變成線性增長,這就是所謂的慢啟動),傳送更多的資料報,直到出現超時錯誤,這樣,傳送端就瞭解到了通訊雙方的線路承載能力,也就確定了擁塞視窗的大小,傳送方就用這個擁塞視窗的大小發送資料。要觀察這個現象是非常容易的,我們一般在下載資料的時候,速度都是慢慢“衝起來的”。

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