我是如何把計算機網絡考了100分的?


有讀者問我:軒轅,你是怎么學計算機網絡的?

鴿了好久,今天得空聊聊這個話題。

軒轅是通信工程專業,計算機網絡通信自然是必學內容。

我猜,絕大多數同學的計算機網絡知識,估計都是在學生時代,抱着謝希仁那本厚厚的《計算機網絡》課本,老師念着上個世紀就傳承至今的教案PPT得來的。

如果運氣好,老師講的不錯,還學的進去。

如果運氣不好,老師只是一個PPT播放機的話,那就···

很不幸,我就是運氣不好的那種。

老師講了一大堆協議啊,局域網、廣域網、網絡設備啥的,我卻聽着聽着經常就神游太虛了。

一次偶然,發現隔壁班的計算機網絡是當初教計算機二級的老師在上課,這位老師的講課風格一直是我非常喜歡的,於是我和兩個小伙伴就一起溜進去蹭課,這一蹭不要緊,一下就上了癮。

這位老師風格獨立,根本不用學校發的教材,而是自己編寫了一套PPT,從最底層的原理講起,從通信的編碼校驗,到局域網的802.3、802.4、802.5等技術演進,用生動有趣到生活實例告訴我們什么是CSMA/CD,聽得我們如痴如醉。我現在寫的很多故事性的文章,一定程度上都有這位老師的影響。

在我們幾個的口口相傳下,我們班在上計算機網絡課時,門可羅雀,而隔壁班人卻越來越多,不知道我們的計算機網絡老師看到后心里有何感想。

果然,老師的力量還是很大的,一下子就開了竅似的,學起來簡單多了,期末考試輕松拿下100分。

我的經歷

期末考試結束后就是暑假,我進入學校的網絡安全實驗室了,進入之后的第一個任務,也是事關我們能否留下來的考核題目來了:編寫一個HTTP流量還原的軟件。

程序要求:輸入一個從wireshark等抓包軟件導出的pcap文件,輸出這其中所有傳輸的HTTP內容,包括HTML、CSS、JS、JPEG、PNG、GZIP等等內容。

包括我在內,同批次進入實驗室的總共有5個人,大家各自負責不同的協議流量還原,有FTP、SMTP、HTTP、IMAP、POP3,我算運氣好的,因為HTTP相對來說是最熟悉的了。

那時剛剛大一暑假,才剛剛學完C語言,雖然已經提前自學了C++,但面臨這個題目還是慌了。

最大的問題就是,網絡數據包只在課本里學過報文格式,我也沒見過真正的數據包長啥樣,也不知道在pcap文件里怎么存儲的,更不知道如何把HTTP傳輸的數據給還原出來了。

總之,就是當時對網絡流量的認識還停留在類似上面這樣的圖上,至於數據包長啥樣則完全沒概念。

有一天晚上,實驗室的老師安排了高一屆的師兄們給我們講解了如何抓包,怎么查看網絡通信數據。

那是我第一次在抓包軟件下看到了網絡中數據流量的真實樣子,觸動特別大,平時躺在書本上的報文格式,現在活生生的出現在了眼前,每一個字節,甚至每一個比特的意義都在抓包軟件下看的清清楚楚,原來,網絡是可以看到的!

在抓包軟件下,網絡的分層不再是一個靜態的分層模型圖,而是看得到的一層又一層的報文頭,從鏈路層的以太網協議,到網絡層的IP協議,再到老大難的TCP頭部,再到上面的應用層協議,那一串二進制比特流數據,用一棵協議樹的形式對應了起來。

那幾天,我們都在集中學習抓包,看着自己瀏覽的網頁數據,最后都能在抓包軟件中找到它,我對計算機網絡的理解開始變得立體起來。

抓包學的差不多,就要開始編寫程序完成任務了。

在C/C++語言中,為了處理報文數據,就會定義各種各有的協議結構體,這一來,又進一步強化了對每個字段的理解,因為它不再是書本上一個簡單的字段名字,它變成了我代碼結構體中一個實實在在存在的成員變量。

