原創聲明
本文首發于微信公衆号【程式員黃小斜】
本文作者:黃小斜
轉載請務必在文章開頭注明出處和作者。
思維導圖
簡介
上一期我講到了資料結構怎麼學,當時我的學習方法是先看視訊,再看書,然後刷一刷基礎算法題做鞏固。
作為一個非科班考研黨,當時覺得這個學習路線還是比較平滑的,畢竟能讓我一個小白快速學會,這門課相對來說還是比較簡單的。
于是,等我讀研的時候,打算以相同的學習方式來補一下其他幾門計算機基礎課程,首當其沖的就是計算機網絡。
因為這門課實在重要,幾乎是面試必問的内容,什麼TCP/IP三次握手,四次揮手,TCP和UDP差別,HTTP協定的一堆面試題,在程式員面試時都是很常見的考題,你們應該也深有體會。
計算機網絡中的複雜概念遠不止這些,那麼按照老規矩,我們先來看一下計算機網絡到底是個啥。
根據百度百科的介紹,計算機網絡是指将地理位置不同的具有獨立功能的多台計算機及其外部裝置,通過通信線路連接配接起來,在網絡作業系統,網絡管理軟體及網絡通信協定的管理和協調下,實作資源共享和資訊傳遞的計算機系統。
相比于資料結構的介紹,百科上對于計算機網絡的介紹更加好懂一些,簡單來說,計算機網絡就是把計算機通過通信線路連接配接起來,實作網絡互聯和資訊傳遞。
為什麼要學計算機網絡
在這個時代,離開了網絡,簡直沒有辦法生存,而我們所學的程式設計知識,脫了網絡去談也将毫無意義,畢竟沒有哪個程式設計語言是隻支援單機運作的。
作為一個程式設計學習者,當你在學習一門語言時,比如Java,你可能會學到一些基本文法,面向對象的基礎、集合類的使用,甚至是多線程、IO流以及異常處理,這種時候你往往意識不到計算機網絡的重要性,反正我寫代碼也不涉及網絡傳輸,平時的工作也隻是CRUD,學習計算機網絡也沒有什麼用武之地。
曾幾何時我也是這麼想的,但是到後來,我開始接觸Tomcat,接觸Nginx,以及Java中的網絡程式設計技術,比如BIO和NIO,甚至是網絡程式設計架構netty,在沒有計算機網絡基礎的情況下來看這些東西,絕對會讓你懷疑人生。
最早我開始意識到自己計算機網絡基礎薄弱時,還是我在學習docker容器方面的知識時,接觸到了docker的網絡原理,比如docker的網絡模式有橋接和host兩種,然而我當時基本上看不懂這是什麼東西。
類似地,我在學習OpenStack的時候,也完全看不懂裡面的網絡元件是做什麼用的。
就算你不學習網絡程式設計、虛拟化和容器排程,你也得學學平時家裡的ip位址、DNS和子網路遮罩怎麼配置吧,沒認真學習計算機網絡之前,我對這些東西甚至都是一臉懵逼的。
不懂計算機網絡的我,想要學程式設計,真的太難了!
如何學習計算機網絡
第一次接觸
大學的時候,我們本有一門選修課就是計算機網絡,但是當時我沒有選它(現在覺得選了可能也聽不大懂,但是多少有點印象)
讀研的時候,開始狂補計算機基礎,當時為自己選了第一本書《計算機網絡(謝希仁)》作為入門教材,現在想想當時真是年幼無知,自己完全可以去某乎看一下推薦書單的。
這本書作為一本大學通用教材,年代之久遠,内容之枯燥,都是在這麼多計算機網絡書籍裡排的上号的,我已經快忘記當時是怎麼把這本書啃完的了。
雖然這本書還沒有到大部頭的級别,但是裡面的内容真的對新手不怎麼友好,通篇的都是概念的堆疊和并不容易了解的概念介紹。
教科書,大家都懂的,大部分都已經脫離時代,雖然計算機網絡這幾年的變化不大,但是它裡面的一些教學方法确實是和時代脫節了。
我隻記得這本書,當初看完一周就忘光了,後面不管是筆試面試,還是重新複習的時候,基本上也想不起來當初都學了啥,真是一本神奇的好書。
入門學習階段
吃過了教材的虧之後,我終于學會了上某乎找書單了,當時除了購買了一堆Java書籍之外,還特地買了一本《TCP/IP卷一》以及《圖解HTTP》準備開始第二輪對于計算機網絡的死磕。
當時也投了一些履歷,準備了一些面試,刷過一些面試題,其中面到計算機網絡的機率很大,于是我每天都會花一些時間來看着兩本書。
不知道是不是我了解能力有問題,當我看《TCP/IP詳解卷一》這本備受推崇的計算機網絡書籍時,我竟然有一種再看當初那本教材的感覺,這本大部頭,貌似也是在講一堆複雜的概念,并且用一些不好懂的講解去解釋這些概念。
當時我的自信心就有點受挫了,難道計算機網絡真就這麼難麼,為什麼這本書我仍然看不懂?
現在看來,計算機網絡确實是一門純理論的課程,除了一些網絡抓包和用開發者工具檢視網絡請求之外,基本上沒有什麼需要實踐的内容,現在很多書從網絡抓包入手講解計算機網絡,其實也是一種不錯的新型學習方法。
一本書适不适合一個人,真的是因人而異,特别是這種專業技術書籍,不同水準的人看效果差距也會很多,是以網上的一些書單,你可以參考,但不要盲目推崇,等你自己看懂了再說它好也不遲。
于是我第二次進軍計算機網絡也失敗了,看完了《TCP/IP卷一》之後,我用了一個月的時間又忘掉了它。
強化學習階段
俗話說,事不過三,兩次選書都讓我铩羽而歸,我的内心是崩潰的,雖然面試的時候還可以靠着背一些常見的計算機網絡面試題蒙混過關,但是真遇到較複雜的問題時,我也隻能是望洋興歎,根本說不出個是以然。
學好計算機網絡的關鍵是了解它,我在網上又搜尋了一大堆的内容,看到一本名為《計算機網絡:自頂向下》的書籍,也受到一些推崇,原因是這本書從應用層講起,一直往下講到實體層,似乎更符合人腦的學習和思考方式。
我買書一向勤快,當時我在百度實習,于是這本書成了我日常實習時必看的書目。
因為組裡的項目在做容器和私有雲,在不懂網計算機網絡的情況下去看這倆,簡直是找死,更何況裡面還涉及了存儲、排程、微服務等技術。
這本書确實給了我全新的觀感,此書在開頭就說,将以全新的方式介紹計算機網絡,先講應用層,再依次介紹傳輸層、網絡層、鍊路層和實體層。
自頂向下和自頂向下的差別在哪呢?
根據自頂向下的思路,我們最先接觸的是應用層,也就是常見的HTTP、DNS、FTP、POP等協定,這層協定我們平時都在用,書中講的也比較接地氣,于是我對應用層的介紹也接受的很快。
按照這個思路,書中繼續講傳輸層,也就是我們常見的TCP和UDP,應用層使用域名或者是IP+port的方式定位機器,而傳輸層(這裡指TCP)把應用層的資料切片,有序傳輸,并且保證可靠。
也就是說,TCP封包把應用層封包包裹了起來。接下來,就到了網絡層了,網絡層通過IP進行路由,目的就是找到對應的終端機器,是以網絡層的資料報要包裹傳輸層的資料報。
接着往下,網絡層雖然解決了路由問題,但是區域網路内的網絡交換是通過mac位址進行尋址的,于是資料鍊路層發揮作用,因為它就是通過mac位址來定位目标機器的,于是資料鍊路層的資料報要包裹網絡層的資料報。
再到最後實體層,資料傳輸的本質還是0和1的電信号,自然要通過實體媒體進行傳輸,當然,實體媒體除了常見的網線、光纖,還有電磁波(應用于無線區域網路)
上面對整個計算機網絡的脈絡做了一下梳理,是以,整體看來,按照自頂向下的思路去學習計算機網絡,對于新手來說更加友好一些。
還差得遠呢
看完了《計算機網絡:自頂向下》雖然已經大概了解了整個網絡的結構和脈絡,但是對于很多實作的細節還是一知半解,比如HTTP和TCP封包的結構,還有一些比較不易了解的概念,比如路由算法、IP廣播和多點傳播、NAT技術、VPN技術等等,不了解這些,總覺得還是欠缺了不少東西。
到後來,開始嘗試面試一些大廠,更加發現了自己的差距還很大,比如百度、頭條、騰訊這類公司,特别是騰訊,對于計算機網絡的考察是特别嚴格的。
比如三次握手,四次揮手這種常見問題,一般還會延伸考察,比如為什麼要三次握手、四次揮手,沒有第三次握手或者沒有第四次揮手會怎麼樣。
再比如TCP協定的作用是什麼,它是如何保證傳輸可靠的,這時候你就要了解TCP保證可靠傳輸的機制,比如滑動視窗,逾時重傳,分組确認等原理,也是你需要能講清楚的。
再比如,還有一種常見的考察方式,就是讓你講清楚從域名通路到獲得傳回結果的過程中都經曆了什麼,這麼開放的問題,要盡可能說出足夠多的東西,先是DNS解析,再到TCP三向交握,然後介紹IP資料報的網絡路由,以及區域網路内資料鍊路層的作用,甚至可以把實體層也帶進去講一下。
總之,你掌握的越多越詳細,對于這些問題才更有機會答好,我每次都會把整個過程講的比較詳細,這樣面試時才不會給自己留坑。
對了,在學習計算機網絡的路上,還有一個很重要的學習資源幫助到了我,那就是劉欣老師的《碼農翻身》一書,當時我也是在網上偶爾看到。
一開始劉欣老師隻是寫公衆号文章,後來把文章集結成書,對于計算機網絡的部分,這本書用故事化的方法介紹了很多計算機網絡的知識,同時解釋了一些較為複雜的計算機網絡概念,比如NAT、網絡隧道、VPN等等。
雖然這本書關于計算機網絡的内容不是很多,但确實有助于加深對于計算機網絡一些概念的了解。
寫了這麼多,最後用一張思維導圖告訴你計算機網絡應該怎麼學,算是對本文的總結。
如果你是科班出身的同學,相信你對計算機網絡的學習不用我操心,如果是非科班的同學,按照這個思路去學習,我覺得是還是可以的。
推薦資源
書籍
《計算機網絡:自頂向下》
《圖解TCP/TP》
《圖解HTTP》
總結
關于計算機網絡的學習,我們就講到這裡了,如果還有什麼疑問也可以到我公衆号裡找我探讨,作為一個Java工程師,必須要懂得Java網絡程式設計,有了計算機網絡的基礎之後,相信對後續學習網絡程式設計會有幫助,之後也會有關于Java網絡程式設計的文章推出,敬請期待。
對了,你想問我文章裡提到的書籍去哪找?我已經給你準備好了
文中所提到的電子書都可以免費領取,在我的公衆号【程式員黃小斜】回複“計算機網絡”即可領取對應的下載下傳位址。
寫在最後
如果覺得本文對你有幫助的話,請你也不要吝啬你的“好看”哈,轉發朋友圈就是對我最大的支援啦,你們的支援是對我最大的鼓勵。
對本系列文章有什麼建議和意見,也歡迎留言告訴我,期待你的回饋。另外本系列文章也會制作成相應的視訊放到B站,趕緊來B站關注我吧。
微信公衆号:程式員黃小斜
知乎:黃小斜
B站:黃小斜