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

一、綜述

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重新開始。

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

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

  • 21.1 引言 TCP提供可靠的運(yùn)輸層。它使用的方法之一就是確認(rèn)從另一端收到的數(shù)據(jù)。但數(shù)據(jù)和確認(rèn)都有可能會(huì)丟失。T...
    張芳濤閱讀 3,375評(píng)論 0 8
  • 20.1 引言 在第15章我們看到TFTP使用了停止等待協(xié)議。數(shù)據(jù)發(fā)送方在發(fā)送下一個(gè)數(shù)據(jù)塊之前需要等待接收對(duì)已發(fā)送...
    張芳濤閱讀 932評(píng)論 0 2
  • 傳輸層-TCP, TCP頭部結(jié)構(gòu) ,TCP序列號(hào)和確認(rèn)號(hào)詳解 TCP主要解決下面的三個(gè)問題 1.數(shù)據(jù)的可靠傳輸...
    抓兔子的貓閱讀 4,621評(píng)論 1 46
  • 六、TCP可靠傳輸?shù)膶?shí)現(xiàn) 首先介紹以字節(jié)為單位的滑動(dòng)窗口。為了講述可靠傳輸原理的方便,假定數(shù)據(jù)傳輸只在一個(gè)方向進(jìn)行...
    dmmy大印閱讀 2,174評(píng)論 0 1
  • 1.這篇文章不是本人原創(chuàng)的,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,340評(píng)論 6 174

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