tcp可靠傳輸?shù)臋C(jī)制有哪些(面試必看)

一、綜述

1、確認(rèn)和重傳:接收方收到報(bào)文就會確認(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)的重組.這樣就會多做許多事情,而更嚴(yán)重的是,由于UDP的特性,當(dāng)某一片數(shù)據(jù)傳送中丟失時(shí),接收方便無法重組數(shù)據(jù)報(bào).將導(dǎo)致丟棄整個(gè)UDP數(shù)據(jù)報(bào).

  tcp會按MTU合理分片,接收方會緩存未按序到達(dá)的數(shù)據(jù),重新排序后再交給應(yīng)用層。

4、流量控制:當(dāng)接收方來不及處理發(fā)送方的數(shù)據(jù),能提示發(fā)送方降低發(fā)送的速率,防止包丟失。

5、擁塞控制:當(dāng)網(wǎng)絡(luò)擁塞時(shí),減少數(shù)據(jù)的發(fā)送。

二、滑動窗口

  上面籠統(tǒng)地說了tcp保證可靠傳輸?shù)臋C(jī)制,下面說說如何用滑動窗口來實(shí)現(xiàn)。

為什么要使用滑動窗口

因?yàn)榘l(fā)送端希望在收到確認(rèn)前,繼續(xù)發(fā)送其它報(bào)文段。比如說在收到0號報(bào)文的確認(rèn)前還發(fā)出了1-3號的報(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ā)送端就會開啟一個(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, 滑動窗口

好文要頂 關(guān)注我 收藏該文? ?

淺井光一

關(guān)注 - 4

粉絲 - 19

+加關(guān)注

1 0

? 上一篇:內(nèi)存管理

? 下一篇:線程的創(chuàng)建終止和生命周期

posted @ 2016-05-08 19:12 淺井光一 閱讀(5517) 評論(0) 編輯 收藏一、綜述

1、確認(rèn)和重傳:接收方收到報(bào)文就會確認(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)的重組.這樣就會多做許多事情,而更嚴(yán)重的是,由于UDP的特性,當(dāng)某一片數(shù)據(jù)傳送中丟失時(shí),接收方便無法重組數(shù)據(jù)報(bào).將導(dǎo)致丟棄整個(gè)UDP數(shù)據(jù)報(bào).

  tcp會按MTU合理分片,接收方會緩存未按序到達(dá)的數(shù)據(jù),重新排序后再交給應(yīng)用層。

4、流量控制:當(dāng)接收方來不及處理發(fā)送方的數(shù)據(jù),能提示發(fā)送方降低發(fā)送的速率,防止包丟失。

5、擁塞控制:當(dāng)網(wǎng)絡(luò)擁塞時(shí),減少數(shù)據(jù)的發(fā)送。

二、滑動窗口

  上面籠統(tǒng)地說了tcp保證可靠傳輸?shù)臋C(jī)制,下面說說如何用滑動窗口來實(shí)現(xiàn)。

為什么要使用滑動窗口

因?yàn)榘l(fā)送端希望在收到確認(rèn)前,繼續(xù)發(fā)送其它報(bào)文段。比如說在收到0號報(bào)文的確認(rèn)前還發(fā)出了1-3號的報(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ā)送端就會開啟一個(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重新開始。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容