制與計(jì)算題突破:TCP/UDP協(xié)議期末考點(diǎn)全解析)
1. 傳輸層到底在整條網(wǎng)絡(luò)鏈路里扮演什么角色1.1 從寄快遞的類比說起為什么需要傳輸層很多同學(xué)學(xué)到第五章的時(shí)候會(huì)有一種割裂感——前面幾章講物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層好歹還能摸到網(wǎng)線、網(wǎng)卡、IP地址這些看得見摸得著的東西一到傳輸層突然全是端口號(hào)、確認(rèn)號(hào)、滑動(dòng)窗口、擁塞控制這些抽象概念感覺像在背天書。我當(dāng)初學(xué)這一章也是這個(gè)感覺后來自己畫了一張圖才想明白傳輸層其實(shí)就是端到端通信的“收發(fā)室”。打個(gè)比方。你們學(xué)校有個(gè)巨大的快遞集散中心網(wǎng)絡(luò)層負(fù)責(zé)的是“把包裹從A城市的集散中心送到B城市的集散中心”它只關(guān)心城市到城市這一級(jí)。但包裹到了B城市之后呢B城市集散中心里可能有幾千個(gè)學(xué)生每個(gè)人的宿舍樓、房間號(hào)都不一樣。傳輸層干的事情就是在集散中心內(nèi)部把包裹精準(zhǔn)地送到某一個(gè)具體的人手上。這里的“人”就是進(jìn)程“宿舍樓房間號(hào)”就是端口號(hào)。IP地址幫你找到哪臺(tái)主機(jī)端口號(hào)幫你找到主機(jī)上的哪個(gè)進(jìn)程。兩個(gè)合在一起才構(gòu)成一個(gè)完整的通信終點(diǎn)。所以傳輸層最核心的兩個(gè)關(guān)鍵詞就是進(jìn)程到進(jìn)程的通信和復(fù)用與分用。復(fù)用是指發(fā)送方多個(gè)進(jìn)程可以共用同一個(gè)傳輸層協(xié)議往外發(fā)數(shù)據(jù)分用是指接收方傳輸層要把收到的數(shù)據(jù)正確交付給對(duì)應(yīng)的進(jìn)程。這兩個(gè)詞期末考試必考而且經(jīng)常出簡(jiǎn)答題。1.2 傳輸層和網(wǎng)絡(luò)層的分工邊界在哪里這個(gè)問題很多同學(xué)容易搞混。我總結(jié)了一句話網(wǎng)絡(luò)層負(fù)責(zé)“主機(jī)到主機(jī)”傳輸層負(fù)責(zé)“進(jìn)程到進(jìn)程”。網(wǎng)絡(luò)層提供的是不可靠的、盡最大努力交付的服務(wù)。什么意思呢就是IP協(xié)議把數(shù)據(jù)包扔出去之后就不管了丟不丟、亂不亂序、有沒有重復(fù)它一概不負(fù)責(zé)??煽啃赃@件事網(wǎng)絡(luò)層壓根不承諾。那可靠性誰來保證兩種選擇要么傳輸層自己來做要么應(yīng)用層自己來做。TCP選擇了在傳輸層做UDP選擇了不做、交給應(yīng)用層。這就是TCP和UDP最本質(zhì)的分野。還有一個(gè)容易混淆的點(diǎn)網(wǎng)絡(luò)層也有復(fù)用與分用的概念。IP協(xié)議在發(fā)送方把多個(gè)上層協(xié)議的數(shù)據(jù)封裝成IP數(shù)據(jù)報(bào)復(fù)用在接收方根據(jù)IP首部中的協(xié)議字段把數(shù)據(jù)交給TCP或UDP分用。但傳輸層的復(fù)用與分用粒度更細(xì)它是基于端口號(hào)的面向的是進(jìn)程級(jí)別??荚?yán)锶绻麊枴熬W(wǎng)絡(luò)層和傳輸層復(fù)用分用的區(qū)別”你就答網(wǎng)絡(luò)層的復(fù)用分用是基于協(xié)議類型的傳輸層的復(fù)用分用是基于端口號(hào)的粒度不同、面向?qū)ο蟛煌?.3 本章在期末考試中的分值分布規(guī)律根據(jù)我翻過的多套期末試卷第五章傳輸層的分值占比通常在**20%到30%**之間屬于僅次于網(wǎng)絡(luò)層的第二大重點(diǎn)章節(jié)。題型分布大致是這樣的題型常見考點(diǎn)分值占比選擇題端口號(hào)范圍、TCP首部字段含義、UDP特點(diǎn)約30%填空題三次握手流程、擁塞控制算法名稱約15%簡(jiǎn)答題TCP與UDP對(duì)比、流量控制與擁塞控制區(qū)別約25%計(jì)算題滑動(dòng)窗口效率、擁塞窗口變化、往返時(shí)間估算約30%計(jì)算題是最容易拉開差距的地方。選擇題和簡(jiǎn)答題大家背一背都能拿分但計(jì)算題如果沒真正理解滑動(dòng)窗口和擁塞控制的機(jī)制考場(chǎng)上基本就是干瞪眼。所以下面我會(huì)花大量篇幅把計(jì)算題的套路講透。2. TCP協(xié)議的核心機(jī)制拆解2.1 TCP首部字段逐個(gè)拆解每個(gè)字段都是考點(diǎn)TCP首部固定部分是20字節(jié)加上可選項(xiàng)最多60字節(jié)。這20個(gè)字節(jié)里幾乎每一個(gè)字段都是考點(diǎn)我逐個(gè)給你拆。源端口和目的端口各占2字節(jié)加起來4字節(jié)。這個(gè)不用多說就是標(biāo)識(shí)發(fā)送方和接收方的進(jìn)程。**序號(hào)Sequence Number**占4字節(jié)。這個(gè)字段特別容易考。它的含義是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)。注意TCP是面向字節(jié)流的序號(hào)的單位是字節(jié)不是報(bào)文段。比如上一個(gè)報(bào)文段發(fā)送了100個(gè)字節(jié)序號(hào)從1到100那下一個(gè)報(bào)文段的序號(hào)就是101。這個(gè)點(diǎn)選擇題特別愛考經(jīng)常給你一個(gè)場(chǎng)景讓你算序號(hào)。**確認(rèn)號(hào)Acknowledgment Number**占4字節(jié)。它的含義是期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)的序號(hào)。注意“期望”兩個(gè)字。如果確認(rèn)號(hào)是N說明序號(hào)N-1之前的所有數(shù)據(jù)都收到了。這也是選擇題高頻考點(diǎn)。數(shù)據(jù)偏移占4位實(shí)際上就是首部長(zhǎng)度。單位是4字節(jié)所以如果這個(gè)字段的值是5首部長(zhǎng)度就是20字節(jié)。最大值是15對(duì)應(yīng)60字節(jié)首部。保留字段占6位目前置零。接下來是六個(gè)控制位這是重中之重URG緊急位置1時(shí)表示緊急指針字段有效告訴接收方有緊急數(shù)據(jù)需要優(yōu)先處理。ACK確認(rèn)位置1時(shí)確認(rèn)號(hào)字段才有效。TCP規(guī)定連接建立后所有報(bào)文段都必須把ACK置1。PSH推送位置1時(shí)接收方盡快交付給應(yīng)用進(jìn)程不用等緩存滿。RST復(fù)位位置1時(shí)表示TCP連接出現(xiàn)嚴(yán)重差錯(cuò)必須釋放連接再重新建立。SYN同步位置1時(shí)表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文。三次握手的關(guān)鍵。FIN終止位置1時(shí)表示發(fā)送方數(shù)據(jù)已發(fā)送完畢要求釋放連接。窗口字段占2字節(jié)告訴對(duì)方“我這邊還能接收多少字節(jié)的數(shù)據(jù)”。這個(gè)字段直接關(guān)聯(lián)流量控制后面會(huì)詳細(xì)講。檢驗(yàn)和占2字節(jié)檢驗(yàn)范圍包括首部和數(shù)據(jù)兩部分。緊急指針占2字節(jié)指出緊急數(shù)據(jù)的末尾在報(bào)文段中的位置。選項(xiàng)字段長(zhǎng)度可變最常用的就是MSS最大報(bào)文段長(zhǎng)度通常在SYN報(bào)文段中協(xié)商。記憶技巧六個(gè)控制位按順序記成“URG-ACK-PSH-RST-SYN-FIN”諧音“烏阿克普什日斯特辛芬”雖然拗口但多念幾遍就記住了??荚嚂r(shí)如果記不清順序就想想三次握手用SYN、四次揮手用FIN、確認(rèn)用ACK剩下的URG、PSH、RST各出現(xiàn)一次。2.2 三次握手為什么不是兩次也不是四次三次握手是傳輸層最經(jīng)典的考點(diǎn)沒有之一。幾乎每套試卷都會(huì)涉及要么考流程要么考為什么。先看流程客戶端發(fā)送SYN1seqx進(jìn)入SYN-SENT狀態(tài)。服務(wù)端收到后回復(fù)SYN1ACK1seqyackx1進(jìn)入SYN-RCVD狀態(tài)??蛻舳耸盏胶蟀l(fā)送ACK1seqx1acky1進(jìn)入ESTABLISHED狀態(tài)。服務(wù)端收到后也進(jìn)入ESTABLISHED狀態(tài)。為什么不是兩次核心原因防止已失效的連接請(qǐng)求報(bào)文段突然又傳到服務(wù)端導(dǎo)致服務(wù)端建立無效連接。設(shè)想一個(gè)場(chǎng)景客戶端發(fā)了一個(gè)連接請(qǐng)求但這個(gè)請(qǐng)求在網(wǎng)絡(luò)中滯留了很久??蛻舳说炔坏巾憫?yīng)就放棄了。后來這個(gè)滯留的請(qǐng)求終于到了服務(wù)端服務(wù)端以為是新請(qǐng)求就回復(fù)確認(rèn)并建立連接。如果是兩次握手服務(wù)端回復(fù)確認(rèn)后就認(rèn)為連接建立了會(huì)一直等客戶端發(fā)數(shù)據(jù)。但客戶端根本沒想建立連接服務(wù)端就白白浪費(fèi)了資源。三次握手的話客戶端收到服務(wù)端的確認(rèn)后不會(huì)發(fā)送第三次確認(rèn)服務(wù)端等不到確認(rèn)就不會(huì)真正建立連接。為什么不是四次因?yàn)槿我呀?jīng)夠了。服務(wù)端的SYN和ACK可以合在一個(gè)報(bào)文段里發(fā)送沒必要拆成兩次。所以三次是最小值。這里還有一個(gè)容易忽略的細(xì)節(jié)SYN報(bào)文段不攜帶數(shù)據(jù)但要消耗一個(gè)序號(hào)。所以第三次握手時(shí)客戶端的seq是x1ack是y1。這個(gè)“消耗一個(gè)序號(hào)”的點(diǎn)經(jīng)常在計(jì)算題里出現(xiàn)。2.3 四次揮手TIME-WAIT狀態(tài)為什么必須等2MSL四次揮手的流程客戶端發(fā)送FIN1sequ進(jìn)入FIN-WAIT-1狀態(tài)。服務(wù)端收到后回復(fù)ACK1seqvacku1進(jìn)入CLOSE-WAIT狀態(tài)。客戶端收到后進(jìn)入FIN-WAIT-2狀態(tài)。服務(wù)端數(shù)據(jù)發(fā)完后發(fā)送FIN1ACK1seqwacku1進(jìn)入LAST-ACK狀態(tài)??蛻舳耸盏胶蠡貜?fù)ACK1sequ1ackw1進(jìn)入TIME-WAIT狀態(tài)。等待2MSL后進(jìn)入CLOSED狀態(tài)。為什么客戶端最后要等2MSL兩個(gè)原因第一確保最后一個(gè)ACK能到達(dá)服務(wù)端。如果這個(gè)ACK丟了服務(wù)端會(huì)超時(shí)重傳FIN??蛻舳嗽?MSL內(nèi)還能收到這個(gè)重傳的FIN然后重新發(fā)送ACK。如果客戶端直接關(guān)閉了服務(wù)端就永遠(yuǎn)收不到確認(rèn)無法正常關(guān)閉。第二讓本連接中所有報(bào)文段都從網(wǎng)絡(luò)中消失。經(jīng)過2MSL后本次連接產(chǎn)生的所有報(bào)文段都已經(jīng)在網(wǎng)絡(luò)中消失了下一個(gè)新連接就不會(huì)收到舊連接的殘留報(bào)文段。MSL是“最長(zhǎng)報(bào)文段壽命”RFC建議是2分鐘但實(shí)際實(shí)現(xiàn)中通常更短。考試時(shí)如果問“為什么等2MSL”把上面兩點(diǎn)答上去基本滿分。還有一個(gè)細(xì)節(jié)為什么建立連接是三次握手釋放連接卻是四次揮手因?yàn)門CP是全雙工的每個(gè)方向都需要單獨(dú)關(guān)閉。服務(wù)端收到FIN后可能還有數(shù)據(jù)要發(fā)送所以ACK和FIN不能合并必須分開發(fā)。而建立連接時(shí)服務(wù)端的SYN和ACK可以合在一起所以只要三次。2.4 滑動(dòng)窗口機(jī)制流量控制的核心邏輯滑動(dòng)窗口是TCP最精妙的設(shè)計(jì)之一也是計(jì)算題的重災(zāi)區(qū)。我用一個(gè)具體例子來講。假設(shè)發(fā)送方A和接收方B建立了連接。B告訴A“我的接收窗口是400字節(jié)?!盇就把自己的發(fā)送窗口設(shè)為400字節(jié)。A的發(fā)送緩存里有一堆數(shù)據(jù)等著發(fā)序號(hào)從1開始。A可以連續(xù)發(fā)送序號(hào)1到400的數(shù)據(jù)不需要等確認(rèn)。這就是“滑動(dòng)窗口”的威力——批量發(fā)送流水線作業(yè)而不是發(fā)一個(gè)等一個(gè)確認(rèn)。假設(shè)A發(fā)了1-100、101-200、201-300三個(gè)報(bào)文段。B收到了1-100和201-300但101-200丟了。B會(huì)發(fā)送確認(rèn)號(hào)101表示“我期望收到101后面的都收到了但101沒到”。A收到這個(gè)確認(rèn)后知道1-100已經(jīng)確認(rèn)窗口可以往前滑100字節(jié)。但101-200沒確認(rèn)需要重傳。這里涉及一個(gè)關(guān)鍵概念累計(jì)確認(rèn)。B不需要對(duì)每個(gè)報(bào)文段單獨(dú)確認(rèn)只需要告訴A“我期望的下一個(gè)字節(jié)是N”就表示N之前的所有字節(jié)都收到了。這大大減少了確認(rèn)報(bào)文的數(shù)量。窗口滑動(dòng)的過程可以這樣理解發(fā)送窗口的左邊界由確認(rèn)號(hào)決定右邊界由確認(rèn)號(hào)加上接收方通告的窗口值決定。隨著確認(rèn)號(hào)不斷增大窗口不斷向右滑動(dòng)。還有一個(gè)概念叫零窗口。如果B的接收緩存滿了它會(huì)通告窗口為0。A收到后就不能再發(fā)送數(shù)據(jù)了。但A不能傻等因?yàn)槿绻鸅的窗口更新報(bào)文丟了雙方就死鎖了。所以TCP設(shè)計(jì)了持續(xù)計(jì)時(shí)器A收到零窗口通知后啟動(dòng)計(jì)時(shí)器時(shí)間到了就發(fā)送一個(gè)零窗口探測(cè)報(bào)文B收到后回復(fù)當(dāng)前的窗口值。如果窗口還是0A重置計(jì)時(shí)器繼續(xù)等。計(jì)算題常見套路給你發(fā)送窗口大小、已發(fā)送字節(jié)數(shù)、已確認(rèn)字節(jié)數(shù)讓你算還能發(fā)多少字節(jié)。記住公式還能發(fā)送的字節(jié)數(shù) 發(fā)送窗口大小 - (已發(fā)送但未確認(rèn)的字節(jié)數(shù))。2.5 擁塞控制四大算法慢開始、擁塞避免、快重傳、快恢復(fù)擁塞控制和流量控制經(jīng)常被混淆。一句話區(qū)分流量控制是端到端的解決的是接收方處理不過來的問題擁塞控制是全局的解決的是網(wǎng)絡(luò)中間設(shè)備處理不過來的問題。擁塞控制有四個(gè)核心算法考試必考。慢開始不要一上來就發(fā)大量數(shù)據(jù)先探測(cè)一下網(wǎng)絡(luò)狀況。初始擁塞窗口cwnd1單位是MSS。每收到一個(gè)確認(rèn)cwnd翻倍。所以cwnd的變化是1、2、4、8、16……指數(shù)增長(zhǎng)。注意“慢開始”不是說增長(zhǎng)慢而是說起步慢、探測(cè)保守。擁塞避免當(dāng)cwnd增長(zhǎng)到慢開始門限ssthresh時(shí)改用擁塞避免算法。每個(gè)往返時(shí)間RTT只把cwnd加1變成線性增長(zhǎng)。比如cwnd16時(shí)達(dá)到ssthresh之后每個(gè)RTT變成17、18、19……快重傳接收方收到失序報(bào)文段時(shí)立即發(fā)送重復(fù)確認(rèn)不要等自己發(fā)送數(shù)據(jù)時(shí)再捎帶確認(rèn)。發(fā)送方連續(xù)收到三個(gè)重復(fù)確認(rèn)就知道某個(gè)報(bào)文段丟了立即重傳不用等超時(shí)計(jì)時(shí)器到期??旎謴?fù)發(fā)送方收到三個(gè)重復(fù)確認(rèn)后把ssthresh設(shè)為當(dāng)前cwnd的一半然后把cwnd也設(shè)為這個(gè)值直接進(jìn)入擁塞避免階段。而不是像超時(shí)那樣把cwnd降回1。這里有一個(gè)關(guān)鍵區(qū)別超時(shí)重傳時(shí)cwnd降回1重新慢開始快重傳時(shí)cwnd降為ssthresh直接擁塞避免。這個(gè)區(qū)別幾乎每年都考。我用一個(gè)完整的例子串一遍假設(shè)初始cwnd1ssthresh16。RTT1cwnd1發(fā)送1個(gè)報(bào)文段RTT2cwnd2RTT3cwnd4RTT4cwnd8RTT5cwnd16達(dá)到ssthresh改用擁塞避免RTT6cwnd17RTT7cwnd18假設(shè)此時(shí)發(fā)生超時(shí)ssthresh設(shè)為18/29cwnd降回1重新慢開始cwnd1、2、4、8cwnd8時(shí)還沒到ssthresh9繼續(xù)翻倍到16不對(duì)慢開始階段cwnd達(dá)到ssthresh時(shí)就切換。所以cwnd8時(shí)下一個(gè)RTT變成16但16已經(jīng)超過ssthresh9了所以實(shí)際上cwnd8之后直接進(jìn)入擁塞避免變成9、10、11……這個(gè)計(jì)算過程一定要自己動(dòng)手畫一遍光看是記不住的。3. UDP協(xié)議與TCP的對(duì)比分析3.1 UDP首部只有8字節(jié)精簡(jiǎn)背后的設(shè)計(jì)哲學(xué)UDP首部只有4個(gè)字段每個(gè)2字節(jié)總共8字節(jié)源端口、目的端口、長(zhǎng)度、檢驗(yàn)和。就這么多沒了。對(duì)比TCP的20字節(jié)固定首部UDP精簡(jiǎn)到了極致。這種精簡(jiǎn)不是偷懶而是刻意為之。UDP的設(shè)計(jì)哲學(xué)是只做最基本的剩下的交給應(yīng)用層。UDP不建立連接所以不需要序號(hào)、確認(rèn)號(hào)、窗口這些字段。UDP不保證可靠交付所以不需要重傳機(jī)制相關(guān)的字段。UDP面向報(bào)文不面向字節(jié)流所以不需要處理粘包問題。檢驗(yàn)和字段是UDP唯一的安全網(wǎng)。它檢驗(yàn)首部和數(shù)據(jù)兩部分如果檢驗(yàn)出錯(cuò)就丟棄不通知發(fā)送方。發(fā)送方要不要重傳UDP不管那是應(yīng)用層的事??荚嚦朥DP檢驗(yàn)和的計(jì)算方法。記住兩點(diǎn)一是要加12字節(jié)的偽首部源IP、目的IP、零、協(xié)議號(hào)、UDP長(zhǎng)度二是檢驗(yàn)和的計(jì)算方法和IP首部檢驗(yàn)和一樣按16位進(jìn)行二進(jìn)制反碼求和。3.2 TCP和UDP的全面對(duì)比一張表說清楚對(duì)比維度TCPUDP連接方式面向連接無連接可靠性可靠交付盡最大努力交付數(shù)據(jù)傳輸單位字節(jié)流報(bào)文首部開銷20-60字節(jié)8字節(jié)流量控制有滑動(dòng)窗口無擁塞控制有無支持廣播/多播不支持支持應(yīng)用場(chǎng)景文件傳輸、網(wǎng)頁、郵件實(shí)時(shí)音視頻、DNS、DHCP這張表建議背下來。簡(jiǎn)答題如果問“TCP和UDP的區(qū)別”把這張表的內(nèi)容組織成語言答上去就行。但光背表格不夠還要理解為什么。比如為什么TCP不支持廣播因?yàn)門CP是面向連接的廣播意味著同時(shí)和多個(gè)接收方建立連接這在TCP的機(jī)制下無法實(shí)現(xiàn)。UDP無連接發(fā)出去就完事所以天然支持廣播和多播。再比如為什么實(shí)時(shí)音視頻用UDP因?yàn)閷?shí)時(shí)性要求高丟一兩幀畫面用戶可能察覺不到但如果用TCP丟包后要重傳、要等確認(rèn)延遲反而更大用戶體驗(yàn)更差。這就是“可靠性”和“實(shí)時(shí)性”的權(quán)衡。3.3 應(yīng)用層協(xié)議該選誰典型場(chǎng)景分析考試?yán)锝?jīng)常給一個(gè)場(chǎng)景讓你選TCP還是UDP并說明理由。我整理了幾個(gè)典型場(chǎng)景文件傳輸FTP、HTTP下載必須選TCP。文件一個(gè)字節(jié)都不能少丟了就得重傳可靠性優(yōu)先。網(wǎng)頁瀏覽HTTP選TCP。雖然網(wǎng)頁內(nèi)容丟一點(diǎn)可能也能看但HTTP協(xié)議本身建立在TCP之上這是協(xié)議棧的設(shè)計(jì)決定。域名解析DNS通常選UDP。DNS查詢報(bào)文很短一個(gè)UDP包就能裝下用TCP的話三次握手的時(shí)間開銷比查詢本身還大。但如果響應(yīng)報(bào)文超過512字節(jié)DNS會(huì)改用TCP。實(shí)時(shí)視頻會(huì)議選UDP。延遲敏感丟幾幀無所謂卡頓才是致命的。電子郵件SMTP選TCP。郵件內(nèi)容必須完整不能丟字。網(wǎng)絡(luò)管理SNMP選UDP。管理報(bào)文通常很短而且網(wǎng)絡(luò)設(shè)備可能資源有限跑不動(dòng)TCP。答題模板先判斷該場(chǎng)景對(duì)可靠性和實(shí)時(shí)性的要求如果可靠性優(yōu)先選TCP如果實(shí)時(shí)性優(yōu)先選UDP然后結(jié)合協(xié)議特點(diǎn)說明理由。4. 計(jì)算題專項(xiàng)突破與考場(chǎng)實(shí)戰(zhàn)技巧4.1 滑動(dòng)窗口效率計(jì)算從公式到實(shí)戰(zhàn)滑動(dòng)窗口的計(jì)算題通常長(zhǎng)這樣給你發(fā)送窗口大小、往返時(shí)間RTT、報(bào)文段長(zhǎng)度讓你算信道利用率或者最大吞吐量。核心公式信道利用率 發(fā)送窗口內(nèi)可發(fā)送的比特?cái)?shù) / (發(fā)送一窗數(shù)據(jù)所需時(shí)間 RTT)。更具體一點(diǎn)假設(shè)窗口大小為W個(gè)報(bào)文段每個(gè)報(bào)文段長(zhǎng)度為L(zhǎng)比特帶寬為B bpsRTT為T秒。發(fā)送一窗數(shù)據(jù)的時(shí)間是W×L/B等待確認(rèn)的時(shí)間是T。所以利用率 (W×L/B) / (W×L/B T)。如果W×L/B遠(yuǎn)大于T利用率接近1如果遠(yuǎn)小于T利用率就很低。這就是為什么窗口不能太小——窗口太小發(fā)送方大部分時(shí)間都在等確認(rèn)帶寬浪費(fèi)嚴(yán)重。還有一種考法給你窗口大小和RTT問需要多大的窗口才能跑滿帶寬。這就是把上面的公式反解W B×T/L。我見過一道題帶寬100MbpsRTT100ms報(bào)文段長(zhǎng)1000字節(jié)問窗口至少多大才能跑滿帶寬。計(jì)算過程B×T 100×10^6 × 0.1 10^7比特 10M比特。每個(gè)報(bào)文段1000字節(jié)8000比特。所以W 10^7 / 8000 1250個(gè)報(bào)文段。這個(gè)數(shù)字看起來很大但實(shí)際中TCP窗口可以通過窗口縮放選項(xiàng)擴(kuò)展到很大。4.2 擁塞窗口變化計(jì)算畫圖比死記更靠譜擁塞窗口的計(jì)算題我強(qiáng)烈建議在草稿紙上畫圖。橫軸是RTT縱軸是cwnd把每個(gè)RTT的cwnd值標(biāo)出來然后連線。圖形一畫出來答案就一目了然了。常見的考法給出初始ssthresh和cwnd描述一系列事件正常傳輸、超時(shí)、三個(gè)重復(fù)確認(rèn)讓你畫出cwnd的變化曲線或者問某個(gè)時(shí)刻的cwnd值。解題步驟確定初始狀態(tài)cwnd1ssthresh給定值。慢開始階段每個(gè)RTT翻倍直到cwnd≥ssthresh。擁塞避免階段每個(gè)RTT加1。遇到超時(shí)ssthreshcwnd/2cwnd1重新慢開始。遇到三個(gè)重復(fù)確認(rèn)ssthreshcwnd/2cwndssthresh直接擁塞避免。注意一個(gè)細(xì)節(jié)慢開始階段如果cwnd翻倍后超過了ssthresh實(shí)際cwnd應(yīng)該取ssthresh的值然后進(jìn)入擁塞避免。比如cwnd8ssthresh12下一個(gè)RTT慢開始翻倍應(yīng)該是16但1612所以cwnd12然后進(jìn)入擁塞避免變成13。4.3 三次握手序號(hào)計(jì)算別在細(xì)節(jié)上丟分三次握手的序號(hào)計(jì)算題看起來簡(jiǎn)單但細(xì)節(jié)特別多一不小心就丟分。關(guān)鍵點(diǎn)SYN和FIN各消耗一個(gè)序號(hào)。純ACK報(bào)文段如果不攜帶數(shù)據(jù)不消耗序號(hào)。數(shù)據(jù)報(bào)文段的序號(hào)從第一個(gè)數(shù)據(jù)字節(jié)開始算。舉個(gè)例子客戶端初始序號(hào)是1000發(fā)送SYN。服務(wù)端初始序號(hào)是2000回復(fù)SYNACK??蛻舳嗽侔l(fā)送ACK。問第三次握手的seq和ack分別是多少答案seq1001ack2001。因?yàn)镾YN消耗了一個(gè)序號(hào)所以客戶端的下一個(gè)序號(hào)是1001服務(wù)端的SYN也消耗了一個(gè)序號(hào)所以客戶端期望收到2001。如果客戶端在第三次握手時(shí)攜帶了100字節(jié)的數(shù)據(jù)呢那seq還是1001但發(fā)送完后下一個(gè)報(bào)文段的seq變成1101。ack仍然是2001。考場(chǎng)技巧遇到序號(hào)計(jì)算題先畫一個(gè)時(shí)間軸把每個(gè)報(bào)文段的seq和ack標(biāo)上去然后逐個(gè)推導(dǎo)。不要心算容易出錯(cuò)。4.4 傳輸層計(jì)算題速查表題型核心公式/方法易錯(cuò)點(diǎn)滑動(dòng)窗口效率利用率發(fā)送時(shí)間/(發(fā)送時(shí)間RTT)單位換算字節(jié)vs比特最大吞吐量吞吐量窗口大小/RTT窗口單位是字節(jié)還是報(bào)文段擁塞窗口變化慢開始翻倍擁塞避免加1超時(shí)和快重傳的處理不同三次握手序號(hào)SYN/FIN消耗序號(hào)純ACK不消耗數(shù)據(jù)報(bào)文段的序號(hào)計(jì)算UDP檢驗(yàn)和偽首部首部數(shù)據(jù)16位反碼求和偽首部的12字節(jié)別漏了5. 期末復(fù)習(xí)策略與常見失分點(diǎn)復(fù)盤5.1 高頻考點(diǎn)優(yōu)先級(jí)排序根據(jù)我分析過的試卷第五章的考點(diǎn)優(yōu)先級(jí)大致如下第一優(yōu)先級(jí)必考三次握手流程及原因、四次揮手流程及TIME-WAIT、TCP與UDP對(duì)比、擁塞控制四算法。第二優(yōu)先級(jí)高頻TCP首部字段含義、滑動(dòng)窗口機(jī)制、流量控制與擁塞控制的區(qū)別、端口號(hào)分類。第三優(yōu)先級(jí)偶爾考UDP檢驗(yàn)和計(jì)算、TCP連接管理狀態(tài)轉(zhuǎn)換、MSS協(xié)商。復(fù)習(xí)時(shí)間有限的話按這個(gè)優(yōu)先級(jí)分配精力。第一優(yōu)先級(jí)的內(nèi)容必須做到能默寫、能畫圖、能解釋為什么。第二優(yōu)先級(jí)要能用自己的話復(fù)述。第三優(yōu)先級(jí)混個(gè)眼熟就行。5.2 簡(jiǎn)答題答題模板簡(jiǎn)答題最怕的是“知道意思但寫不出來”。我整理了幾個(gè)高頻簡(jiǎn)答題的答題框架“為什么三次握手而不是兩次”先答兩次握手的問題已失效連接請(qǐng)求導(dǎo)致資源浪費(fèi)再答三次握手如何解決客戶端不確認(rèn)則服務(wù)端不建立連接最后補(bǔ)充“三次是最小值SYN和ACK可合并所以不需要四次”?!癟CP和UDP的區(qū)別”按維度答——連接方式、可靠性、傳輸單位、首部開銷、流量控制、擁塞控制、應(yīng)用場(chǎng)景。每個(gè)維度一句話條理清晰?!傲髁靠刂坪蛽砣刂频膮^(qū)別”先分別定義流量控制是端到端、解決接收方處理不過來擁塞控制是全局、解決網(wǎng)絡(luò)處理不過來再答實(shí)現(xiàn)機(jī)制滑動(dòng)窗口vs四算法最后答目標(biāo)不同防止接收方溢出vs防止網(wǎng)絡(luò)擁塞?!盀槭裁碩IME-WAIT要等2MSL”答兩點(diǎn)——確保最后ACK到達(dá)、讓舊報(bào)文段消失。每點(diǎn)展開一兩句話。5.3 我踩過的坑和給你的避坑建議第一個(gè)坑把序號(hào)和確認(rèn)號(hào)搞混。序號(hào)是“我發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)編號(hào)”確認(rèn)號(hào)是“我期望收到對(duì)方的下一個(gè)字節(jié)編號(hào)”。這兩個(gè)方向相反考試時(shí)一緊張就容易寫反。建議做題時(shí)在草稿紙上標(biāo)明“發(fā)送方→接收方”的方向箭頭。第二個(gè)坑擁塞控制計(jì)算時(shí)忘記單位。cwnd的單位是MSS不是字節(jié)。如果題目給的是字節(jié)要先換算成MSS再計(jì)算。我見過有人直接把字節(jié)數(shù)當(dāng)MSS用結(jié)果整道題全錯(cuò)。第三個(gè)坑UDP檢驗(yàn)和忘記偽首部。UDP檢驗(yàn)和的計(jì)算范圍包括偽首部12字節(jié)UDP首部8字節(jié)數(shù)據(jù)。偽首部包括源IP、目的IP、零、協(xié)議號(hào)、UDP長(zhǎng)度。很多人只算首部和數(shù)據(jù)漏了偽首部結(jié)果檢驗(yàn)和算錯(cuò)。第四個(gè)坑四次揮手時(shí)ACK和FIN的順序。服務(wù)端收到FIN后先發(fā)ACK等自己數(shù)據(jù)發(fā)完再發(fā)FIN。這兩個(gè)不能合并因?yàn)橹虚g可能還有數(shù)據(jù)要傳??荚嚂r(shí)如果畫圖記得中間要留出數(shù)據(jù)傳輸?shù)碾A段。第五個(gè)坑死記硬背不理解。傳輸層這章如果只背不理解的遇到變形題就懵了。比如題目把三次握手改成“兩次握手一次確認(rèn)”問你行不行或者把擁塞控制的初始條件改一下問你cwnd怎么變。只有真正理解了機(jī)制才能靈活應(yīng)對(duì)。最后分享一個(gè)復(fù)習(xí)方法找一張白紙合上書把三次握手、四次揮手、擁塞控制的變化圖默畫一遍。畫不出來的地方就是你的薄弱點(diǎn)翻書重點(diǎn)看。畫完再對(duì)照課本檢查反復(fù)兩三次這章的計(jì)算題和簡(jiǎn)答題基本就穩(wěn)了。5.4 考場(chǎng)時(shí)間分配建議傳輸層的內(nèi)容在試卷中通常分布在選擇題、填空題、簡(jiǎn)答題和計(jì)算題中。建議的時(shí)間分配選擇題中的傳輸層題目每題不超過1分鐘總共控制在5分鐘內(nèi)。填空題每題30秒總共2分鐘。簡(jiǎn)答題每題5-8分鐘寫要點(diǎn)即可不用長(zhǎng)篇大論。計(jì)算題每題10-15分鐘先寫公式再代入數(shù)據(jù)步驟分很重要。如果計(jì)算題卡住了先把公式寫上去能拿步驟分。不要在一道題上死磕超過15分鐘后面的題可能更簡(jiǎn)單。我在實(shí)際考試和輔導(dǎo)別人的過程中發(fā)現(xiàn)傳輸層這章最大的特點(diǎn)就是“入門難但一旦理解就一通百通”。剛開始學(xué)的時(shí)候覺得概念多、機(jī)制復(fù)雜但當(dāng)你把三次握手、滑動(dòng)窗口、擁塞控制這三條主線串起來之后會(huì)發(fā)現(xiàn)它們背后是同一套設(shè)計(jì)哲學(xué)在不可靠的網(wǎng)絡(luò)上構(gòu)建可靠通信同時(shí)兼顧效率和公平。理解了這個(gè)哲學(xué)很多細(xì)節(jié)就不用死記了順著邏輯就能推出來。