typedef struct _ip_hdr  
{  
    #if LITTLE_ENDIAN   
    unsigned char ihl:4;     //首部長度   
    unsigned char version:4, //版本    
    #else   
    unsigned char version:4, //版本   
    unsigned char ihl:4;     //首部長度   
    #endif   
    unsigned char tos;       //服務類型   
    unsigned short tot_len;  //總長度   
    unsigned short id;       //標志   
    unsigned short frag_off; //分片偏移   
    unsigned char ttl;       //生存時間   
    unsigned char protocol;  //協議   
    unsigned short chk_sum;  //檢驗和   
    struct in_addr srcaddr;  //源IP地址   
    struct in_addr dstaddr;  //目的IP地址   
}ip_hdr;  

這里插一句,以前學C語言,學到聯合體union、位域這些東西時一直不知道怎么用以及有啥用,直到去處理解析這些協議頭數據的時候才發現:哇靠!真香!

說回我的程序,我的程序分為了兩個階段,第一步,先把pcap中存儲的數據包都展示出來,這一步主要是文件格式處理和數據包的分層解析。

第二步,識別HTTP會話,提取傳輸的內容。

這第一步倒還好,熟悉了文件格式和報文分層的格式后,循環遍歷pcap文件內容,挨個分層解析協議即可。

但是這個第二步就有些困難了,最重要的就在於HTTP的傳輸層是TCP,TCP里面涉及到超時重傳、亂序等一些復雜的情況,要完整的合並一個會話,考慮到上面這些情況,就沒那么容易了。

不過,困難亦是機遇,一直對計算機網絡協議中的TCP這頭攔路虎有些懼怕,這一次是時候跟它好好把話說清楚,道明白。

序列號SEQ和確認號ACK是TCP傳輸的基石,抓住這倆家伙,就能抓住TCP會話的脈絡。

經過一陣研究摸索,總算寫出了一套算法來進行會話流的重組,雖然現在回過頭去看還是有很多考慮不足之處,但在當時已經能解決面臨的問題。

通過編程來進行流重組的過程,對TCP的超時重傳、擁塞控制、滑動窗口、數據亂序等細節有了完全不一樣的理解。

以前只是從概念上記住理解,而現在是自己要從代碼層面處理這一個個的場景,這個掌握的深度自然是不一樣的。

差不多一個月后,暑假過了一半兒,我總算把這個程序寫了出來,看着自己上網的內容被自己的軟件完整的還原出來,心里那種感覺,別提多有成就感了。

那時候開始,我對網絡中數據的傳輸從里到外到底如何在工作有了全新的認識。它不再是停留在課本上那一張張靜態的報文格式圖。

一點通而多點通,有時候一個關鍵的點弄通透了以后,學習其他相關問題就會有豁然開朗的感覺了。

知道了網絡中的數據如何在傳輸,再回過頭去看那些各種各樣的網絡協議就輕松多了。

這時候再把視角拔高一些,為什么網絡協議要分層,每層的職責是什么,集線器跟交換機組網區別是什么,這些問題不用看書,自己就能回答上來了,它確實就該是那樣子的!

方法總結

計算機網絡這門課,屬於計算機四大基礎課程之一,無論是什么技術棧,只要從事計算機行業都得學。

而學習的方法和途徑呢,我推薦的方法是看書學理論+實戰相結合的方式。

第一個層次,看書+看視頻。

雖然看書很是頭疼,但基礎知識最好還是得通過看書來獲得。

看的時候呢可能會遇到各種各樣的疑問和困難,這時候我建議先從整體把關,不必拘泥在某個字段上。先對計算機網絡先有一個初步的認識,知道這大概是個什么東西,解決了什么問題。

有了初步的概念和大體的認識,再逐層細化。

推薦書目:

  • 《TCP/IP協議詳解》(卷一)
  • 《網絡是怎樣連接的》
  • 《圖解TCP/IP》

