本文做者:黃小斜程序員
轉載請務必在文章開頭註明出處和做者。面試
上一期我講到了數據結構怎麼學,當時個人學習方法是先看視頻,再看書,而後刷一刷基礎算法題作鞏固。算法
做爲一個非科班考研黨,當時以爲這個學習路線仍是比較平滑的,畢竟能讓我一個小白快速學會,這門課相對來講仍是比較簡單的。docker
因而,等我讀研的時候,打算以相同的學習方式來補一下其餘幾門計算機基礎課程,首當其衝的就是計算機網絡。編程
由於這門課實在重要,幾乎是面試必問的內容,什麼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技術、***技術等等,不理解這些,總以爲仍是欠缺了很多東西。
到後來,開始嘗試面試一些大廠,更加發現了本身的差距還很大,好比百度、頭條、騰訊這類公司,特別是騰訊,對於計算機網絡的考察是特別嚴格的。
好比三次握手,四次揮手這種常見問題,通常還會延伸考察,好比爲何要三次握手、四次揮手,沒有第三次握手或者沒有第四次揮手會怎麼樣。
再好比TCP協議的做用是什麼,它是如何保證傳輸可靠的,這時候你就要了解TCP保證可靠傳輸的機制,好比滑動窗口,超時重傳,分組確認等原理,也是你須要能講清楚的。
再好比,還有一種常見的考察方式,就是讓你講清楚從域名訪問到得到返回結果的過程當中都經歷了什麼,這麼開放的問題,要儘量說出足夠多的東西,先是DNS解析,再到TCP三次握手,而後介紹IP數據報的網絡路由,以及局域網內數據鏈路層的做用,甚至能夠把物理層也帶進去講一下。
總之,你掌握的越多越詳細,對於這些問題才更有機會答好,我每次都會把整個過程講的比較詳細,這樣面試時纔不會給本身留坑。
對了,在學習計算機網絡的路上,還有一個很重要的學習資源幫助到了我,那就是劉欣老師的《碼農翻身》一書,當時我也是在網上偶爾看到。
一開始劉欣老師只是寫公衆號文章,後來把文章集結成書,對於計算機網絡的部分,這本書用故事化的方法介紹了不少計算機網絡的知識,同時解釋了一些較爲複雜的計算機網絡概念,好比NAT、網絡隧道、***等等。
雖然這本書關於計算機網絡的內容不是不少,但確實有助於加深對於計算機網絡一些概念的理解。
寫了這麼多,最後用一張思惟導圖告訴你計算機網絡應該怎麼學,算是對本文的總結。
若是你是科班出身的同窗,相信你對計算機網絡的學習不用我操心,若是是非科班的同窗,按照這個思路去學習,我以爲是仍是能夠的。
《計算機網絡:自頂向下》
《圖解TCP/TP》
《圖解HTTP》
關於計算機網絡的學習,咱們就講到這裏了,若是還有什麼疑問也能夠到我公衆號裏找我探討,做爲一個Java工程師,必需要懂得Java網絡編程,有了計算機網絡的基礎以後,相信對後續學習網絡編程會有幫助,以後也會有關於Java網絡編程的文章推出,敬請期待。