一、綜述
1、確認(rèn)和重傳:接收方收到報(bào)文就會(huì)確認(rèn),發(fā)送方發(fā)送一段時(shí)間后沒有收到確認(rèn)就重傳。
2、數(shù)據(jù)校驗(yàn)
3、數(shù)據(jù)合理分片和排序:
UDP:IP數(shù)據(jù)報(bào)大于1500字節(jié),大于MTU.這個(gè)時(shí)候發(fā)送方IP層就需要分片(fragmentation).把數(shù)據(jù)報(bào)分成若干片,使每一片都小于MTU.而接收方IP層則需要進(jìn)行數(shù)據(jù)報(bào)的重組.這樣就會(huì)多做許多事情,而更嚴(yán)重的是,由于UDP的特性,當(dāng)某一片數(shù)據(jù)傳送中丟失時(shí),接收方便無法重組數(shù)據(jù)報(bào).將導(dǎo)致丟棄整個(gè)UDP數(shù)據(jù)報(bào).
tcp會(huì)按MTU合理分片,接收方會(huì)緩存未按序到達(dá)的數(shù)據(jù),重新排序后再交給應(yīng)用層。
4、流量控制:當(dāng)接收方來不及處理發(fā)送方的數(shù)據(jù),能提示發(fā)送方降低發(fā)送的速率,防止包丟失。
5、擁塞控制:當(dāng)網(wǎng)絡(luò)擁塞時(shí),減少數(shù)據(jù)的發(fā)送。
二、滑動(dòng)窗口
上面籠統(tǒng)地說了tcp保證可靠傳輸?shù)臋C(jī)制,下面說說如何用滑動(dòng)窗口來實(shí)現(xiàn)。
為什么要使用滑動(dòng)窗口
因?yàn)榘l(fā)送端希望在收到確認(rèn)前,繼續(xù)發(fā)送其它報(bào)文段。比如說在收到0號(hào)報(bào)文的確認(rèn)前還發(fā)出了1-3號(hào)的報(bào)文,這樣提高了信道的利用率。但可以想想,0-4發(fā)出去后可能要重傳,所以需要一個(gè)緩沖區(qū)維護(hù)這些報(bào)文,所以就有了窗口。
RTT:往返時(shí)間。
窗口是什么
接收窗口:
“接收窗口”大小取決于應(yīng)用(比如說tomcat:8080端口的監(jiān)聽進(jìn)程)、系統(tǒng)、硬件的限制。圖中,接收窗口是31~50,大小為20。
在接收窗口中,黑色的表示已收到的數(shù)據(jù),白色的表示未收到的數(shù)據(jù)。
當(dāng)收到窗口左邊的數(shù)據(jù),如27,則丟棄,因?yàn)檫@部分已經(jīng)交付給主機(jī);
當(dāng)收到窗口左邊的數(shù)據(jù),如52,則丟棄,因?yàn)檫€沒輪到它;
當(dāng)收到已收到的窗口中的數(shù)據(jù),如32,丟棄;
當(dāng)收到未收到的窗口中的數(shù)據(jù),如35,緩存在窗口中。
發(fā)送窗口:
發(fā)送窗口的大小swnd=min(rwnd,cwnd)。rwnd是接收窗口,cwnd用于擁塞控制,暫時(shí)可以理解為swnd= rwnd =20。
圖中分為四個(gè)區(qū)段,其中P1到P3是發(fā)送窗口。
tips:發(fā)送窗口以字節(jié)為單位。為了方便畫圖,圖中展示得像以報(bào)文為單位一樣。但這不影響理解。
三、重傳和確認(rèn)
什么時(shí)候發(fā)確認(rèn):這是一個(gè)復(fù)雜的策略。我們這里先簡單地認(rèn)為每收到一個(gè)報(bào)文就發(fā)一個(gè)確認(rèn)。
怎么確認(rèn)(累計(jì)確認(rèn)):
情況1:發(fā)送ack=31(為什么這個(gè)也要發(fā),這個(gè)確認(rèn)可以用于后面的擁塞控制)
情況2:發(fā)送ack=34,并把接收窗口左邊緣設(shè)置成34,右邊緣設(shè)置成53
累計(jì)確認(rèn)的好處:情況1中ack=31比描述收到32和33簡單;壞處:可能要重傳已經(jīng)接收的數(shù)據(jù)。
發(fā)送方收到確認(rèn)時(shí)怎么處理:
情況1:收到ack=31,什么都不做,或者說繼續(xù)發(fā)送可用窗口中的內(nèi)容,如42~50
情況2:收到ack=34,發(fā)送窗口窗口的左邊緣設(shè)置成34,右邊緣設(shè)置成53
什么時(shí)候重傳:因?yàn)槊總€(gè)報(bào)文都有超時(shí)計(jì)數(shù)器,超時(shí)才重傳。超時(shí)重傳時(shí)間的選擇也是一個(gè)策略。
tcp緩存和窗口的關(guān)系:窗口是緩存的一部分。
發(fā)送緩存=發(fā)送窗口+ P3右邊的一部分
接收緩存=接收窗口+部分已確認(rèn)但主機(jī)還沒處理完的數(shù)據(jù)。
四、流量控制
一圖流,簡單來說就是接收方處理不過來的時(shí)候,就把窗口縮小,并把窗口值告訴發(fā)送端。
當(dāng)窗口值為0,而接受方把窗口值恢復(fù)(比如ACK=1,ack=601,rwnd=200),但確認(rèn)丟失,進(jìn)入相互等待的死鎖局面。所以如果窗口值為0,發(fā)送端就會(huì)開啟一個(gè)持續(xù)計(jì)數(shù)器,每個(gè)一段時(shí)間詢問一下接收方。
五、擁塞控制
swnd=min(rwnd,cwnd),cwnd就是擁塞窗口大小。
慢開始和擁塞避免
ssthresh:處理擁塞時(shí)參照的一個(gè)參數(shù)。例子中初始值為16,后來變?yōu)?2。
當(dāng)cwnd> ssthresh,cwnd以慢開始的方法指數(shù)增長;
當(dāng)cwnd< ssthresh,cwnd以擁塞避免的方法線性增長。
值得注意的幾個(gè)點(diǎn)
1上圖是cwnd隨傳輸輪次的變化,每過一個(gè)RTT就算一輪。
2超時(shí)就可以認(rèn)為是擁塞了
快重傳和快恢復(fù):上一個(gè)算法的加強(qiáng)版
快重傳:收到3個(gè)同樣的確認(rèn)就立刻重傳,不等到超時(shí);
快恢復(fù):cwnd不是從1重新開始。
標(biāo)簽: tcp, 滑動(dòng)窗口
好文要頂 關(guān)注我 收藏該文? ?
淺井光一
關(guān)注 - 4
粉絲 - 19
+加關(guān)注
1 0
? 上一篇:內(nèi)存管理
? 下一篇:線程的創(chuàng)建終止和生命周期
posted @ 2016-05-08 19:12 淺井光一 閱讀(5517) 評(píng)論(0) 編輯 收藏一、綜述
1、確認(rèn)和重傳:接收方收到報(bào)文就會(huì)確認(rèn),發(fā)送方發(fā)送一段時(shí)間后沒有收到確認(rèn)就重傳。
2、數(shù)據(jù)校驗(yàn)
3、數(shù)據(jù)合理分片和排序:
UDP:IP數(shù)據(jù)報(bào)大于1500字節(jié),大于MTU.這個(gè)時(shí)候發(fā)送方IP層就需要分片(fragmentation).把數(shù)據(jù)報(bào)分成若干片,使每一片都小于MTU.而接收方IP層則需要進(jìn)行數(shù)據(jù)報(bào)的重組.這樣就會(huì)多做許多事情,而更嚴(yán)重的是,由于UDP的特性,當(dāng)某一片數(shù)據(jù)傳送中丟失時(shí),接收方便無法重組數(shù)據(jù)報(bào).將導(dǎo)致丟棄整個(gè)UDP數(shù)據(jù)報(bào).
tcp會(huì)按MTU合理分片,接收方會(huì)緩存未按序到達(dá)的數(shù)據(jù),重新排序后再交給應(yīng)用層。
4、流量控制:當(dāng)接收方來不及處理發(fā)送方的數(shù)據(jù),能提示發(fā)送方降低發(fā)送的速率,防止包丟失。
5、擁塞控制:當(dāng)網(wǎng)絡(luò)擁塞時(shí),減少數(shù)據(jù)的發(fā)送。
二、滑動(dòng)窗口
上面籠統(tǒng)地說了tcp保證可靠傳輸?shù)臋C(jī)制,下面說說如何用滑動(dòng)窗口來實(shí)現(xiàn)。
為什么要使用滑動(dòng)窗口
因?yàn)榘l(fā)送端希望在收到確認(rèn)前,繼續(xù)發(fā)送其它報(bào)文段。比如說在收到0號(hào)報(bào)文的確認(rèn)前還發(fā)出了1-3號(hào)的報(bào)文,這樣提高了信道的利用率。但可以想想,0-4發(fā)出去后可能要重傳,所以需要一個(gè)緩沖區(qū)維護(hù)這些報(bào)文,所以就有了窗口。
RTT:往返時(shí)間。
窗口是什么
接收窗口:
“接收窗口”大小取決于應(yīng)用(比如說tomcat:8080端口的監(jiān)聽進(jìn)程)、系統(tǒng)、硬件的限制。圖中,接收窗口是31~50,大小為20。
在接收窗口中,黑色的表示已收到的數(shù)據(jù),白色的表示未收到的數(shù)據(jù)。
當(dāng)收到窗口左邊的數(shù)據(jù),如27,則丟棄,因?yàn)檫@部分已經(jīng)交付給主機(jī);
當(dāng)收到窗口左邊的數(shù)據(jù),如52,則丟棄,因?yàn)檫€沒輪到它;
當(dāng)收到已收到的窗口中的數(shù)據(jù),如32,丟棄;
當(dāng)收到未收到的窗口中的數(shù)據(jù),如35,緩存在窗口中。
發(fā)送窗口:
發(fā)送窗口的大小swnd=min(rwnd,cwnd)。rwnd是接收窗口,cwnd用于擁塞控制,暫時(shí)可以理解為swnd= rwnd =20。
圖中分為四個(gè)區(qū)段,其中P1到P3是發(fā)送窗口。
tips:發(fā)送窗口以字節(jié)為單位。為了方便畫圖,圖中展示得像以報(bào)文為單位一樣。但這不影響理解。
三、重傳和確認(rèn)
什么時(shí)候發(fā)確認(rèn):這是一個(gè)復(fù)雜的策略。我們這里先簡單地認(rèn)為每收到一個(gè)報(bào)文就發(fā)一個(gè)確認(rèn)。
怎么確認(rèn)(累計(jì)確認(rèn)):
情況1:發(fā)送ack=31(為什么這個(gè)也要發(fā),這個(gè)確認(rèn)可以用于后面的擁塞控制)
情況2:發(fā)送ack=34,并把接收窗口左邊緣設(shè)置成34,右邊緣設(shè)置成53
累計(jì)確認(rèn)的好處:情況1中ack=31比描述收到32和33簡單;壞處:可能要重傳已經(jīng)接收的數(shù)據(jù)。
發(fā)送方收到確認(rèn)時(shí)怎么處理:
情況1:收到ack=31,什么都不做,或者說繼續(xù)發(fā)送可用窗口中的內(nèi)容,如42~50
情況2:收到ack=34,發(fā)送窗口窗口的左邊緣設(shè)置成34,右邊緣設(shè)置成53
什么時(shí)候重傳:因?yàn)槊總€(gè)報(bào)文都有超時(shí)計(jì)數(shù)器,超時(shí)才重傳。超時(shí)重傳時(shí)間的選擇也是一個(gè)策略。
tcp緩存和窗口的關(guān)系:窗口是緩存的一部分。
發(fā)送緩存=發(fā)送窗口+ P3右邊的一部分
接收緩存=接收窗口+部分已確認(rèn)但主機(jī)還沒處理完的數(shù)據(jù)。
四、流量控制
一圖流,簡單來說就是接收方處理不過來的時(shí)候,就把窗口縮小,并把窗口值告訴發(fā)送端。
當(dāng)窗口值為0,而接受方把窗口值恢復(fù)(比如ACK=1,ack=601,rwnd=200),但確認(rèn)丟失,進(jìn)入相互等待的死鎖局面。所以如果窗口值為0,發(fā)送端就會(huì)開啟一個(gè)持續(xù)計(jì)數(shù)器,每個(gè)一段時(shí)間詢問一下接收方。
五、擁塞控制
swnd=min(rwnd,cwnd),cwnd就是擁塞窗口大小。
慢開始和擁塞避免
ssthresh:處理擁塞時(shí)參照的一個(gè)參數(shù)。例子中初始值為16,后來變?yōu)?2。
當(dāng)cwnd> ssthresh,cwnd以慢開始的方法指數(shù)增長;
當(dāng)cwnd< ssthresh,cwnd以擁塞避免的方法線性增長。
值得注意的幾個(gè)點(diǎn)
1上圖是cwnd隨傳輸輪次的變化,每過一個(gè)RTT就算一輪。
2超時(shí)就可以認(rèn)為是擁塞了
快重傳和快恢復(fù):上一個(gè)算法的加強(qiáng)版
快重傳:收到3個(gè)同樣的確認(rèn)就立刻重傳,不等到超時(shí);
快恢復(fù):cwnd不是從1重新開始。