計算機網(wǎng)絡(luò)中的帶寬稿黍、交換結(jié)點中的緩存和處理機等雀摘,都是網(wǎng)絡(luò)的資源玄柏。在某段時間,若對網(wǎng)絡(luò)中某一資源的需求超過了該資源所能提供的可用部分兔辅,網(wǎng)絡(luò)的性能就會變壞。這種情況就叫做擁塞击喂。
擁塞控制就是防止過多的數(shù)據(jù)注入網(wǎng)絡(luò)中维苔,這樣可以使網(wǎng)絡(luò)中的路由器或鏈路不致過載。和流量控制不同懂昂,擁塞控制是一個全局性的過程介时,而流量控制是點對點通信量的控制。
慢啟動算法與擁塞避免算法
擁塞避免算法的前提是:假定由于分組受到損壞引起的丟失是非常少的,因此分組丟失(發(fā)生超時和接收到重復(fù)的確認(rèn))就意味著在源主機和目的主機之間的某處網(wǎng)絡(luò)發(fā)生了擁塞
慢啟動算法為發(fā)送方的TCP增加了另一個窗口:擁塞窗口潮尝,記為cwnd榕吼。
與另一個網(wǎng)絡(luò)的主機建立TCP連接時,擁塞窗口被初始化為1個報文段(即另一端通告的報文段大小)勉失,每收到一個ACK羹蚣,擁塞窗口就增加一個報文段。
實現(xiàn)
為了防止cwnd增長過大引起網(wǎng)絡(luò)擁塞乱凿,還需設(shè)置一個慢開始門限ssthresh狀態(tài)變量顽素。
ssthresh 的用法如下:
- 當(dāng)cwnd < ssthresh時,使用慢開始算法徒蟆。
- 當(dāng)cwnd > ssthresh時胁出,改用擁塞避免算法。
- 當(dāng)cwnd = ssthresh時段审,慢啟動與擁塞避免算法任意全蝶。
無論是在慢開始階段還是在擁塞避免階段,只要發(fā)送方判斷網(wǎng)絡(luò)出現(xiàn)擁塞(其根據(jù)就是沒有收到確認(rèn)ACK寺枉,雖然沒有收到確認(rèn)可能是其他原因抑淫,但是因為無法判定,所以都當(dāng)做擁塞來處理)姥闪,就把慢開始門限設(shè)置為出現(xiàn)擁塞時的發(fā)送窗口大小的一半始苇。然后把擁塞窗口設(shè)置為1,執(zhí)行慢開始算法筐喳。
快速重傳算法
超時重傳是TCP協(xié)議保證數(shù)據(jù)可靠性的一個重要機制催式,其原理是在發(fā)送一個數(shù)據(jù)以后就開啟一個計時器。在一定時間內(nèi)如果沒有得到發(fā)送數(shù)據(jù)報的ACK報文避归,那么就重新發(fā)送數(shù)據(jù)荣月,直到發(fā)送成功為止。
這是數(shù)據(jù)包丟失的情況下給出的一種修補機制槐脏。一般來說喉童,重傳發(fā)生在超時之后,但是如果發(fā)送端接收到3個以上的重復(fù)ACK顿天,就應(yīng)該意識到堂氯,數(shù)據(jù)丟了,需要重新傳遞牌废。這個機制不需要等到重傳定時器溢出咽白,所以叫做快速重傳。
而快速重傳以后鸟缕,因為走的不是慢啟動而是擁塞避免算法晶框,所以這又叫做快速恢復(fù)算法排抬。
- 為什么需要收到3個以上的重復(fù)ACK,才會執(zhí)行快速重傳授段?
在沒有快速重傳和快速恢復(fù)的算法之前蹲蒲,重傳依靠發(fā)送方的retransmit timeout,就在timeout內(nèi)如果沒有接收到對方的ACK侵贵,默認(rèn)包丟失届搁,發(fā)送方就重傳。
包丟失的原因:
- 包 checksum 出錯
- 網(wǎng)絡(luò)擁塞
- 網(wǎng)絡(luò)斷窍育,包括路由重收斂卡睦。
但是無法判斷是 哪一種算法,于是采用最笨的方法漱抓,就是將自己的發(fā)送速率減半表锻,即cwnd/2,這樣的方法對2是有效的乞娄∷惭罚可以緩解網(wǎng)絡(luò)擁塞。
但是對于1來說补胚,丟包是因為偶爾出錯引起的码耐,一丟包就對半減速不合理追迟。于是有了快速重傳算法溶其,基于在反向還可以接收到ACK,可以認(rèn)為網(wǎng)絡(luò)并沒有斷敦间,否則也接收不到ACK瓶逃,如果在timeout時間內(nèi)沒有接收到>2的重復(fù)的 ACK,則大概率是亂序廓块。而如果收到3個或2個以上的duplicated ACK厢绝,則大概率是丟包。