你不会真的以为自己懂得计算机网络吧?
原創(chuàng)聲明
本文作者:黃小斜
轉(zhuǎn)載請務(wù)必在文章開頭注明出處和作者。
思維導(dǎo)圖
簡介
上一期我講到了數(shù)據(jù)結(jié)構(gòu)怎么學(xué),當(dāng)時我的學(xué)習(xí)方法是先看視頻,再看書,然后刷一刷基礎(chǔ)算法題做鞏固。
作為一個非科班考研黨,當(dāng)時覺得這個學(xué)習(xí)路線還是比較平滑的,畢竟能讓我一個小白快速學(xué)會,這門課相對來說還是比較簡單的。
于是,等我讀研的時候,打算以相同的學(xué)習(xí)方式來補(bǔ)一下其他幾門計算機(jī)基礎(chǔ)課程,首當(dāng)其沖的就是計算機(jī)網(wǎng)絡(luò)。
因為這門課實在重要,幾乎是面試必問的內(nèi)容,什么TCP/IP三次握手,四次揮手,TCP和UDP區(qū)別,HTTP協(xié)議的一堆面試題,在程序員面試時都是很常見的考題,你們應(yīng)該也深有體會。
計算機(jī)網(wǎng)絡(luò)中的復(fù)雜概念遠(yuǎn)不止這些,那么按照老規(guī)矩,我們先來看一下計算機(jī)網(wǎng)絡(luò)到底是個啥。
根據(jù)百度百科的介紹,計算機(jī)網(wǎng)絡(luò)是指將地理位置不同的具有獨立功能的多臺計算機(jī)及其外部設(shè)備,通過通信線路連接起來,在網(wǎng)絡(luò)操作系統(tǒng),網(wǎng)絡(luò)管理軟件及網(wǎng)絡(luò)通信協(xié)議的管理和協(xié)調(diào)下,實現(xiàn)資源共享和信息傳遞的計算機(jī)系統(tǒng)。
相比于數(shù)據(jù)結(jié)構(gòu)的介紹,百科上對于計算機(jī)網(wǎng)絡(luò)的介紹更加好懂一些,簡單來說,計算機(jī)網(wǎng)絡(luò)就是把計算機(jī)通過通信線路連接起來,實現(xiàn)網(wǎng)絡(luò)互聯(lián)和信息傳遞。
為什么要學(xué)計算機(jī)網(wǎng)絡(luò)
在這個時代,離開了網(wǎng)絡(luò),簡直沒有辦法生存,而我們所學(xué)的編程知識,脫了網(wǎng)絡(luò)去談也將毫無意義,畢竟沒有哪個編程語言是只支持單機(jī)運行的。
作為一個編程學(xué)習(xí)者,當(dāng)你在學(xué)習(xí)一門語言時,比如Java,你可能會學(xué)到一些基本語法,面向?qū)ο蟮幕A(chǔ)、集合類的使用,甚至是多線程、IO流以及異常處理,這種時候你往往意識不到計算機(jī)網(wǎng)絡(luò)的重要性,反正我寫代碼也不涉及網(wǎng)絡(luò)傳輸,平時的工作也只是CRUD,學(xué)習(xí)計算機(jī)網(wǎng)絡(luò)也沒有什么用武之地。
曾幾何時我也是這么想的,但是到后來,我開始接觸Tomcat,接觸Nginx,以及Java中的網(wǎng)絡(luò)編程技術(shù),比如BIO和NIO,甚至是網(wǎng)絡(luò)編程框架netty,在沒有計算機(jī)網(wǎng)絡(luò)基礎(chǔ)的情況下來看這些東西,絕對會讓你懷疑人生。
最早我開始意識到自己計算機(jī)網(wǎng)絡(luò)基礎(chǔ)薄弱時,還是我在學(xué)習(xí)docker容器方面的知識時,接觸到了docker的網(wǎng)絡(luò)原理,比如docker的網(wǎng)絡(luò)模式有橋接和host兩種,然而我當(dāng)時基本上看不懂這是什么東西。
類似地,我在學(xué)習(xí)OpenStack的時候,也完全看不懂里面的網(wǎng)絡(luò)組件是做什么用的。
就算你不學(xué)習(xí)網(wǎng)絡(luò)編程、虛擬化和容器調(diào)度,你也得學(xué)學(xué)平時家里的ip地址、DNS和子網(wǎng)掩碼怎么配置吧,沒認(rèn)真學(xué)習(xí)計算機(jī)網(wǎng)絡(luò)之前,我對這些東西甚至都是一臉懵逼的。
不懂計算機(jī)網(wǎng)絡(luò)的我,想要學(xué)編程,真的太難了!
如何學(xué)習(xí)計算機(jī)網(wǎng)絡(luò)
第一次接觸
本科的時候,我們本有一門選修課就是計算機(jī)網(wǎng)絡(luò),但是當(dāng)時我沒有選它(現(xiàn)在覺得選了可能也聽不大懂,但是多少有點印象)
讀研的時候,開始狂補(bǔ)計算機(jī)基礎(chǔ),當(dāng)時為自己選了第一本書《計算機(jī)網(wǎng)絡(luò)(謝希仁)》作為入門教材,現(xiàn)在想想當(dāng)時真是年幼無知,自己完全可以去某乎看一下推薦書單的。
這本書作為一本大學(xué)通用教材,年代之久遠(yuǎn),內(nèi)容之枯燥,都是在這么多計算機(jī)網(wǎng)絡(luò)書籍里排的上號的,我已經(jīng)快忘記當(dāng)時是怎么把這本書啃完的了。
雖然這本書還沒有到大部頭的級別,但是里面的內(nèi)容真的對新手不怎么友好,通篇的都是概念的堆疊和并不容易理解的概念介紹。
教科書,大家都懂的,大部分都已經(jīng)脫離時代,雖然計算機(jī)網(wǎng)絡(luò)這幾年的變化不大,但是它里面的一些教學(xué)方法確實是和時代脫節(jié)了。
我只記得這本書,當(dāng)初看完一周就忘光了,后面不管是筆試面試,還是重新復(fù)習(xí)的時候,基本上也想不起來當(dāng)初都學(xué)了啥,真是一本神奇的好書。
入門學(xué)習(xí)階段
吃過了教材的虧之后,我終于學(xué)會了上某乎找書單了,當(dāng)時除了購買了一堆Java書籍之外,還特地買了一本《TCP/IP卷一》以及《圖解HTTP》準(zhǔn)備開始第二輪對于計算機(jī)網(wǎng)絡(luò)的死磕。
當(dāng)時也投了一些簡歷,準(zhǔn)備了一些面試,刷過一些面試題,其中面到計算機(jī)網(wǎng)絡(luò)的概率很大,于是我每天都會花一些時間來看著兩本書。
不知道是不是我理解能力有問題,當(dāng)我看《TCP/IP詳解卷一》這本備受推崇的計算機(jī)網(wǎng)絡(luò)書籍時,我竟然有一種再看當(dāng)初那本教材的感覺,這本大部頭,貌似也是在講一堆復(fù)雜的概念,并且用一些不好懂的講解去解釋這些概念。
當(dāng)時我的自信心就有點受挫了,難道計算機(jī)網(wǎng)絡(luò)真就這么難么,為什么這本書我仍然看不懂?
現(xiàn)在看來,計算機(jī)網(wǎng)絡(luò)確實是一門純理論的課程,除了一些網(wǎng)絡(luò)抓包和用開發(fā)者工具查看網(wǎng)絡(luò)請求之外,基本上沒有什么需要實踐的內(nèi)容,現(xiàn)在很多書從網(wǎng)絡(luò)抓包入手講解計算機(jī)網(wǎng)絡(luò),其實也是一種不錯的新型學(xué)習(xí)方法。
一本書適不適合一個人,真的是因人而異,特別是這種專業(yè)技術(shù)書籍,不同水平的人看效果差距也會很多,所以網(wǎng)上的一些書單,你可以參考,但不要盲目推崇,等你自己看懂了再說它好也不遲。
于是我第二次進(jìn)軍計算機(jī)網(wǎng)絡(luò)也失敗了,看完了《TCP/IP卷一》之后,我用了一個月的時間又忘掉了它。
強(qiáng)化學(xué)習(xí)階段
俗話說,事不過三,兩次選書都讓我鎩羽而歸,我的內(nèi)心是崩潰的,雖然面試的時候還可以靠著背一些常見的計算機(jī)網(wǎng)絡(luò)面試題蒙混過關(guān),但是真遇到較復(fù)雜的問題時,我也只能是望洋興嘆,根本說不出個所以然。
學(xué)好計算機(jī)網(wǎng)絡(luò)的關(guān)鍵是理解它,我在網(wǎng)上又搜索了一大堆的內(nèi)容,看到一本名為《計算機(jī)網(wǎng)絡(luò):自頂向下》的書籍,也受到一些推崇,原因是這本書從應(yīng)用層講起,一直往下講到物理層,似乎更符合人腦的學(xué)習(xí)和思考方式。
我買書一向勤快,當(dāng)時我在百度實習(xí),于是這本書成了我日常實習(xí)時必看的書目。
因為組里的項目在做容器和私有云,在不懂網(wǎng)計算機(jī)網(wǎng)絡(luò)的情況下去看這倆,簡直是找死,更何況里面還涉及了存儲、調(diào)度、微服務(wù)等技術(shù)。
這本書確實給了我全新的觀感,此書在開頭就說,將以全新的方式介紹計算機(jī)網(wǎng)絡(luò),先講應(yīng)用層,再依次介紹傳輸層、網(wǎng)絡(luò)層、鏈路層和物理層。
自頂向下和自頂向下的區(qū)別在哪呢?
根據(jù)自頂向下的思路,我們最先接觸的是應(yīng)用層,也就是常見的HTTP、DNS、FTP、POP等協(xié)議,這層協(xié)議我們平時都在用,書中講的也比較接地氣,于是我對應(yīng)用層的介紹也接受的很快。
按照這個思路,書中繼續(xù)講傳輸層,也就是我們常見的TCP和UDP,應(yīng)用層使用域名或者是IP+port的方式定位機(jī)器,而傳輸層(這里指TCP)把應(yīng)用層的數(shù)據(jù)切片,有序傳輸,并且保證可靠。
也就是說,TCP報文把應(yīng)用層報文包裹了起來。接下來,就到了網(wǎng)絡(luò)層了,網(wǎng)絡(luò)層通過IP進(jìn)行路由,目的就是找到對應(yīng)的終端機(jī)器,所以網(wǎng)絡(luò)層的數(shù)據(jù)報要包裹傳輸層的數(shù)據(jù)報。
接著往下,網(wǎng)絡(luò)層雖然解決了路由問題,但是局域網(wǎng)內(nèi)的網(wǎng)絡(luò)交換是通過mac地址進(jìn)行尋址的,于是數(shù)據(jù)鏈路層發(fā)揮作用,因為它就是通過mac地址來定位目標(biāo)機(jī)器的,于是數(shù)據(jù)鏈路層的數(shù)據(jù)報要包裹網(wǎng)絡(luò)層的數(shù)據(jù)報。
再到最后物理層,數(shù)據(jù)傳輸?shù)谋举|(zhì)還是0和1的電信號,自然要通過物理介質(zhì)進(jìn)行傳輸,當(dāng)然,物理介質(zhì)除了常見的網(wǎng)線、光纖,還有電磁波(應(yīng)用于無線局域網(wǎng))
上面對整個計算機(jī)網(wǎng)絡(luò)的脈絡(luò)做了一下梳理,所以,整體看來,按照自頂向下的思路去學(xué)習(xí)計算機(jī)網(wǎng)絡(luò),對于新手來說更加友好一些。
還差得遠(yuǎn)呢
看完了《計算機(jī)網(wǎng)絡(luò):自頂向下》雖然已經(jīng)大概了解了整個網(wǎng)絡(luò)的結(jié)構(gòu)和脈絡(luò),但是對于很多實現(xiàn)的細(xì)節(jié)還是一知半解,比如HTTP和TCP報文的結(jié)構(gòu),還有一些比較不易理解的概念,比如路由算法、IP廣播和多播、NAT技術(shù)、VPN技術(shù)等等,不理解這些,總覺得還是欠缺了不少東西。
到后來,開始嘗試面試一些大廠,更加發(fā)現(xiàn)了自己的差距還很大,比如百度、頭條、騰訊這類公司,特別是騰訊,對于計算機(jī)網(wǎng)絡(luò)的考察是特別嚴(yán)格的。
比如三次握手,四次揮手這種常見問題,一般還會延伸考察,比如為什么要三次握手、四次揮手,沒有第三次握手或者沒有第四次揮手會怎么樣。
再比如TCP協(xié)議的作用是什么,它是如何保證傳輸可靠的,這時候你就要了解TCP保證可靠傳輸?shù)臋C(jī)制,比如滑動窗口,超時重傳,分組確認(rèn)等原理,也是你需要能講清楚的。
再比如,還有一種常見的考察方式,就是讓你講清楚從域名訪問到獲得返回結(jié)果的過程中都經(jīng)歷了什么,這么開放的問題,要盡可能說出足夠多的東西,先是DNS解析,再到TCP三次握手,然后介紹IP數(shù)據(jù)報的網(wǎng)絡(luò)路由,以及局域網(wǎng)內(nèi)數(shù)據(jù)鏈路層的作用,甚至可以把物理層也帶進(jìn)去講一下。
總之,你掌握的越多越詳細(xì),對于這些問題才更有機(jī)會答好,我每次都會把整個過程講的比較詳細(xì),這樣面試時才不會給自己留坑。
對了,在學(xué)習(xí)計算機(jī)網(wǎng)絡(luò)的路上,還有一個很重要的學(xué)習(xí)資源幫助到了我,那就是劉欣老師的《碼農(nóng)翻身》一書,當(dāng)時我也是在網(wǎng)上偶爾看到。
一開始劉欣老師只是寫公眾號文章,后來把文章集結(jié)成書,對于計算機(jī)網(wǎng)絡(luò)的部分,這本書用故事化的方法介紹了很多計算機(jī)網(wǎng)絡(luò)的知識,同時解釋了一些較為復(fù)雜的計算機(jī)網(wǎng)絡(luò)概念,比如NAT、網(wǎng)絡(luò)隧道、VPN等等。
雖然這本書關(guān)于計算機(jī)網(wǎng)絡(luò)的內(nèi)容不是很多,但確實有助于加深對于計算機(jī)網(wǎng)絡(luò)一些概念的理解。
思維導(dǎo)圖
寫了這么多,最后用一張思維導(dǎo)圖告訴你計算機(jī)網(wǎng)絡(luò)應(yīng)該怎么學(xué),算是對本文的總結(jié)。
如果你是科班出身的同學(xué),相信你對計算機(jī)網(wǎng)絡(luò)的學(xué)習(xí)不用我操心,如果是非科班的同學(xué),按照這個思路去學(xué)習(xí),我覺得是還是可以的。
推薦資源
書籍
《計算機(jī)網(wǎng)絡(luò):自頂向下》
《圖解TCP/TP》
《圖解HTTP》
總結(jié)
關(guān)于計算機(jī)網(wǎng)絡(luò)的學(xué)習(xí),我們就講到這里了,如果還有什么疑問也可以到我公眾號里找我探討,作為一個Java工程師,必須要懂得Java網(wǎng)絡(luò)編程,有了計算機(jī)網(wǎng)絡(luò)的基礎(chǔ)之后,相信對后續(xù)學(xué)習(xí)網(wǎng)絡(luò)編程會有幫助,之后也會有關(guān)于Java網(wǎng)絡(luò)編程的文章推出,敬請期待。
對了,你想問我文章里提到的書籍去哪找?我已經(jīng)給你準(zhǔn)備好了
文中所提到的電子書都可以免費領(lǐng)取,在我的公眾號【程序員黃小斜】回復(fù)“計算機(jī)網(wǎng)絡(luò)”即可領(lǐng)取對應(yīng)的下載地址。
寫在最后
如果覺得本文對你有幫助的話,請你也不要吝嗇你的“好看”哈,轉(zhuǎn)發(fā)朋友圈就是對我最大的支持啦,你們的支持是對我最大的鼓勵。
對本系列文章有什么建議和意見,也歡迎留言告訴我,期待你的反饋。
總結(jié)
以上是生活随笔為你收集整理的你不会真的以为自己懂得计算机网络吧?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3内置模块之json编码解码
- 下一篇: 编程生涯 21 载,那些我踩过的坑