
1. 為什么“自頂向下”這本教材的習題值得反復刷如果你正在學計算機網絡或者準備考研、準備面試手里大概率繞不開一本教材——某經典自頂向下方法教材。這本書從應用層一路往下講到物理層邏輯清晰、案例扎實但真正讓無數人頭疼的是每章后面那幾十道習題。我見過太多同學書看懂了課聽完了一到做題就卡殼尤其是那些需要計算、需要畫時序圖、需要推導窗口大小的題目光靠看答案根本不知道為什么。這篇內容就是圍繞這本教材第6版的課后習題答案展開的。我會把每章習題的核心考點、常見坑、解題思路、以及我當年刷題時總結出來的“野路子”全部拆開講。適合三類人正在上課需要交作業(yè)的本科生、準備考研復試被問到網絡細節(jié)的考生、以及工作后想補網絡基礎的開發(fā)者。不管你是剛翻開第一章的新手還是已經刷到第五章傳輸層的老油條這里都有你能直接抄作業(yè)的東西。先給一個整體判斷這本書的習題難度是階梯式的。每章前幾道是概念驗證題中間是計算和分析題最后幾道往往是綜合設計題。很多人卡在中間那部分因為教材正文講原理習題卻要求你把原理轉化成數值或流程。我的建議是不要一上來就翻答案先自己寫哪怕寫錯了再看解析印象會深十倍。下面我按章節(jié)拆解把每類題型的底層邏輯講透。2. 應用層習題從HTTP到DNS的實戰(zhàn)拆解2.1 HTTP請求響應與RTT計算題的通用套路應用層最??嫉念}型之一就是計算從點擊鏈接到收到完整頁面所需的時間。這類題的核心變量只有幾個往返時延RTT、傳輸時延、并行連接數、是否使用持久連接。很多同學一看到“非持久HTTP”和“持久HTTP”就暈其實你只需要記住一個原則非持久連接每傳一個對象就要新建一次TCP連接每次建連至少消耗一個RTT持久連接則復用同一條TCP連接省去后續(xù)建連的RTT。我拿一道典型題舉例假設一個頁面包含1個基礎HTML文件和3個圖片RTT為100ms忽略傳輸時延。非持久HTTP且串行請求的情況下總時間是多少答案是建TCP連1個RTT發(fā)HTTP請求并收到響應1個RTT這是HTML文件共2個RTT。然后每個圖片都要重新建連每個圖片2個RTT3個圖片就是6個RTT??偣?個RTT即800ms。如果改成非持久但并行請求圖片可以同時建連那么HTML之后3個圖片并行每個2個RTT但并行意味著它們同時開始總時間還是2個RTT所以總共4個RTT400ms。如果是持久連接且串行建連1個RTTHTML請求響應1個RTT然后3個圖片共用這條連接每個1個RTT總共235個RTT500ms。持久連接加流水線圖片請求可以連續(xù)發(fā)理想情況下總時間更短。注意很多題會故意加一個“客戶端解析HTML文件需要時間”或者“DNS查詢時間”這時候你要把DNS的RTT單獨加上。DNS通常是遞歸查詢本地DNS到根、到頂級、到權威每一級一個RTT但如果有緩存可能為0。做題時先看題目有沒有說“緩存為空”。我自己的經驗是把這類題畫成時間軸圖橫軸是時間縱軸是客戶端和服務器每個RTT畫一個箭頭標上序號。畫完圖答案基本就出來了。不要硬背公式畫圖最穩(wěn)。2.2 DNS查詢與緩存機制的習題陷阱DNS部分的習題經??歼f歸查詢和迭代查詢的區(qū)別以及緩存對查詢次數的影響。有一道經典題客戶端要訪問某個域名本地DNS服務器緩存為空問從根域名服務器開始迭代查詢需要多少次請求答案是本地DNS先問根根返回頂級域名服務器地址本地DNS再問頂級頂級返回權威服務器地址本地DNS再問權威拿到最終IP。一共3次請求加上客戶端問本地DNS的1次總共4次。如果是遞歸查詢本地DNS會替客戶端去問根、頂級、權威客戶端只發(fā)1次請求但本地DNS和各級服務器之間的請求次數不變。這里有個容易錯的點題目可能會說“頂級域名服務器知道權威服務器的地址”但實際互聯網中頂級域名服務器通常只返回它管理的權威服務器不一定直接知道最終IP。做題時以教材描述為準教材說知道就知道。還有一個高頻考點是DNS緩存。如果本地DNS緩存了某個域名的記錄那么查詢時間直接降為0忽略本地處理時間。如果緩存了頂級域名的記錄那么可以跳過根查詢。我見過一道題問“第二次訪問同一域名時哪些查詢可以省略”答案就是根和頂級都可以省略直接問權威。這類題的關鍵是分清“緩存了什么級別的記錄”。2.3 郵件協議與FTP的細節(jié)辨析SMTP、POP3、IMAP這三個郵件協議的區(qū)別幾乎每學期都考。SMTP是推協議用于發(fā)送郵件從用戶代理到郵件服務器或者從發(fā)送方服務器到接收方服務器。POP3和IMAP是拉協議用于從服務器讀取郵件。POP3通常下載后刪除IMAP則在服務器上管理文件夾。習題里常問“如果用戶用POP3收郵件然后在另一臺設備上還能看到之前的郵件嗎”答案是不能因為POP3默認下載后刪除。如果題目說“配置為保留副本”那就可以。FTP的控制連接和數據連接分離控制連接用21端口數據連接用20端口主動模式。主動模式下服務器主動連客戶端的數據端口被動模式下客戶端連服務器的隨機端口。習題??肌叭绻蛻舳嗽诜阑饓竽姆N模式更友好”答案是被動模式因為主動模式下服務器發(fā)起的連接可能被防火墻攔截。這些協議題不難但細節(jié)多建議做一張對比表把端口、方向、有狀態(tài)無狀態(tài)、是否帶外控制都列出來。我當年就是靠這張表考試時一眼就能選出答案。3. 傳輸層習題可靠傳輸與擁塞控制的硬骨頭3.1 滑動窗口與選擇重傳的窗口大小計算傳輸層是整本書最硬核的部分尤其是滑動窗口和選擇重傳。習題里經常給一個序號位數問最大窗口大小是多少。比如序號用5位表示那么序號空間是0到31共32個。對于選擇重傳發(fā)送窗口和接收窗口之和不能超過序號空間所以最大窗口是16。對于回退N步發(fā)送窗口最大是31接收窗口是1。這個結論要記牢但更重要的是理解為什么。為什么選擇重傳的窗口不能超過序號空間的一半因為如果發(fā)送窗口和接收窗口都太大接收方無法區(qū)分一個新分組和一個重傳的舊分組。舉個例子序號空間32發(fā)送窗口20接收窗口20那么發(fā)送方發(fā)了序號0到19接收方收到后窗口滑動到20到39模32就是20到7。如果此時發(fā)送方超時重傳序號0接收方會以為這是一個新分組因為它的窗口覆蓋了0。這就亂了。所以必須限制窗口大小讓接收方的窗口和發(fā)送方的窗口不重疊。我見過一道題序號用4位問選擇重傳的最大窗口。4位序號空間是16最大窗口是8。很多同學直接寫16錯了。還有一道題回退N步序號用3位發(fā)送窗口最大是7因為8會溢出。這些計算題只要記住“選擇重傳取一半回退N步取全減一”基本不會錯。3.2 TCP擁塞控制慢啟動、擁塞避免與快速恢復的曲線分析TCP擁塞控制是必考大題。題目通常給一個擁塞窗口隨時間變化的圖讓你標出慢啟動、擁塞避免、快速恢復的階段或者計算某個時刻的窗口大小。核心規(guī)則慢啟動階段每收到一個ACKcwnd加1所以是指數增長每個RTT翻倍。擁塞避免階段每個RTT加1線性增長。發(fā)生超時cwnd降為1重新慢啟動。收到三個冗余ACKcwnd減半進入快速恢復。有一道經典題初始cwnd1ssthresh8。問經過5個RTT后cwnd是多少慢啟動RTT1后cwnd2RTT2后4RTT3后8。此時達到ssthresh進入擁塞避免。RTT4后9RTT5后10。所以答案是10。如果題目說在第5個RTT發(fā)生超時那么cwnd降為1ssthresh變?yōu)楫斍癱wnd的一半即5。然后重新慢啟動。這里有個坑很多題會把“三個冗余ACK”和“超時”混在一起考。你要分清超時是嚴重擁塞cwnd直接降到1三個冗余ACK是輕微擁塞cwnd減半。還有快速恢復階段cwnd不是從1開始而是從ssthresh3開始因為收到了三個重復ACK說明有三個分組已經離開網絡。我自己的做法是拿到題先畫時間軸標出每個RTT的cwnd值然后根據事件調整。不要跳步一步一步來再復雜的題也能解。3.3 往返時間估計與超時時間的計算題TCP的超時時間計算涉及EstimatedRTT和DevRTT。公式是EstimatedRTT (1-α) * EstimatedRTT α * SampleRTT通常α0.125。DevRTT (1-β) * DevRTT β * |SampleRTT - EstimatedRTT|β0.25。超時時間 EstimatedRTT 4 * DevRTT。題目一般會給幾個SampleRTT讓你算最終的TimeoutInterval。比如初始EstimatedRTT100msDevRTT10ms第一個SampleRTT120ms。那么新的EstimatedRTT 0.875100 0.125120 87.5 15 102.5ms。DevRTT 0.7510 0.25|120-102.5| 7.5 0.2517.5 7.5 4.375 11.875ms。超時時間 102.5 411.875 102.5 47.5 150ms。這類題不難但計算要細心。我建議用表格把每次的SampleRTT、EstimatedRTT、DevRTT、TimeoutInterval都列出來避免中間步驟出錯。還有題目可能會問“如果超時后重傳SampleRTT取哪個值”答案是取重傳后的ACK對應的SampleRTT但Karn算法說重傳時不更新EstimatedRTT除非用時間戳選項。這個細節(jié)??肌?. 網絡層與鏈路層從IP分片到CSMA/CD的實戰(zhàn)4.1 IP數據報分片與重組計算全流程IP分片是網絡層最??嫉挠嬎泐}。題目給一個數據報總長度、MTU、標識符讓你算分片后的每片長度、偏移量、MF標志。核心規(guī)則分片的數據部分必須是8字節(jié)的整數倍。總長度包括首部20字節(jié)。偏移量以8字節(jié)為單位。舉個例子一個總長4000字節(jié)的IP數據報首部20數據3980MTU1500。那么每片最大數據是1500-201480字節(jié)。第一片數據1480偏移0MF1。第二片數據1480偏移1480/8185MF1。第三片數據3980-1480-14801020偏移(14801480)/8370MF0。總長度分別是1500、1500、1040。這里有個易錯點偏移量的單位是8字節(jié)所以計算時要除以8。還有最后一片的數據不要求是8的倍數但前面的片必須是。如果題目給的MTU不是8的倍數加20比如MTU1500那沒問題如果MTU1499那每片最大數據是1479但1479不是8的倍數要向下取到1472。這個細節(jié)很多題會考。我建議做這類題時先算每片最大數據量然后從總數據量里依次減最后一片直接取剩余。偏移量用累計數據量除以8。畫一個表格列片號、數據長度、偏移、MF、總長度。一目了然。4.2 CSMA/CD與以太網幀的最小長度推導CSMA/CD的習題經常問為什么以太網幀的最小長度是64字節(jié)這要從碰撞檢測說起。最壞情況下信號從一端傳到另一端再回來需要2倍的最大傳播時延。發(fā)送方必須在發(fā)送完之前檢測到碰撞所以發(fā)送時間至少是2倍傳播時延。對于10Mbps以太網最大距離2500米傳播速度2e8 m/s傳播時延2500/2e812.5微秒往返25微秒。發(fā)送25微秒的數據量是10Mbps * 25us 250比特約等于64字節(jié)512比特。實際上標準取512比特即64字節(jié)。題目可能會變參數比如速率100Mbps距離100米問最小幀長。你只需要用公式最小幀長 2 * 距離 / 傳播速度 * 速率。注意單位換算。我見過一道題速率1Gbps距離200米算出來是2*200/2e8 * 1e9 2000比特 250字節(jié)。但實際以太網最小幀還是64字節(jié)因為標準沒變。題目如果問“理論上最小”就用公式算如果問“實際標準”就是64字節(jié)。還有CSMA/CD的二進制指數退避算法也???。第n次碰撞后從0到2^n-1中隨機取一個數乘以爭用期。如果n3就從0到7中取。這個簡單但要注意n最大到10超過10就固定從0到1023取。4.3 交換機與路由器的轉發(fā)決策對比交換機和路由器的區(qū)別習題里常以“一個幀到達交換機交換機如何轉發(fā)”和“一個分組到達路由器路由器如何轉發(fā)”來考。交換機看MAC地址表如果表中有目的MAC就從對應端口轉發(fā)如果沒有就泛洪。路由器看路由表用最長前綴匹配找到下一跳。有一道題一個交換機收到一個幀目的MAC不在表中它會怎么做答案是泛洪到所有端口除了 incoming 端口。如果目的MAC在表中就只轉發(fā)到對應端口。路由器則不會泛洪如果路由表中沒有匹配項就丟棄并發(fā)送ICMP不可達。這里有個細節(jié)交換機是即插即用的MAC表通過源MAC學習。路由器需要配置路由協議或靜態(tài)路由。題目可能會問“交換機需要配置IP嗎”答案是不需要交換機是二層設備只關心MAC。路由器是三層設備需要IP。我當年做這類題時喜歡畫一個網絡拓撲標上MAC和IP然后模擬一個幀或分組的旅程。這樣比死記硬背強得多。5. 無線與網絡安全容易被忽視的得分點5.1 802.11 CSMA/CA與RTS/CTS機制無線網絡的CSMA/CA和有線CSMA/CD不同因為無線不能一邊發(fā)一邊聽。習題??紴槭裁礋o線要用CSMA/CA因為無線信號衰減快且存在隱藏終端問題。CSMA/CA通過ACK確認來避免碰撞。RTS/CTS機制用于解決隱藏終端發(fā)送方先發(fā)RTS接收方回CTS其他站聽到CTS后延遲發(fā)送。有一道題A和B都想發(fā)給AP但A和B互相聽不到問如何避免碰撞答案是用RTS/CTS。A發(fā)RTS給APAP回CTSB聽到CTS后知道AP要接收A的數據就延遲。如果B也發(fā)RTS就會碰撞。所以RTS/CTS不是萬能的但能減少碰撞。還有802.11的幀間間隔SIFS、DIFS也常考。SIFS最短用于ACKDIFS較長用于數據幀。優(yōu)先級SIFS PIFS DIFS。題目可能會問“ACK在什么之后發(fā)送”答案是SIFS之后。5.2 對稱加密與非對稱加密的混合使用網絡安全部分的習題經??糝SA和AES的混合加密。為什么不用RSA加密所有數據因為RSA慢適合加密小數據比如對稱密鑰。實際流程A生成一個對稱密鑰用B的公鑰加密后發(fā)給BB用私鑰解密得到對稱密鑰然后雙方用對稱密鑰通信。題目可能會給p5, q7讓你算RSA的公鑰和私鑰。n35φ(n)24。選e5因為5和24互質。d e^-1 mod 245525 mod 241所以d5。公鑰(5,35)私鑰(5,35)。這里e和d相同是巧合但計算是對的。加密m3c3^5 mod 35 243 mod 35 243-21033。解密33^5 mod 35 33^21089 mod 351089-108544^2161633528 mod 35528-5253。正確。這類題不難但計算量大。我建議用模運算的性質分步算別直接算大數。還有題目可能會問“如果p和q泄露會怎樣”答案是私鑰可被計算加密失效。5.3 數字簽名與報文認證的習題辨析數字簽名和報文認證的區(qū)別數字簽名用私鑰加密公鑰解密提供認證和不可否認性報文認證用共享密鑰或哈希只提供認證不提供不可否認性。題目常問“如果A和B共享一個密鑰A發(fā)消息給BB能證明是A發(fā)的嗎”答案是不能因為B也能生成同樣的消息所以不可否認性不成立。還有哈希函數的性質單向性、抗弱碰撞、抗強碰撞。題目可能會問“MD5和SHA-256哪個更安全”答案是SHA-256因為MD5已被證明有碰撞。但教材第6版可能還沒更新到最新以教材為準。我自己的經驗是這部分題偏概念多看書上的定義把“提供什么安全服務”列成表做題時對號入座。6. 刷題節(jié)奏與答案使用心得6.1 如何安排每章習題的練習順序我建議每學完一章先做前5道概念題確認基本概念清楚。然后做中間的計算題這部分最花時間但最能檢驗理解。最后做綜合題如果時間不夠至少看懂答案的思路。不要一章全做完再對答案做5道就對一次及時糾正。對于傳輸層和網絡層計算題多建議準備一個錯題本把做錯的題號、錯誤原因、正確思路記下來。我當年錯得最多的是滑動窗口的窗口大小和IP分片的偏移量后來專門練了20道就再也沒錯過。6.2 答案看不懂時怎么辦有時候答案跳步太多看不懂。我的做法是先看答案的最終結果然后自己反推。比如擁塞控制題答案說cwnd10我就從初始值開始按規(guī)則一步步推看哪一步能到10。如果推不出來就去看教材對應章節(jié)的例題通常例題和習題是配套的。還有一個辦法找同學討論。我當年和室友一起刷題他懂的我可能不懂互相講一遍效果比看答案好。如果實在沒人討論就去網上搜但要注意網上的答案可能有錯最好交叉驗證。6.3 常見錯誤類型與避坑清單我整理了一個常見錯誤表你可以對照檢查錯誤類型典型表現糾正方法單位混淆RTT用秒速率用Mbps直接乘統一換算成比特和秒窗口大小超限選擇重傳窗口取序號空間記住取一半偏移量忘除8IP分片偏移直接寫字節(jié)數除以8混淆超時和冗余ACK超時降為1冗余ACK減半畫圖區(qū)分DNS緩存級別搞錯以為緩存了域名就不用問權威緩存只跳過已緩存的級別加密計算順序錯RSA先加密后簽名簽名用私鑰加密用公鑰提示做題時把“已知”和“求”列清楚單位統一畫圖輔助能避免80%的錯誤。6.4 從習題到面試哪些題最值得反復看如果你是為了面試重點看傳輸層的TCP擁塞控制、三次握手四次揮手、流量控制網絡層的IP分片、路由算法鏈路層的CSMA/CD、交換機轉發(fā)。應用層的HTTP、DNS也常問。安全部分RSA和數字簽名要能講清楚流程。我面試時被問過“TCP慢啟動什么時候結束”我直接畫了曲線講了ssthresh的作用面試官很滿意。所以習題不只是為了考試更是為了把知識內化成能講出來的東西。最后分享一個小技巧把每章的習題答案整理成自己的話不要照抄。比如“選擇重傳窗口是序號空間的一半”你可以寫成“因為要避免新舊分組混淆發(fā)送和接收窗口加起來不能超過序號總數所以各取一半”。這樣寫一遍比看十遍答案都管用。