參考:http://blog.chinaunix.net/uid-26275986-id-4109679.htmlhtml
繼續!TCP的流量控制和擁塞控制。算法
TCP相對UDP可靠的地方在於它的擁塞控制、流量控制。緩存
一.流量控制:網絡
若是發送方把數據發送得過快,接收方可能會來不及接收,這就會形成數據的丟失。所謂流量控制就是把發送方的發送速率不要太快,要讓接收方來得及接收。利用滑動窗口機制能夠很方便的在TCP鏈接上實現對發送方的流量控制。主要的方式就是返回ACK中會包含本身的接受窗口的大小,而且利用大小來控制發送方的數據發送。ui
滑動窗口協議:TCP是全雙工協議,發送方和接收方各自控制本身的緩衝區。發送放成功發送了數據,只有獲得接收方的確認以後,纔會移動滑動窗口離開已發送的數據;同時接收方則確認連續的數據分組,對於亂序的分組則先接收下來,避免網絡重複傳遞spa
中止等待協議:發送方和接收方都使用了大小爲1的滑動窗口。發送方一次發送一個分組,而後在發送下一個分組以前要先等待一個確認。它是面向鏈接的,提供流量控制和差錯控制。所須要的緩衝存儲空間最小,缺點是信道效率很低。在任什麼時候候信道中都只有一個分組和一個確認。流量控制是經過迫使發送方等待確認來實現,差錯控制是經過丟棄損壞的分組並讓發送方在計時器超市後重傳未確認的分組來實現。.net
返回N協議:爲了提升傳輸的效率,在發送方等待確認時應當有多個分組正在傳送中。也就是咱們應當讓多個分組處於等待確認的狀態,以便發送方在等待確認的同時,信道也能保持忙綠的狀態。GBN的關鍵是咱們在收到確認以前可以發送多個分組,但接收方只能緩存一個分組。發送方爲發送出去的分組保存副本直到確認到達。發送窗口必須小於2^m。(發送方不用等待接收方的應答,持續的發送多個幀,假如發現已發送的幀中有錯誤發生,那麼從那個發生錯誤的幀開始及其以後全部的幀所有再從新發送。)複雜度低,可是沒必要要的幀會再重發,因此大幅度範圍內使用的話效率是不高的。unix
流量控制htm
二.擁塞控制blog
網絡中的鏈路容量和交換結點中的緩存和處理機都有着工做的極限,當網絡的需求超過它們的工做極限時,就出現了擁塞。擁塞控制就是防止過多的數據注入到網絡中,這樣可使網絡中的路由器或鏈路不致過載。經常使用的方法就是:
1. 慢開始、擁塞控制
2. 快重傳、快恢復
一切的基礎仍是慢開始,這種方法的思路是這樣的:
-1. 發送方維持一個叫作「擁塞窗口」的變量,該變量和接收端口共同決定了發送者的發送窗口;
-2. 當主機開始發送數據時,避免一會兒將大量字節注入到網絡,形成或者增長擁塞,選擇發送一個1字節的試探報文;
-3. 當收到第一個字節的數據的確認後,就發送2個字節的報文;
-4. 若再次收到2個字節的確認,則發送4個字節,依次遞增2的指數級;
-5. 最後會達到一個提早預設的「慢開始門限」,好比24,即一次發送了24個分組,此時遵循下面的條件斷定:
*1. cwnd < ssthresh, 繼續使用慢開始算法;
*2. cwnd > ssthresh,中止使用慢開始算法,改用擁塞避免算法;
*3. cwnd = ssthresh,既可使用慢開始算法,也可使用擁塞避免算法;
-6. 所謂擁塞避免算法就是:每通過一個往返時間RTT就把發送方的擁塞窗口+1,即讓擁塞窗口緩慢地增大,按照線性規律增加;
-7. 當出現網絡擁塞,好比丟包時,將慢開始門限設爲原先的一半,而後將cwnd設爲1,執行慢開始算法(較低的起點,指數級增加);
上述方法的目的是在擁塞發生時循序減小主機發送到網絡中的分組數,使得發生擁塞的路由器有足夠的時間把隊列中積壓的分組處理完畢。慢開始和擁塞控制算法經常做爲一個總體使用,而快重傳和快恢復則是爲了減小由於擁塞致使的數據包丟失帶來的重傳時間,從而避免傳遞無用的數據到網絡。快重傳的機制是:
-1. 接收方創建這樣的機制,若是一個包丟失,則對後續的包繼續發送針對該包的重傳請求;
-2. 一旦發送方接收到三個同樣的確認,就知道該包以後出現了錯誤,馬上重傳該包;
-3. 此時發送方開始執行「快恢復」算法:
*1. 慢開始門限減半;
*2. cwnd設爲慢開始門限減半後的數值;
*3. 執行擁塞避免算法(高起點,線性增加);
QUIZ:
TCP鏈接創建後,是經過什麼保持的呢?
ANSWER:
網絡中接收和發送數據都是經過SOCKET實現的。可是若是套接字斷開,那發送數據和接收數據就必定會出現問題。如何判斷套接字是否可用呢?也就是如何保持長鏈接呢?TCP爲咱們設置了一個叫心跳的機制,若是設置了心跳,那麼TCP就會在必定的時間內發送你設置的次數的心跳,而且此信息不會影響協議,讓對方知道本身「還活着」,確保鏈接的有效性。
QUIZ:
什麼是長鏈接?什麼是短鏈接?
ANSWER:
長鏈接指在一個TCP鏈接上能夠連續發送多個數據包,在TCP鏈接保持期間,若是沒有數據包發送,須要雙方檢測包以維持此鏈接;短鏈接是指通訊雙方有數據交互時,就創建一個TCP鏈接,數據發送完成後,則斷開此TCP鏈接。長鏈接適用於操做頻繁,點對點通訊,且鏈接數不太多的狀況;短鏈接適用於銀行,由於它管理起來比較簡單,存在的鏈接都是合理的鏈接。