如果實在是覺得看書學不進去,那我推薦你可以去看視頻,這年頭,視頻學習資料到處都是,只要你肯花功夫,通過視頻也能學好。

視頻呢也分兩種類型,一種是高校的公開課,你可以在網上找到一些計算機專業比較知名的學校,看看他們的公開課,比如清華大學、電子科技大學、上海交大等等。

這一類視頻的特點是比較中規中矩,就像在大學里面上課一樣,氛圍感會更強一點,缺點是可能顯得有些枯燥,不過畢竟是名校的資源,比較系統全面,更靠譜一些。四舍五入就相當於在這里上學了。

另外一種就是一些自媒體博主,或者一些機構推出的專欄課程。這一類相對更新一些,照顧到年輕人的口味,會用一些動畫之類的方式來呈現,講述的也更有趣一些。

按照套路,我是不是應該推薦幾個放在這里?

但我沒有。

我覺得吧,視頻課程每個人的口味都不太一樣,畫面、PPT質量、老師的聲音、語速、講述風格等都有要求。

授人以魚不如授人以漁,大家可以去B站、網易雲課堂上面搜一下,這兩類的視頻都有許多,其中不乏高質量的視頻,建議多去看幾個比較比較,看看自己更喜歡哪一款。

第二個層次,抓包。

看書和視頻,這些知識還只是靜態的,紙上得來終覺淺,想要掌握扎實,就得學會抓包,自己親自動手抓一抓網絡中傳輸的數據包,看一下它們到底長什么樣子,並通過抓包工具分析各個協議的各個字段的作用,把前面學來的理論知識實際用起來。

這里我列舉一些可以關注的抓包場景:

  • ping一個IP地址,抓包分析IP+ICMP
  • ping一個域名,抓包分析UDP+DNS
  • ping一個局域網IP,抓包分析ARP
  • 禁用網卡重新啟用,抓包分析DHCP
  • 訪問一個網站域名(非HTTPS),抓包分析TCP和HTTP
  • 訪問一個網站域名(HTTPS),抓包分析HTTPS

至於抓包工具選擇,可以看看我的這篇文章:我抓了一個包,你不想看看?

而且,學會了抓包,也會在工作中排查問題大有幫助,實在是程序員必備技能!

這里再推薦兩本抓包分析書籍:

就像書的標題一樣,網絡分析就這么簡單!作者文筆出眾,不是那種一板一眼的教科書,從實際工作中遇到的問題出發,引領你學習,很容易看進去。

第三個層次,編程。

達到第二個層次,對於大多數人已經足夠了。但如果你想對計算機網絡了解對更深一些,或者你的工作與網絡緊密相關,那么寫點代碼絕對是不二之選。

那寫點什么類型的代碼好呢?

第一類是編寫我上面說的那種網絡流量數據分析軟件,通過分析處理真實的數據包,實際處理每一層每一類協議的每個字段,哪怕你只是把數據包內容分層展示出來,那也是有非常大的幫助。

第二類就是編程來收包和發包。我們平常使用套接字編程,一般都是封裝的應用層協議,如果你是學習應用層協議,用套接字就可以,比如你可以寫一個簡單的靜態webserver,對HTTP協議進行封包解包。

而如果你想學習更底層協議的封包,比如TCP、UDP、ICMP、ARP、IP這些協議,那就得另謀他法,比如原始套接字,比如一些開源SDK等。

第三類,更進一步,可以嘗試編寫一些內核驅動程序,通過操作系統提供的接口,進行數據包的監控、攔截過濾與修改、通信阻斷,實現一些有趣的功能,比如自己實現一個簡單防火牆,開發一個進程通信監控軟件等等。

再說幾句

上面只是對於開發人員的一些建議,對於專業的網絡工程師、運維會有所不同,可能還需要學習組網技術、交換機/路由配置、防火牆和網絡安全等相關的知識。

以上就是我的一些學習計算機網絡的心得體會,希望對大家有所參考借鑒,有疑問的朋友歡迎添加我的個人xx交流:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM