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

軒轅之風發表於2021-04-29

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

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

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

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

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

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

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

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

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

老師講了一大堆協議啊,區域網、廣域網、網路裝置啥的,我卻聽著聽著經常就神遊太虛了。

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

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

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

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

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

我的經歷

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

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

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

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

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

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

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

有一天晚上,實驗室的老師安排了高一屆的師兄們給我們講解了如何抓包,怎麼檢視網路通訊資料。

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

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

在抓包軟體下,網路的分層不再是一個靜態的分層模型圖,而是看得到的一層又一層的報文頭,從鏈路層的乙太網協議,到網路層的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》

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

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

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

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

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

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

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

但我沒有。

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

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

第二個層次,抓包。

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

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

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

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

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

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

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

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

第三個層次,程式設計。

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

那寫點什麼型別的程式碼好呢?

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

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

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

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

第三類,更進一步,可以嘗試編寫一些核心驅動程式,通過作業系統提供的介面,進行資料包的監控、攔截過濾與修改、通訊阻斷,實現一些有趣的功能,比如自己實現一個簡單防火牆,開發一個程式通訊監控軟體等等。

再說幾句

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

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

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

相關文章