概述
滑動(dòng)窗口實(shí)現(xiàn)了TCP流控制。首先明確滑動(dòng)窗口的范疇:TCP是雙工的協(xié)議,會(huì)話的雙方都可以同時(shí)接收和發(fā)送數(shù)據(jù)。TCP會(huì)話的雙方都各自維護(hù)一個(gè)發(fā)送窗口和一個(gè)接收窗口。各自的接收窗口大小取決于應(yīng)用、系統(tǒng)、硬件的限制(TCP傳輸速率不能大于應(yīng)用的數(shù)據(jù)處理速率)。各自的發(fā)送窗口則要求取決于對(duì)端通告的接收窗口,要求相同。滑動(dòng)窗口解決的是流量控制的的問題,就是如果接收端和發(fā)送端對(duì)數(shù)據(jù)包的處理速度不同,如何讓雙方達(dá)成一致。接收端的緩存?zhèn)鬏敂?shù)據(jù)給應(yīng)用層,但這個(gè)過程不一定是即時(shí)的,如果發(fā)送速度太快,會(huì)出現(xiàn)接收端數(shù)據(jù)overflow,流量控制解決的是這個(gè)問題。
窗口的概念
發(fā)送方的發(fā)送緩存內(nèi)的數(shù)據(jù)都可以被分為4類:1. 已發(fā)送,已收到ACK2. 已發(fā)送,未收到ACK3. 未發(fā)送,但允許發(fā)送4. 未發(fā)送,但不允許發(fā)送其中類型2和3都屬于發(fā)送窗口。接收方的緩存數(shù)據(jù)分為3類:1. 已接收2. 未接收但準(zhǔn)備接收3. 未接收而且不準(zhǔn)備接收其中類型2屬于接收窗口。窗口大小代表了設(shè)備一次能從對(duì)端處理多少數(shù)據(jù),之后再傳給應(yīng)用層。緩存?zhèn)鹘o應(yīng)用層的數(shù)據(jù)不能是亂序的,窗口機(jī)制保證了這一點(diǎn)。現(xiàn)實(shí)中,應(yīng)用層可能無法立刻從緩存中讀取數(shù)據(jù)。
滑動(dòng)機(jī)制
- 發(fā)送窗口只有收到發(fā)送窗口內(nèi)字節(jié)的ACK確認(rèn),才會(huì)移動(dòng)發(fā)送窗口的左邊界。
- 接收窗口只有在前面所有的段都確認(rèn)的情況下才會(huì)移動(dòng)左邊界。當(dāng)在前面還有字節(jié)未接收但收到后面字節(jié)的情況下,窗口不會(huì)移動(dòng),并不對(duì)后續(xù)字節(jié)確認(rèn)。以此確保對(duì)端會(huì)對(duì)這些數(shù)據(jù)重傳。
- 遵循快速重傳、累計(jì)確認(rèn)、選擇確認(rèn)等規(guī)則。
- 發(fā)送方發(fā)的window size = 8192;就是接收端最多發(fā)送8192字節(jié),這個(gè)8192一般就是發(fā)送方接收緩存的大小。
模擬動(dòng)畫
模擬特點(diǎn)
找到了一個(gè)模擬TCP窗口發(fā)送的動(dòng)畫的地址,稍微有缺陷:1. 丟包率如果設(shè)得太高,有時(shí)無論重發(fā)多少次都不能恢復(fù)正常 2. 窗口較大可為10,其實(shí)應(yīng)該為9明確發(fā)送端和接收端,發(fā)送A~S數(shù)據(jù)包,我們不會(huì)從頭到尾分析,因?yàn)檫^程比較長(zhǎng)。1. 簡(jiǎn)化了窗口大小,雙方窗口大小都一直是42. 設(shè)置一定的丟包率,否則沒什么值得分析的,包括sender發(fā)送的數(shù)據(jù)包和receiver回復(fù)的ACK包。3. 簡(jiǎn)化重傳機(jī)制,出現(xiàn)丟包則直接重傳,不等3個(gè)冗余ACK和超時(shí)。4. 既不是選擇重傳也不是退回N步,重傳的包是隨機(jī)的發(fā)