前言
假設,接收方有足夠的緩存空間,接收方的接收窗口大小很大;也就是說接收方對數據來者不拒;
在上述的這種情況下,如果發送方發送的數據,接收方沒有收到,那麼就可以認爲網絡出現了擁塞;
網絡爲什麼會發生擁塞
上圖所示的是一個典型的小型局域網,SW 表示交換機,R 表示路由器;
基於前言中的假設,如果 PC1 給主機 PC3 發送 TCP 報文的時候,出現了丟失,我們大抵上就可以猜測:PC1—SW1—R1—R2—PC3 這條網絡路徑,出現了擁塞;
爲什麼會出現這種情況呢?可能是:PC1 發送數據的速度太快了,導致了 SW1、R1、R2 忙不過來;
實際上,無論是交換機也好,路由器也好,他們轉發數據都是按照“存儲+轉發”的方式進行的,即接收到數據後先保存到自己的緩存,然後再挨個處理,發送到對應的接口。
所謂的 SW1、R1、R2 忙不過來,就是指這些設備的緩存有限,你發送太快,我沒地方進行緩存,導致的結果就是將數據丟棄;
如何避免擁塞
從上圖中可以看到,路徑上的任意一個節點都有可能“忙不過來”,那麼發送方如何才能知道按照什麼樣的速度發送數據呢?
唯一的方法就是嘗試各種不同的發送速度。比如一開始以100kb/s 的速率發送數據,如果沒問題,再將速率提高到200kb/s,再沒問題繼續提升發送速率。一旦達到某個上限後,便開始出現丟包現象,發送方就可以認爲,網絡已經擁塞了,於是降低發送速率,減輕網絡負擔。
我們將上面這種探測網絡擁塞的方法稱爲擁塞控制。當然了,上面這種方法實在是太簡單了。
早在 1999 年,RFC 2581 就定義了四種擁塞控制算法:
- 慢啓動(slow-start)
- 擁塞避免(congestiono avoidance)
- 快重傳(fast retransmit)
- 快恢復(fast recovery)