算機(jī)網(wǎng)絡(luò)筆記高效復(fù)習(xí)指南:從抓包驗(yàn)證到計(jì)算題實(shí)戰(zhàn))
簡介這份408計(jì)算機(jī)網(wǎng)絡(luò)筆記源自湖科大教書匠的課程體系面向備戰(zhàn)計(jì)算機(jī)考研408的考生以及需要系統(tǒng)梳理計(jì)算機(jī)網(wǎng)絡(luò)知識(shí)的高校學(xué)生幫助解決知識(shí)點(diǎn)零散、復(fù)習(xí)缺乏主線的問題。資源為單個(gè)PDF文件壓縮包約56.38MB內(nèi)容按章節(jié)組織便于打印或平板批注。筆記從緒論講起涵蓋因特網(wǎng)概述、電路交換與分組交換及報(bào)文交換的對(duì)比、計(jì)算機(jī)網(wǎng)絡(luò)定義與分類并重點(diǎn)整理速率、帶寬、吞吐量、時(shí)延、時(shí)延帶寬積、往返時(shí)間、利用率、丟包率等八大性能指標(biāo)對(duì)易混淆的換算關(guān)系與例題也有標(biāo)注。目前已有352人學(xué)習(xí)適合基礎(chǔ)階段通讀與沖刺階段查漏補(bǔ)缺可配合教材和真題反復(fù)翻閱快速建立完整知識(shí)框架。1. 408計(jì)算機(jī)網(wǎng)絡(luò)筆記從零散知識(shí)點(diǎn)到可復(fù)現(xiàn)的復(fù)習(xí)體系考研408的計(jì)算機(jī)網(wǎng)絡(luò)部分很多人栽在“背了忘、忘了背”的循環(huán)里。湖科大教書匠的這套筆記之所以被反復(fù)提起核心在于它把OSI七層和TCP/IP四層里那些抽象概念拆成了能畫圖、能算題、能對(duì)照真題的模塊。如果你正在找一份能直接拿來當(dāng)復(fù)習(xí)主線的資料或者已經(jīng)有一份筆記但不知道怎么用出效果這篇內(nèi)容就是為你寫的。我不會(huì)復(fù)述筆記里的每一頁而是把“怎么用這套筆記搭出一套可執(zhí)行的復(fù)習(xí)流程”講清楚——從章節(jié)映射到真題考點(diǎn)從抓包驗(yàn)證到錯(cuò)題歸因每一步都落到具體操作上。這套方法適合兩類人一是剛開始一輪復(fù)習(xí)、需要建立框架的二是二輪刷題時(shí)發(fā)現(xiàn)網(wǎng)絡(luò)部分正確率上不去的。2. 筆記結(jié)構(gòu)與408考綱的映射先搞清楚每一章該花多少時(shí)間2.1 筆記的章節(jié)劃分與考綱對(duì)應(yīng)關(guān)系湖科大教書匠的筆記通常按“體系結(jié)構(gòu)→物理層→數(shù)據(jù)鏈路層→網(wǎng)絡(luò)層→傳輸層→應(yīng)用層”組織這和408考綱的六章結(jié)構(gòu)基本一致。但筆記里有些內(nèi)容是考綱不要求的比如物理層的某些編碼細(xì)節(jié)而考綱里有的比如路由聚合、TCP擁塞控制的具體算法筆記里可能講得比較散。我一般會(huì)先做一張映射表把筆記章節(jié)和考綱條目對(duì)齊避免在非考點(diǎn)上耗時(shí)間。筆記章節(jié)408考綱對(duì)應(yīng)建議一輪用時(shí)必做真題年份體系結(jié)構(gòu)第1章 概述2天2010-2012物理層第2章 物理層3天2013-2015數(shù)據(jù)鏈路層第3章 數(shù)據(jù)鏈路層5天2016-2018網(wǎng)絡(luò)層第4章 網(wǎng)絡(luò)層8天2019-2021傳輸層第5章 傳輸層6天2022-2024應(yīng)用層第6章 應(yīng)用層4天2020-2023這張表不是拍腦袋來的。網(wǎng)絡(luò)層和傳輸層占分最高合計(jì)約50%所以時(shí)間要傾斜。數(shù)據(jù)鏈路層雖然概念多但真題題型固定5天足夠。應(yīng)用層看著簡單但DNS、HTTP、FTP的細(xì)節(jié)容易混4天是底線。2.2 用真題反推筆記重點(diǎn)哪些小節(jié)可以快速過筆記里有些小節(jié)比如物理層的雙絞線分類、同軸電纜歷史408基本不考快速掃一眼就行。但有些小節(jié)比如“CSMA/CD與CSMA/CA的區(qū)別”“IP分片與重組”“TCP三次握手與四次揮手的狀態(tài)變遷”必須逐字精讀因?yàn)檎骖}反復(fù)在這里設(shè)坑。我的做法是先拿最近5年真題把網(wǎng)絡(luò)部分的題目按知識(shí)點(diǎn)歸類然后回到筆記里標(biāo)記每個(gè)知識(shí)點(diǎn)的出現(xiàn)頻次。頻次≥3的筆記對(duì)應(yīng)段落要能默寫頻次1的理解即可頻次0的直接跳過。這樣一輪下來筆記的厚度能壓縮掉三分之一。提示不要一上來就抄筆記。先做真題歸類再帶著問題去讀筆記效率差三倍。3. 用Wireshark把筆記里的協(xié)議跑一遍抓包驗(yàn)證的四個(gè)關(guān)鍵實(shí)驗(yàn)3.1 實(shí)驗(yàn)一觀察TCP三次握手與四次揮手筆記里講TCP連接管理時(shí)狀態(tài)圖是重點(diǎn)但光看圖容易記混。我一般會(huì)讓學(xué)生在本機(jī)開一個(gè)Wireshark然后訪問一個(gè)HTTP網(wǎng)站過濾tcp.port80直接看握手和揮手的包序列。# 在終端啟動(dòng)抓包指定網(wǎng)卡和過濾器 tshark -i eth0 -f tcp port 80 -Y tcp.flags.syn1 or tcp.flags.fin1 -w tcp_handshake.pcap這段命令用tshark抓取TCP端口80上所有SYN和FIN標(biāo)志的包保存為pcap文件。-i eth0指定網(wǎng)卡-f是BPF過濾器-Y是顯示過濾器-w寫入文件。抓完后用Wireshark打開能看到三次握手的SYN、SYNACK、ACK以及四次揮手的FIN、ACK、FIN、ACK。重點(diǎn)看序列號(hào)和確認(rèn)號(hào)的變化筆記里那些“seqx, ackx1”的公式在包里一目了然。參數(shù)說明-i后面的網(wǎng)卡名要換成你實(shí)際使用的比如en0或wlan0。如果只想抓特定IP可以加host 192.168.1.1。抓包時(shí)不要開太多應(yīng)用否則包太雜。3.2 實(shí)驗(yàn)二用ping和traceroute驗(yàn)證IP層與ICMP筆記里講IP分片和ICMP時(shí)很多人對(duì)“MTU”“分片偏移”沒概念。直接跑一個(gè)帶大包ping的命令看分片行為。# 發(fā)送一個(gè)3000字節(jié)的ICMP包禁止分片觀察返回 ping -c 3 -s 3000 -M do 8.8.8.8-s 3000指定數(shù)據(jù)部分3000字節(jié)加上IP頭20字節(jié)和ICMP頭8字節(jié)總長3028超過常見MTU 1500所以會(huì)觸發(fā)分片。-M do表示禁止分片如果路徑MTU小于3028會(huì)返回“Frag needed”錯(cuò)誤。這個(gè)實(shí)驗(yàn)?zāi)苤苯域?yàn)證筆記里“IP分片與重組”的流程每個(gè)分片的標(biāo)識(shí)、標(biāo)志、偏移字段怎么填。如果換成-M dont就會(huì)看到分片后的多個(gè)ICMP包。用Wireshark抓下來對(duì)照筆記里的分片字段表偏移量是8的倍數(shù)標(biāo)志位MF和DF的變化比死記硬背強(qiáng)得多。3.3 實(shí)驗(yàn)三DNS查詢的遞歸與迭代筆記里DNS部分容易混的是遞歸查詢和迭代查詢的區(qū)別。用dig命令加trace參數(shù)能看到從根域名服務(wù)器到頂級(jí)域再到權(quán)威服務(wù)器的完整迭代過程。# 追蹤DNS解析全過程 dig trace www.example.com輸出會(huì)顯示從根服務(wù)器.開始依次詢問com.、example.com.最后得到A記錄。每一跳都是迭代查詢而你的本機(jī)向本地DNS服務(wù)器發(fā)的是遞歸查詢。筆記里那張“遞歸迭代”的圖跑一遍就記住了。參數(shù)說明trace會(huì)繞過本地緩存直接向根服務(wù)器發(fā)起查詢。如果網(wǎng)絡(luò)環(huán)境不支持可以改用dig 8.8.8.8 www.example.com看遞歸結(jié)果。3.4 實(shí)驗(yàn)四HTTP持久連接與非持久連接筆記里講HTTP/1.0和HTTP/1.1的區(qū)別時(shí)持久連接是重點(diǎn)。用curl加-v參數(shù)觀察Connection頭。# 查看HTTP請(qǐng)求和響應(yīng)頭 curl -v http://www.example.com --http1.0 curl -v http://www.example.com --http1.1--http1.0時(shí)響應(yīng)頭里會(huì)有Connection: close每個(gè)請(qǐng)求都要新建TCP連接。--http1.1默認(rèn)Connection: keep-alive多個(gè)請(qǐng)求復(fù)用同一個(gè)連接。筆記里“持久連接節(jié)省了TCP握手時(shí)間”這句話在-v輸出里能看到實(shí)際的時(shí)間差。注意抓包實(shí)驗(yàn)要在自己可控的網(wǎng)絡(luò)里做不要對(duì)生產(chǎn)環(huán)境發(fā)起大量請(qǐng)求。實(shí)驗(yàn)?zāi)康氖球?yàn)證協(xié)議行為不是壓測(cè)。4. 筆記里的計(jì)算題怎么練從子網(wǎng)劃分到TCP窗口的五個(gè)必刷題型4.1 子網(wǎng)劃分與CIDR聚合筆記里子網(wǎng)劃分部分給了很多例子但考試時(shí)容易錯(cuò)在“借位”和“廣播地址”上。我一般會(huì)讓學(xué)生用Python寫一個(gè)小腳本隨機(jī)生成題目并驗(yàn)證答案。import ipaddress def subnet_info(network, new_prefix): 給定網(wǎng)絡(luò)和新的前綴長度輸出子網(wǎng)信息 net ipaddress.ip_network(network) subnets list(net.subnets(new_prefixnew_prefix)) for i, sub in enumerate(subnets[:4]): # 只打印前4個(gè) print(f子網(wǎng){i1}: {sub}) print(f 網(wǎng)絡(luò)地址: {sub.network_address}) print(f 廣播地址: {sub.broadcast_address}) print(f 可用主機(jī)數(shù): {sub.num_addresses - 2}) # 示例將192.168.1.0/24劃分為/26 subnet_info(192.168.1.0/24, 26)這段代碼用ipaddress模塊做子網(wǎng)劃分subnets(new_prefix26)會(huì)把/24切成4個(gè)/26。輸出里網(wǎng)絡(luò)地址、廣播地址、可用主機(jī)數(shù)一目了然。筆記里那些“借2位分4個(gè)子網(wǎng)每個(gè)子網(wǎng)62臺(tái)主機(jī)”的結(jié)論用代碼跑一遍就再也不會(huì)記反。參數(shù)說明new_prefix必須大于原前綴否則報(bào)錯(cuò)。num_addresses - 2是因?yàn)榫W(wǎng)絡(luò)地址和廣播地址不可用。如果題目要求“每個(gè)子網(wǎng)至少容納50臺(tái)主機(jī)”那就需要2^6-262所以主機(jī)位6位前綴長度32-626。4.2 TCP擁塞控制的窗口變化筆記里慢開始、擁塞避免、快重傳、快恢復(fù)的曲線圖考試時(shí)經(jīng)常給一個(gè)初始閾值問第幾輪窗口是多少。我一般會(huì)讓學(xué)生手算一遍再用代碼驗(yàn)證。def tcp_congestion(init_cwnd, ssthresh, rounds): 模擬TCP擁塞控制窗口變化 cwnd init_cwnd for r in range(1, rounds1): if cwnd ssthresh: cwnd * 2 # 慢開始 else: cwnd 1 # 擁塞避免 print(f第{r}輪: cwnd{cwnd}) return cwnd # 初始cwnd1, ssthresh8, 模擬12輪 tcp_congestion(1, 8, 12)這段代碼模擬了慢開始到擁塞避免的切換。當(dāng)cwnd ssthresh時(shí)翻倍否則每輪加1。輸出能看到第1輪1第2輪2第3輪4第4輪8此時(shí)等于ssthresh進(jìn)入擁塞避免第5輪9第6輪10……筆記里的曲線圖用數(shù)字列出來更直觀。參數(shù)說明init_cwnd通常為1個(gè)MSSssthresh初始值可能是16或題目給定。如果發(fā)生超時(shí)ssthresh會(huì)變成當(dāng)前cwnd的一半cwnd重置為1??熘貍鲿r(shí)ssthresh和cwnd都減半然后進(jìn)入快恢復(fù)。4.3 IP分片計(jì)算筆記里IP分片部分常考“一個(gè)3000字節(jié)的IP數(shù)據(jù)報(bào)經(jīng)過MTU1500的鏈路分幾片每片偏移多少”這類題。手算容易錯(cuò)在“數(shù)據(jù)部分長度必須是8的倍數(shù)”。def ip_fragment(total_len, mtu): 計(jì)算IP分片total_len為IP數(shù)據(jù)報(bào)總長含頭 header 20 data_len total_len - header max_data (mtu - header) // 8 * 8 # 每片數(shù)據(jù)部分最大長度8的倍數(shù) offset 0 frags [] while data_len 0: this_data min(data_len, max_data) frags.append((offset, this_data)) offset this_data // 8 data_len - this_data for i, (off, dlen) in enumerate(frags): print(f片{i1}: 偏移{off}, 數(shù)據(jù)長度{dlen}, 總長{dlenheader}) return frags ip_fragment(3000, 1500)輸出會(huì)顯示片1偏移0數(shù)據(jù)長度1480總長1500片2偏移185數(shù)據(jù)長度1480總長1500片3偏移370數(shù)據(jù)長度20總長40。偏移量以8字節(jié)為單位所以1851480/8。筆記里“偏移字段”的含義用這個(gè)腳本一算就清楚。參數(shù)說明mtu是鏈路層最大傳輸單元以太網(wǎng)通常1500。max_data要向下取整到8的倍數(shù)因?yàn)槠谱侄我?字節(jié)為單位。最后一片數(shù)據(jù)長度可以不是8的倍數(shù)。4.4 路由聚合與最長前綴匹配筆記里路由聚合部分??肌敖o出幾個(gè)路由表項(xiàng)聚合后是什么”。我一般會(huì)讓學(xué)生用二進(jìn)制展開再找公共前綴。def route_aggregate(routes): 路由聚合routes為列表每個(gè)元素是(網(wǎng)絡(luò)地址, 前綴長度) # 轉(zhuǎn)為二進(jìn)制字符串 bins [] for net, prefix in routes: ip ipaddress.ip_address(net) bin_str bin(int(ip))[2:].zfill(32) bins.append(bin_str[:prefix]) # 找最長公共前綴 common for bits in zip(*bins): if len(set(bits)) 1: common bits[0] else: break new_prefix len(common) # 補(bǔ)全到32位 network common 0 * (32 - new_prefix) return str(ipaddress.ip_address(int(network, 2))) / str(new_prefix) # 示例聚合192.168.0.0/24和192.168.1.0/24 print(route_aggregate([(192.168.0.0, 24), (192.168.1.0, 24)]))輸出是192.168.0.0/23。邏輯是兩個(gè)/24的前23位相同第24位不同所以聚合為/23。筆記里“最長前綴匹配”的規(guī)則在聚合后要記得如果有多條路由匹配選前綴最長的。參數(shù)說明routes列表里的網(wǎng)絡(luò)地址要寫完整比如192.168.0.0而不是192.168.0。zip(*bins)把每個(gè)地址的二進(jìn)制位對(duì)齊逐位比較。4.5 信道利用率與吞吐量筆記里數(shù)據(jù)鏈路層部分常考“停等協(xié)議、GBN、SR的信道利用率”。公式是U 發(fā)送時(shí)間 / (發(fā)送時(shí)間 往返時(shí)間)。我一般會(huì)讓學(xué)生用表格對(duì)比三種協(xié)議的窗口大小和利用率。協(xié)議發(fā)送窗口接收窗口信道利用率停等111/(12a)GBN2^n-11W/(12a)SR2^(n-1)2^(n-1)W/(12a)其中a 傳播時(shí)延 / 發(fā)送時(shí)延。筆記里那些“窗口越大利用率越高”的結(jié)論用這個(gè)表一對(duì)比就清楚。注意GBN的接收窗口是1SR的收發(fā)窗口相等且不超過2^(n-1)。5. 避坑與排查筆記復(fù)習(xí)中五個(gè)血淚教訓(xùn)5.1 坑一把筆記當(dāng)教材逐頁抄現(xiàn)象花了一個(gè)月抄完筆記合上本子什么都不記得。原因抄寫是機(jī)械動(dòng)作沒有主動(dòng)回憶。解決每看完一節(jié)合上筆記用白紙默寫關(guān)鍵圖和公式再對(duì)照筆記補(bǔ)漏。默寫不出來的才是真正需要反復(fù)看的。5.2 坑二忽略真題里的“超綱”細(xì)節(jié)現(xiàn)象筆記里沒講TCP的SACK選項(xiàng)但真題考了。原因筆記是主線不是全集。解決真題里出現(xiàn)的每個(gè)選項(xiàng)、每個(gè)字段都要回到RFC或教材里查清楚。比如SACK在RFC 2018筆記可能只提了一句但考試會(huì)考“SACK解決了什么問題”。5.3 坑三抓包實(shí)驗(yàn)只看不分析現(xiàn)象Wireshark抓了一堆包但不知道重點(diǎn)看哪個(gè)字段。原因沒有帶著問題抓包。解決每次抓包前先寫三個(gè)問題比如“三次握手的第二個(gè)包標(biāo)志位是什么”“序列號(hào)為什么是相對(duì)的”抓完只回答這三個(gè)問題其他包先忽略。5.4 坑四計(jì)算題只背公式不推導(dǎo)現(xiàn)象子網(wǎng)劃分題換個(gè)掩碼就不會(huì)了。原因背了“借位”口訣但沒理解二進(jìn)制。解決每道計(jì)算題都用Python腳本驗(yàn)證一遍把二進(jìn)制展開寫出來。比如/26的掩碼是255.255.255.192二進(jìn)制是24個(gè)1加2個(gè)0主機(jī)位6位。5.5 坑五錯(cuò)題不歸因只記答案現(xiàn)象同一類題反復(fù)錯(cuò)。原因只記了“選C”沒記“為什么A錯(cuò)”。解決每道錯(cuò)題寫三行考點(diǎn)是什么、我為什么錯(cuò)、正確思路是什么。比如“TCP三次握手”錯(cuò)題考點(diǎn)是“為什么需要第三次”我錯(cuò)在“以為第二次就夠了”正確思路是“防止已失效的連接請(qǐng)求突然到達(dá)服務(wù)器”。提示避坑的核心是主動(dòng)輸出??垂P記是被動(dòng)輸入默寫、講給別人聽、寫代碼驗(yàn)證才是主動(dòng)輸出。6. 把筆記變成可檢索的知識(shí)庫一個(gè)輕量級(jí)復(fù)習(xí)腳本的寫法最后一章講一個(gè)我常用的技巧把筆記里的關(guān)鍵概念和真題考點(diǎn)做成一個(gè)可檢索的本地知識(shí)庫。不用復(fù)雜工具一個(gè)Python腳本加一個(gè)Markdown文件就夠了。import re from pathlib import Path def build_index(note_file): 從Markdown筆記中提取標(biāo)題和關(guān)鍵句建立索引 text Path(note_file).read_text(encodingutf-8) # 提取所有二級(jí)和三級(jí)標(biāo)題 headings re.findall(r^#{2,3}\s(.)$, text, re.M) # 提取包含“考點(diǎn)”“注意”“公式”的句子 key_sentences re.findall(r[^。]*(?:考點(diǎn)|注意|公式|必考)[^。]*。, text) index {} for h in headings: index[h] [] # 簡單按標(biāo)題分段 sections re.split(r^#{2,3}\s, text, flagsre.M) for i, sec in enumerate(sections[1:], 1): title headings[i-1] if i-1 len(headings) else for sent in key_sentences: if sent in sec: index.setdefault(title, []).append(sent) return index def search(index, keyword): 在索引中搜索關(guān)鍵詞 results [] for title, sentences in index.items(): for sent in sentences: if keyword in sent or keyword in title: results.append((title, sent)) return results # 使用示例 index build_index(network_notes.md) for title, sent in search(index, TCP): print(f[{title}] {sent})這段腳本做了兩件事一是從Markdown筆記里提取所有標(biāo)題二是把包含“考點(diǎn)”“注意”“公式”的句子歸到對(duì)應(yīng)標(biāo)題下。build_index用正則匹配標(biāo)題和關(guān)鍵句search按關(guān)鍵詞過濾。這樣復(fù)習(xí)時(shí)輸入“TCP”就能看到所有相關(guān)標(biāo)題和關(guān)鍵句不用翻整本筆記。參數(shù)說明note_file是你的筆記文件路徑格式要是Markdown標(biāo)題用##或###。key_sentences的正則可以根據(jù)你的筆記習(xí)慣調(diào)整比如加上“易錯(cuò)”“區(qū)別”。search是簡單子串匹配夠用。我自己的習(xí)慣是每輪復(fù)習(xí)前先跑一遍這個(gè)腳本把高頻考點(diǎn)打印出來貼在墻上。復(fù)習(xí)完一輪把新發(fā)現(xiàn)的易錯(cuò)點(diǎn)補(bǔ)進(jìn)筆記再跑一次。這樣筆記不是靜態(tài)的文檔而是隨著復(fù)習(xí)不斷生長的知識(shí)庫。最后說一個(gè)教訓(xùn)我曾經(jīng)把筆記整理得漂漂亮亮但考試前一周才發(fā)現(xiàn)真正記住的都是那些我動(dòng)手算過、抓包看過、寫代碼驗(yàn)證過的內(nèi)容。筆記本身不是目的用它逼自己輸出才是。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取