戰(zhàn)指南:從網(wǎng)絡(luò)排查到故障定位的必備技能)
兄弟們干運(yùn)維和網(wǎng)絡(luò)這行的甭管你平時(shí)吹得多天花亂墜最后都得落到排查問(wèn)題這根鋼絲繩上。你跟我說(shuō)你網(wǎng)絡(luò)架構(gòu)玩得花我信但你說(shuō)你鏈路抖動(dòng)、應(yīng)用卡頓、用戶那邊嗷嗷叫的時(shí)候你連個(gè)包都沒(méi)抓明白那我只能說(shuō)兄弟你還得練。排查網(wǎng)絡(luò)問(wèn)題咱們不靠猜全靠看證據(jù)。而抓包這個(gè)動(dòng)作tcpdump就是那個(gè)最趁手、最不起眼、但最關(guān)鍵的工具。今天這篇不整虛的就聊聊tcpdump最普通的玩法。不是那種把man手冊(cè)給你抄一遍的教程而是從一個(gè)老運(yùn)維的實(shí)際工作角度把它當(dāng)成一把螺絲刀告訴你什么時(shí)候擰哪顆螺絲怎么擰不滑絲擰完之后怎么判斷螺絲到底緊沒(méi)緊??赐赀@篇你至少能對(duì)付掉工作里八成以上的網(wǎng)絡(luò)排查場(chǎng)景不用再遇到問(wèn)題就先重啟或者對(duì)著屏幕發(fā)呆。1. 為什么偏偏是它tcpdump的核心思路拆解先把心態(tài)擺正。tcpdump不是萬(wàn)能的它就是一個(gè)命令行下的抓包分析器原理簡(jiǎn)單得嚇人——把網(wǎng)卡上跑過(guò)的數(shù)據(jù)包按你的規(guī)則截獲一份副本然后要么打印到屏幕上要么存成文件給你慢慢分析。它的優(yōu)勢(shì)從來(lái)不是分析得有多深而是貼近底層、輕巧、靈活在服務(wù)器上一條命令就能跑起來(lái)不依賴任何花哨的圖形界面。很多人一上來(lái)就被各種各樣的參數(shù)嚇住了其實(shí)你只需要抓住三個(gè)核心點(diǎn)抓什么、抓多久、抓完怎么辦。抓什么這就是BPF過(guò)濾規(guī)則也就是伯克利包過(guò)濾語(yǔ)法。它是tcpdump的靈魂決定了你是把所有流量都撈上來(lái)還是只撈你關(guān)心的那部分。抓多久抓包不是錄監(jiān)控視頻不能無(wú)限錄。你需要明確時(shí)間窗口和包數(shù)量上限否則生成的文件能把你的磁盤撐爆。抓完怎么辦是直接在屏幕上實(shí)時(shí)滾動(dòng)看還是落盤保存成.pcap文件然后用Wireshark等工具去細(xì)看。這是兩種完全不同的工作模式一個(gè)適合臨時(shí)瞄一眼一個(gè)適合深挖慢查。這三個(gè)問(wèn)題想清楚了你已經(jīng)比百分之八十的初級(jí)使用者強(qiáng)。剩下的就是語(yǔ)法熟練度的問(wèn)題。記住我們是在有目的地取證而不是在海里撈針。2. 上場(chǎng)之前先拿最基本的幾個(gè)命令熱熱身上手別整那些花活先保證你能看到東西。2.1 抓包前的三件事先想明白第一你當(dāng)前要監(jiān)控哪塊網(wǎng)卡。用ip addr或者老的ifconfig看一眼找到你關(guān)心流量的那塊物理網(wǎng)卡名稱常見的比如eth0、ens192、em1。你要是連網(wǎng)卡都搞錯(cuò)了抓半天抓了個(gè)寂寞流量根本不過(guò)這塊卡純屬浪費(fèi)時(shí)間。第二你有沒(méi)有權(quán)限。tcpdump需要root權(quán)限才能抓包所以別老想著用普通用戶去執(zhí)行然后報(bào)錯(cuò)說(shuō)找不到設(shè)備先sudo -i或者檢查一下你的用戶是否在sudo組里。在有的生產(chǎn)環(huán)境里甚至得看看你的系統(tǒng)是不是SELinux或者AppArmor攔著你到時(shí)候報(bào)Operation not permitted都不知道是哪兒出了問(wèn)題。第三確定你要不要開混雜模式。網(wǎng)卡默認(rèn)只把發(fā)給自己MAC地址的包交給內(nèi)核處理但抓包工具通常會(huì)讓網(wǎng)卡進(jìn)入混雜模式把經(jīng)過(guò)這塊網(wǎng)卡的所有包都接收一份。所以我們經(jīng)常看到tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes這行提示其中promiscuous mode開沒(méi)開就說(shuō)明這件事。默認(rèn)情況下像在交換機(jī)鏡像口這種場(chǎng)景我們必須依賴混雜模式才能抓到別人的流量這個(gè)開關(guān)非常關(guān)鍵。2.2 從一個(gè)最樸素的抓包命令說(shuō)起比如說(shuō)我現(xiàn)在懷疑我這臺(tái)服務(wù)器訪問(wèn)某個(gè)數(shù)據(jù)庫(kù)有問(wèn)題最簡(jiǎn)單的我就想先看看連接能不能建立TCP握手能不能完成。直接在機(jī)器上敲tcpdump -i eth0 tcp port 3306這條命令的意思是在eth0這塊網(wǎng)卡上抓取TCP協(xié)議且目標(biāo)或源端口是3306的包。屏幕上開始一行行刷數(shù)據(jù)你會(huì)看到類似下面這樣的東西05:03:02.123456 IP 10.0.1.10.54321 10.0.1.20.3306: Flags [S], seq 123456789, win 64240, options [mss 1460,sackOK,TS val 123 ecr 0,nop,wscale 7], length 0 05:03:02.124002 IP 10.0.1.20.3306 10.0.1.10.54321: Flags [S.], seq 987654321, ack 123456790, win 65160, options [mss 1460,sackOK,TS val 456 ecr 123,nop,wscale 7], length 0 05:03:02.125001 IP 10.0.1.10.54321 10.0.1.20.3306: Flags [.], ack 987654322, win 512, length 0看到這個(gè)你就知道TCP三次握手是正常完成的。S是SYN包S.是SYN-ACK包.就是純ACK包。如果后面還有一串P開頭的包那就是攜帶了應(yīng)用層數(shù)據(jù)的PUSH包。這里有個(gè)小技巧Flags字母如果出現(xiàn)[F.]那就是正常四次揮手[R.]就是連接被重置了這往往是排查問(wèn)題的重要信號(hào)。如果我就想把這個(gè)過(guò)程實(shí)時(shí)看完那直接-n參數(shù)把域名和端口翻譯關(guān)掉讓輸出更快更干凈tcpdump -n -i eth0 tcp port 3306加了-n之后屏幕上就不會(huì)去做IP到域名的反解析也不會(huì)把3306顯示成mysql輸出速度更快也更純粹。特別是當(dāng)你抓的是公網(wǎng)流量反查DNS這個(gè)過(guò)程非常拖慢速度甚至?xí)驗(yàn)镈NS解析超時(shí)導(dǎo)致輸出卡頓所以-n是我在任何抓包場(chǎng)景里幾乎必帶的一個(gè)參數(shù)。2.3 不只會(huì)抓還要會(huì)看基本輸出很多新手看到tcpdump輸出的原始行就像看天書一樣其實(shí)拆開看很簡(jiǎn)單。我也順手給你解讀一下標(biāo)準(zhǔn)輸出格式的幾段信息時(shí)間戳是第一個(gè)字段精確到微秒級(jí)是判斷延遲的重要依據(jù)。然后是協(xié)議層頭信息比如IP表示這個(gè)包是裸的IP包如果是ARP那就會(huì)顯式寫出來(lái)。再往后是源地址源端口 目的地址目的端口這個(gè)指向關(guān)系可以讓你快速判斷數(shù)據(jù)流向。然后是很關(guān)鍵的Flags也就是TCP控制位。S建連、F斷開、R重置、P推送數(shù)據(jù)、E顯式擁塞混合標(biāo)志位用點(diǎn)號(hào)分隔。seq和ack則是TCP序號(hào)和確認(rèn)號(hào)專門用來(lái)分析重傳和亂序。最后面的win是接收窗口大小可用來(lái)辨別接收方緩存壓力。把這些字段拼在一起你就能在屏幕世界里看見兩臺(tái)機(jī)器之間到底發(fā)生了什么。熟練之后很多網(wǎng)絡(luò)故障從表面現(xiàn)象到根因方向在你腦子里一瞬間就能拉出一條線來(lái)。3. 進(jìn)階玩法像篩金子一樣用過(guò)濾表達(dá)式基礎(chǔ)命令會(huì)了接下來(lái)得學(xué)會(huì)“挑食”。電腦網(wǎng)絡(luò)上的數(shù)據(jù)包就像嘈雜集市里的人群你得學(xué)會(huì)只盯著你想找的那個(gè)目標(biāo)而不是把所有人都喊到你面前來(lái)一個(gè)一個(gè)看。3.1 過(guò)濾主機(jī)只關(guān)心源或目的IP排查問(wèn)題時(shí)最常用的就是限定主機(jī)。比如我懷疑后端服務(wù)器10.0.2.5返回?cái)?shù)據(jù)有問(wèn)題那我只抓跟它相關(guān)的流量tcpdump -nn -i eth0 host 10.0.2.5這里用了兩個(gè)n既不做域名反解也不翻譯端口號(hào)純純的數(shù)字化輸出速度最極致。如果你還想精確到是我本機(jī)發(fā)給它還是它發(fā)給我那就再加方向限定詞tcpdump -nn -i eth0 src host 10.0.2.5 tcpdump -nn -i eth0 dst host 10.0.2.5src和dst這兩個(gè)詞非常直觀組合使用能精準(zhǔn)鎖定單向流量。還有更靈活的src or dst組合比如我要看所有從10.0.2.5來(lái)或者去往10.0.2.6的流量tcpdump -nn -i eth0 src host 10.0.2.5 or dst host 10.0.2.6單引號(hào)包起來(lái)很重要因?yàn)閛r、and這些關(guān)鍵字會(huì)被shell解釋成管道或者邏輯符號(hào)別看小看這層單引號(hào)少了它很多命令執(zhí)行結(jié)果會(huì)直接崩掉或者行為大變。3.2 過(guò)濾端口直擊服務(wù)的咽喉端口過(guò)濾是跟具體應(yīng)用排查綁定的。比如排查web服務(wù)直接抓80或443端口tcpdump -nn -i eth0 tcp port 443但我個(gè)人更推薦你直接寫全五元組邏輯源端口目的端口分開寫因?yàn)橛袝r(shí)候你想?yún)^(qū)分是外部請(qǐng)求進(jìn)來(lái)還是內(nèi)部向外請(qǐng)求。比如我只想看本機(jī)eth0上對(duì)外發(fā)起的連接那目的端口一定是遠(yuǎn)程的443tcpdump -nn -i eth0 dst port 443反過(guò)來(lái)像收集內(nèi)部服務(wù)日志或觀測(cè)出網(wǎng)流量那就看源端口tcpdump -nn -i eth0 src port 53這里的邏輯還可以用portrange來(lái)抓端口段。比如某個(gè)游戲服務(wù)器開了一大片UDP端口從20000到30000寫起來(lái)就是tcpdump -nn -i eth0 udp portrange 20000-30000這種連續(xù)端口的匹配在排查P2P或者RPC類服務(wù)的時(shí)候特別給力不然一條條端口寫進(jìn)去手都能給你寫酸。3.3 協(xié)議與多條件組合把網(wǎng)撒得剛剛好最后來(lái)點(diǎn)真正有實(shí)戰(zhàn)感的組合。比如你要定位是不是有人在你內(nèi)網(wǎng)里搞ARP欺騙那就直接只抓ARP協(xié)議tcpdump -nn -i eth0 arp比如你要排查DNS解析慢的問(wèn)題又不想抓太多無(wú)關(guān)流量可以限定UDP端口53tcpdump -nn -i eth0 udp port 53遇到那種既有TCP又有UDP的服務(wù)比如某些基于QUIC/HTTP3的應(yīng)用想一把梭全抓下來(lái)tcpdump -nn -i eth0 (tcp or udp) and port 8443這行表達(dá)式里的括號(hào)也同樣需要單引號(hào)保護(hù)。另外有個(gè)更實(shí)在的建議你真的特別明確就要某一種類型比如排除掉SSH的22端口干擾那你可以直接tcpdump -nn -i eth0 port not 22 and host 10.0.2.5活了。這一套組合拳打下來(lái)你要的流量就像從沙子里淘出來(lái)的金子其余無(wú)關(guān)數(shù)據(jù)全都安靜地躺在內(nèi)核緩沖區(qū)之外。這里多插一句經(jīng)驗(yàn)過(guò)濾器并不是越復(fù)雜越好規(guī)則寫得越寬內(nèi)核拷貝到用戶態(tài)的數(shù)據(jù)越多丟包概率越大。所以先寬后窄先抓到方向、再細(xì)摳顆粒度是實(shí)戰(zhàn)里效率最高的節(jié)奏。4. 落盤為王生產(chǎn)環(huán)境必會(huì)的抓包姿勢(shì)實(shí)時(shí)滾動(dòng)看幾眼適合臨時(shí)驗(yàn)證但遇到那種老大看了半天才說(shuō)“好像有點(diǎn)不對(duì)勁”的疑難雜癥我們就得把包保存下來(lái)拿回去慢慢分析。4.1 寫出文件與循環(huán)切割保存成.pcap文件的命令很常規(guī)tcpdump -i eth0 -w /tmp/capture.pcap tcp port 8080這里有個(gè)極其重要的點(diǎn)寫文件模式下屏幕上不會(huì)打印每一行抓包信息因?yàn)槟愀嬖V它把原始包寫到文件里它就不做實(shí)時(shí)翻譯了。很多人第一次用半天沒(méi)輸出以為卡死了其實(shí)它是默默在后臺(tái)干活。如果需要一邊抓一邊確保文件數(shù)量可控可以用-C參數(shù)按大小分割文件單位是MBtcpdump -i eth0 -w /tmp/capture.pcap -C 100 tcp port 8080這行命令表示單個(gè)文件超過(guò)100MB就自動(dòng)新建下一個(gè)文件后面會(huì)跟著生成capture.pcap、capture.pcap1、capture.pcap2這樣的序列文件。也可以按時(shí)間切片-G 60表示每60秒切一個(gè)文件適合長(zhǎng)時(shí)間無(wú)人值守。這種循環(huán)切文件的方式在生產(chǎn)排查里就是神器既能防止單個(gè)文件過(guò)大拖垮后期分析也能讓回傳文件時(shí)間點(diǎn)更精確。4.2 控制抓包時(shí)長(zhǎng)和包數(shù)量抓包不能無(wú)限期抓下去要給個(gè)極限約束。比如我就是想抓3分鐘看看情況timeout 180 tcpdump -i eth0 -w /tmp/capture.pcap -n host 10.0.2.5用timeout命令來(lái)限時(shí)這是一個(gè)很可靠的做法比后臺(tái)掛PID然后手動(dòng)殺要優(yōu)雅得多。另外也可以用-c數(shù)量控制抓到一定包數(shù)自動(dòng)退出tcpdump -i eth0 -c 2000 -w /tmp/capture.pcap這里-c 2000意思就是抓滿2000個(gè)包就自己停了適合你只想快速采樣幾個(gè)包驗(yàn)證協(xié)議特征時(shí)用。要知道有時(shí)候你并不需要全程錄屏前幾秒的特征足以說(shuō)明問(wèn)題。結(jié)合-c加上-w這個(gè)組合是典型的快速取證姿勢(shì)比如你接到報(bào)警說(shuō)某臺(tái)機(jī)器瘋狂發(fā)包抓2000個(gè)包看看包長(zhǎng)跟目標(biāo)往往幾秒就能鎖到具體進(jìn)程的特征。4.3 落盤抓包的緩沖區(qū)大小調(diào)節(jié)生產(chǎn)環(huán)境流量稍微大一點(diǎn)你會(huì)碰到一個(gè)很頭疼的坑抓包丟包。這個(gè)時(shí)候就需要調(diào)整內(nèi)核抓包緩沖區(qū)大小參數(shù)是-B單位是KB。默認(rèn)值往往只有幾MB高并發(fā)下瞬間就被打滿新到的包只能丟棄。常見做法是拉高到幾十甚至幾百M(fèi)Btcpdump -i eth0 -B 4096 -w /tmp/huge_capture.pcap-B 4096意思是緩沖區(qū)設(shè)為4MB注意這個(gè)單位默認(rèn)KB。這能顯著降低高流量場(chǎng)景下的丟包率。雖然tcpdump在退出時(shí)會(huì)打印一條包含dropped kernel的統(tǒng)計(jì)信息但你要是看完包再發(fā)現(xiàn)丟包嚴(yán)重再回頭重新抓可就麻煩多了。所以流量很大的場(chǎng)景開局就先把緩沖區(qū)拉高別省著用。還有一個(gè)很有用的參數(shù)是-s控制每個(gè)包抓取的長(zhǎng)度也就是snaplen。默認(rèn)是262144字節(jié)256KB但絕大多數(shù)常見協(xié)議我們只看頭部和部分載荷就行了。為了減小文件體積可以設(shè)成tcpdump -i eth0 -s 128 -w /tmp/small.pcap這樣每個(gè)包就只保留前128字節(jié)足以看到TCP/UDP頭以及部分應(yīng)用層信息。這在無(wú)線網(wǎng)卡或者流量大的環(huán)境里非常節(jié)省空間代價(jià)是你可能看不到完整的應(yīng)用載荷需要根據(jù)實(shí)際需求權(quán)衡。有一點(diǎn)提醒有些協(xié)議比如TLS證書、某些文件傳輸要看全證書或全載荷這時(shí)候-s 0才代表完整抓取整個(gè)包別到時(shí)候抓完發(fā)現(xiàn)里面只有一截?cái)?shù)據(jù)悔到腸子都青了。4.4 直取出可讀的十六進(jìn)制和ASCII內(nèi)容有時(shí)候你不想開Wireshark就是想快速看看包里的實(shí)際內(nèi)容。這時(shí)候可以用-X或者-A。-A把包以純ASCII形式打印出來(lái)適合看HTTP明文請(qǐng)求和響應(yīng)-X則同時(shí)輸出十六進(jìn)制和ASCII適合檢查二進(jìn)制協(xié)議細(xì)節(jié)或加密流量的特征。tcpdump -nn -i eth0 -A -s 0 tcp port 80這條命令會(huì)把80端口的所有TCP載荷以可讀字符形式刷出來(lái)排查HTTP接口調(diào)試時(shí)特別直觀。你會(huì)直接看到GET / HTTP/1.1、Host:之類的請(qǐng)求行限流了、亂碼了、參數(shù)丟了一眼就能判斷。5. 真實(shí)排障演練一次假性超時(shí)的血淚實(shí)錄理論講了一大堆不發(fā)點(diǎn)實(shí)戰(zhàn)總覺(jué)得心里不踏實(shí)。跟大家分享一個(gè)我親身經(jīng)歷過(guò)的排查案例讓我們把前面這些參數(shù)串起來(lái)用一遍。某個(gè)周五下午業(yè)務(wù)方那邊反饋說(shuō)調(diào)用一個(gè)內(nèi)部接口經(jīng)常超時(shí)但又不是每次必現(xiàn)大概兩三次里有一次要等好幾秒。監(jiān)控看CPU、內(nèi)存都沒(méi)啥壓力數(shù)據(jù)庫(kù)負(fù)載也不高。這種間歇性超時(shí)最折磨人因?yàn)闊o(wú)從下手。我決定在應(yīng)用服務(wù)器網(wǎng)卡上落盤抓包。先確認(rèn)網(wǎng)卡名是eth0然后用了這么一條命令tcpdump -nn -i eth0 -B 2048 -s 128 -w /tmp/app_timeout.pcap tcp port 8080 and host 10.10.20.15抓了大概十分鐘等到業(yè)務(wù)方又反饋一次超時(shí)之后我把包拿了回來(lái)。直接用Wireshark打開先看TCP流。結(jié)果發(fā)現(xiàn)一個(gè)很有意思的現(xiàn)象客戶端發(fā)出的請(qǐng)求包帶P標(biāo)志數(shù)據(jù)段已經(jīng)到達(dá)服務(wù)器IP但服務(wù)器這邊遲遲沒(méi)回ACK然后客戶端就開始瘋狂重傳。重傳了好幾輪服務(wù)器終于是回了一個(gè)S.不對(duì)是回了一個(gè)R也就是連接重置。看起來(lái)就像是業(yè)務(wù)層把連接關(guān)了。順著這個(gè)方向去查發(fā)現(xiàn)后端Tomcat的線程池配置有問(wèn)題活躍線程數(shù)上限設(shè)得太低請(qǐng)求一多連接就被pending最終觸發(fā)超時(shí)重置??蛻舳丝吹降氖菐资氤瑫r(shí)實(shí)際上瓶頸根本不在網(wǎng)絡(luò)鏈路而在于服務(wù)端應(yīng)用線程池滿。這個(gè)結(jié)論可以說(shuō)完全是依靠抓包鎖定到端口的如果不是看到TCP層面的重傳和RST時(shí)間點(diǎn)我們可能還在傻乎乎查中間交換機(jī)丟包和防火墻策略。這里的經(jīng)驗(yàn)總結(jié)就是抓到包后別急著看亂七八糟的幾百兆數(shù)據(jù)先按照時(shí)間順序過(guò)濾出幾個(gè)關(guān)鍵節(jié)點(diǎn)找TCP重傳TCP Retransmission、找RST、找零窗口Zero Window這三個(gè)信號(hào)基本能覆蓋大部分“網(wǎng)絡(luò)慢”的根因方向。6. 那些年我們踩過(guò)的坑tcpdump使用常見問(wèn)題速查玩的時(shí)間久了總會(huì)有些小坑反反復(fù)復(fù)出現(xiàn)。我把它們整理成表格方便你對(duì)著查。問(wèn)題現(xiàn)象大概率原因解決/排查方向屏幕上什么都看不到過(guò)濾規(guī)則寫錯(cuò)、網(wǎng)卡選錯(cuò)、流量確實(shí)沒(méi)走這塊網(wǎng)卡先用-i any抓所有網(wǎng)卡拿掉過(guò)濾條件試試確認(rèn)抓包機(jī)器是否在流量路徑上提示Permission denied非root用戶執(zhí)行sudo執(zhí)行或者給普通用戶配置CAP_NET_RAW能力抓包過(guò)程中丟包嚴(yán)重緩沖區(qū)太小或CPU不夠用-B調(diào)大緩沖區(qū)減少無(wú)關(guān)抓包范圍用-s限制抓包長(zhǎng)度文件寫入特別巨大抓包范圍太寬或snaplen太大嚴(yán)格限定host/port組合使用-s 128限制載荷用-C/-G自動(dòng)切割文件tcpdump: syntax error過(guò)濾表達(dá)式引號(hào)沒(méi)加或?qū)戝e(cuò)檢查是否用了單引號(hào)檢查語(yǔ)法中and、or的優(yōu)先級(jí)用括號(hào)包裹條件時(shí)務(wù)必加引號(hào)抓到包但Wireshark打不開文件未正常結(jié)束或抓包過(guò)程中被強(qiáng)殺用-w落盤務(wù)必用timeout或者-c限制別用kill -9強(qiáng)殺進(jìn)程只看到請(qǐng)求沒(méi)看到ACK負(fù)載均衡器做了代理或者本機(jī)防火墻攔了確認(rèn)流量路徑上是否有四層負(fù)載設(shè)備檢查本機(jī)iptables規(guī)則想抓但機(jī)器帶寬已被打滿抓包本身成為最后一根稻草改用硬件鏡像旁觀抓包或先做流量限速及時(shí)止損別硬抓最后再給大家一個(gè)殺手锏級(jí)別的提醒如果你要在生產(chǎn)環(huán)境長(zhǎng)期蹲點(diǎn)千萬(wàn)別忘了-Z root參數(shù)。默認(rèn)tcpdump在打開抓包設(shè)備后會(huì)把自己降權(quán)到tcpdump用戶來(lái)執(zhí)行以防止安全問(wèn)題。但有些環(huán)境下這個(gè)降權(quán)反而導(dǎo)致無(wú)法寫文件。如果你遇到這種詭異問(wèn)題加個(gè)-Z root操作就能解決。當(dāng)然這是個(gè)雙刃劍自己評(píng)估風(fēng)險(xiǎn)再上別亂用。再分享一個(gè)我自己的習(xí)慣抓完包之后不管有沒(méi)有發(fā)現(xiàn)問(wèn)題我都會(huì)寫一行小字記錄在案的命令行。這樣一個(gè)月后看到這個(gè)文件還能回憶起當(dāng)初抓包時(shí)的范圍和意圖而不是對(duì)著幾百兆的二進(jìn)制文件發(fā)愁我已經(jīng)忘了自己在驗(yàn)證什么。如果你從頭看到這里恭喜你至少已經(jīng)從“會(huì)用tcpdump”進(jìn)階到“知道為什么這么用tcpdump”的階段了。工具永遠(yuǎn)是死的能靈活組合思路去抽絲剝繭才是這行真正值錢的地方。下次線上出故障別慌先深吸一口氣把上面這些招數(shù)從頭到尾過(guò)一遍多半就能摸到一點(diǎn)門道。