TCP 擁塞控制能夠提高網(wǎng)絡(luò)利用率,降低丟包率,并保證網(wǎng)絡(luò)資源對(duì)每條數(shù)據(jù)流的公平性。擁塞控制主要有幾種:慢啟動(dòng)、擁塞避免、快速重傳 以及快速恢復(fù)。
擁塞控制的最終受控變量是發(fā)送端向網(wǎng)絡(luò)一次連續(xù)寫入的數(shù)據(jù)量(即收到其中第一個(gè)數(shù)據(jù)的確認(rèn)應(yīng)答之前的所有數(shù)據(jù)),稱為發(fā)送窗口(send window,SWND)。但是發(fā)送端往往最終以 TCP 報(bào)文段來發(fā)送數(shù)據(jù),所以 SWND 限定了發(fā)送端能夠連續(xù)發(fā)送 TCP 報(bào)文段的數(shù)量。發(fā)送端應(yīng)該合理的選擇 SWND 的大小,若該值太小,會(huì)引起網(wǎng)絡(luò)延遲,若太大,則容易導(dǎo)致網(wǎng)絡(luò)擁塞。前面中我們知道,接收端可通過其接收通告窗口(RWND)來控制發(fā)送端的 SWND 大小,但是發(fā)送端應(yīng)該引入一個(gè)擁塞窗口(Congestion Window,CWND)的狀態(tài)量。實(shí)際的 SWND 值就是 RWND 和 CWND 中的較小者。
為了防止網(wǎng)絡(luò)擁塞,TCP 采用了一種慢啟動(dòng)算法,對(duì)發(fā)送數(shù)據(jù)量進(jìn)行控制。為了調(diào)節(jié)發(fā)送端的數(shù)據(jù)發(fā)送量,引入了擁塞窗口,在慢啟動(dòng)時(shí),將這個(gè)擁塞窗口設(shè)為 1 個(gè)報(bào)文段發(fā)送數(shù)據(jù),之后每收到一次確認(rèn)應(yīng)答,擁塞窗口的值就加 1 個(gè)報(bào)文段。在發(fā)送數(shù)據(jù)包時(shí),將擁塞窗口的大小與接收端主機(jī)通知的窗口大小進(jìn)行比較,然后選擇較小的值來控制數(shù)據(jù)量的發(fā)送。擁塞窗口是發(fā)送端使用的流量控制,而通告窗口則是接收端使用的流量控制。
慢啟動(dòng)算法步驟如下(cwnd全稱Congestion Window):
擁塞避免算法是讓擁塞窗口緩慢地增大,收到每一輪的確認(rèn)后,將擁塞窗口的值加1,而不是加倍,這樣擁塞窗口的值按照線性規(guī)律緩慢增長。在慢啟動(dòng)中,當(dāng)cwnd >= ssthresh時(shí),就會(huì)進(jìn)入“擁塞避免算法”。一般來說ssthresh的值是65535,單位是字節(jié),當(dāng)cwnd達(dá)到這個(gè)值時(shí)后,算法如下:
快重傳算法首先要求接收方每收到一個(gè)失序的報(bào)文段后就立即發(fā)出重復(fù)確認(rèn)(重復(fù)發(fā)送對(duì)前面有序部分的確認(rèn)),而不是等待自己發(fā)送數(shù)據(jù)時(shí)才進(jìn)行捎帶確認(rèn),也不是累積收到的報(bào)文發(fā)送累積確認(rèn),如果發(fā)送方連續(xù)收到三個(gè)重復(fù)確認(rèn),就應(yīng)該立即重傳對(duì)方未收到的報(bào)文段(有收到重復(fù)確認(rèn),說明后面的報(bào)文段都送達(dá)了,只有中間丟失的報(bào)文段沒送達(dá))。
快恢復(fù)算法與快重傳算法配合使用:
參考資料:
《TC/IP 詳解》
聯(lián)系客服