再也不怕被問網(wǎng)絡(luò)面試題了
大家好,今天是在學(xué)習(xí)攝影的小北。
攝影嘛,等我有點(diǎn)經(jīng)驗(yàn)再來分享分享,先給大家聊聊關(guān)于計(jì)算機(jī)網(wǎng)絡(luò)的一些學(xué)習(xí)體會(huì)。
首先從一道經(jīng)典面試題開始:
在瀏覽器輸入一個(gè) URL,到網(wǎng)頁顯示出來,中間發(fā)生了什么 ?
不知道小伙伴們面試被問過這個(gè)問題么?
這個(gè)問題其實(shí)在《Computer Networking: A Top-Down Approach》這本書的末尾花了十幾頁的篇幅完整的描述過。
如果你還是無法很清晰的說出其中過程,那就說明還需要去補(bǔ)課哈。
當(dāng)然了,不同崗位的同學(xué)可能關(guān)注的重點(diǎn)會(huì)不一樣,前端同學(xué)可能更關(guān)注 HTTP、瀏覽器網(wǎng)絡(luò)請(qǐng)求、渲染過程,后臺(tái)同學(xué)則更關(guān)注網(wǎng)絡(luò)層和傳輸層。
我們暫時(shí)不寫這個(gè)問題的具體答案是什么,先聊聊如何學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)。
不少初學(xué)的小伙伴,在學(xué)習(xí)計(jì)網(wǎng)過程中,特別容易陷入一個(gè)誤區(qū):
挨個(gè)的背下每一個(gè)網(wǎng)絡(luò)協(xié)議的作用,頭部字段以及通信雙方的交互過程。
比如這個(gè) IP 數(shù)據(jù)包的頭部:

花了好大的力氣,終于背完了 HTTP、TCP、IP、ARP、DHCP 等一堆協(xié)議。
最后還是說不清數(shù)據(jù)包是如何在網(wǎng)絡(luò)世界傳輸?shù)摹?/p>
這是多么大的悲傷呀!
所以學(xué)習(xí)計(jì)網(wǎng)一定不要完全去死記硬背,不然就會(huì)今天記、明天忘。
我們要明白,網(wǎng)絡(luò)存在的目的就是解決主機(jī)之間的通信問題。
最簡(jiǎn)單的,我們可以直接將兩臺(tái)主機(jī)通過網(wǎng)線連接:

這個(gè)時(shí)候是不需要什么 IP 協(xié)議、ARP 之類的東西,
但是隨著越來的越多的主機(jī)加入,會(huì)遇到如何尋址、數(shù)據(jù)包發(fā)送沖突等問題。
為了解決這些問題,我們引入了 MAC 地址、ARP、IP 這些協(xié)議。
從問題出發(fā),按照 Why -> How -> What 這樣的順序。
先談?dòng)龅搅耸裁磫栴},再說如何去解決,最終才是搬出前輩們的 RFC 文檔,這樣就會(huì)順暢很多。
而且這是在引導(dǎo)我們?nèi)ニ伎既绾谓鉀Q問題,從點(diǎn)對(duì)點(diǎn)連接開始如何構(gòu)造一個(gè)網(wǎng)絡(luò)。
如果一上來就搬出原理,比如 TCP 連接管理、狀態(tài)轉(zhuǎn)換、超時(shí)重傳、IP 包如何分段與重組這樣的東西,我覺得是比較懵逼的。
作為初學(xué)者我們并不太清楚為什么需要這樣做,不這樣做行不行?
以前學(xué)計(jì)網(wǎng)的時(shí)候,我也有一堆的困惑:
比如路由器和交換機(jī)有什么區(qū)別?
為什么有了 MAC 地址還要 IP 地址呢?
只用 IP 地址行不行呢?
如何理解廣播域和沖突域?
大家有過這些問題么?
如果你腦海里對(duì)這些問題的答案非常的清晰,那么恭喜你,你對(duì)網(wǎng)絡(luò)掌握得還不錯(cuò)!
網(wǎng)絡(luò)世界分層極其明顯,所以教材包括教學(xué)方式一般分為兩類:
自頂向下 自底向上
當(dāng)然了,學(xué)習(xí)其它東西也是同理,只不過分層的感覺可能沒有計(jì)網(wǎng)這么強(qiáng)烈。
我們大學(xué)老師就是從應(yīng)用層開始往下講的,自頂向下的好處是直觀,上層的直觀感受會(huì)讓你有探索下層實(shí)現(xiàn)的欲望。
我們教材也恰好使用的是《計(jì)算機(jī)網(wǎng)絡(luò)-自頂向下》這本經(jīng)典的計(jì)算機(jī)網(wǎng)絡(luò)書籍,這本書也是采取自頂向下這樣的講述方式。
按照網(wǎng)絡(luò)的五層模型,從我們?nèi)粘=佑|的應(yīng)用層往下依次把網(wǎng)絡(luò)的面紗解開。
當(dāng)然了,國內(nèi)也有不少高校是以自底向上的方式上課的,一上來就是一堆的物理層、鏈路層協(xié)議,典型教材如《Computer Networks, Fourth Edition》。
我個(gè)人其實(shí)也是很喜歡這種方式的,自底向上也有其獨(dú)特的魅力。
獨(dú)特在哪?
因?yàn)樽皂斚蛳率且粚訉拥膹耐庀騼?nèi)打開,然而最初設(shè)計(jì)網(wǎng)絡(luò)的時(shí)候肯定不可能是自頂向下的吧。
真實(shí)的世界一定是自底向上演變的,不可能先定義了 HTTP 協(xié)議再去考慮如何設(shè)計(jì)傳輸層,這顯然不合理嘛。
網(wǎng)絡(luò)的演變一定是最初有兩臺(tái)電腦互相通信的需求,然后是多臺(tái)電腦,他們之間構(gòu)成了局域網(wǎng),再往后局域網(wǎng)之間組成了廣域網(wǎng)。
最關(guān)鍵的是,自底向上是解決問題導(dǎo)向,比如有了 IP層 為什么還需要傳輸層呢?
我們都知道一臺(tái)電腦可能有多個(gè)進(jìn)程在使用網(wǎng)絡(luò)連接,那么當(dāng) IP 包到達(dá)主機(jī)時(shí),怎么區(qū)分這是發(fā)給哪個(gè)進(jìn)程的呢?
操作系統(tǒng)為了能夠區(qū)分?jǐn)?shù)據(jù)是傳給上層哪個(gè)應(yīng)用的,才引入了傳輸層。
這是自底向上解決問題的過程。
但是自頂向下可能就是學(xué)完應(yīng)用層,直接告訴你,下一層是傳輸層,然后接著講 TCP 和 UDP 是什么。
比如在《自頂向下》第三章講傳輸層的時(shí)候,是這樣開篇的:
運(yùn)輸層位于應(yīng)用層和網(wǎng)絡(luò)層之間,是分層的網(wǎng)絡(luò)體系結(jié)構(gòu)的重要部分。該層為運(yùn)行在不同主機(jī)上的應(yīng)用進(jìn)程提供直接的通信服務(wù)起著至關(guān)重要的作用。我們?cè)诒菊虏捎玫慕虒W(xué)方法是,交替地討論運(yùn)輸層的原理和這些原理在現(xiàn)有的協(xié)議中是如何實(shí)現(xiàn)的。與往常一 樣,我們將特別關(guān)注因特網(wǎng)協(xié)議,即 TCP 和 UDP 運(yùn)輸層協(xié)議。
那我可能就會(huì)想,為什么在應(yīng)用層和網(wǎng)絡(luò)層之間需要運(yùn)輸層,直接把應(yīng)用數(shù)據(jù)包打包在網(wǎng)絡(luò)層里發(fā)送出去不行嗎?
當(dāng)然可以,只要給每個(gè)應(yīng)用分配一個(gè)唯一的ID,一起放在網(wǎng)絡(luò)層的數(shù)據(jù)包發(fā)送出去,接收方使用這個(gè) ID 來定位數(shù)據(jù)是給哪個(gè)應(yīng)用的。
其實(shí)你也看出來了,這就是把 TCP、UDP 做的事情放在了 IP 層去做。
所以為了保持 IP 層的靈活性和功能獨(dú)立,這里引入了傳輸層,這就是分層。
分層這個(gè)思想在計(jì)算機(jī)世界中非常重要,你可以在任何地方看到它的身影。
計(jì)算機(jī)領(lǐng)域有一句名言:
計(jì)算機(jī)科學(xué)領(lǐng)域的任何問題都可以通過增加一個(gè)間接的中間層來解決
學(xué)習(xí)計(jì)網(wǎng)過程中也需要建立結(jié)構(gòu)化的思維,最直觀的結(jié)構(gòu)就是按照計(jì)網(wǎng)的層次來,即:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層。
然后在去學(xué)習(xí)每個(gè)層的功能和其中的每個(gè)協(xié)議,這個(gè)過程既可以自頂而下,也可以自底向上。
分層學(xué)習(xí)過程中除了要掌握每一層之外,最重要的其實(shí)是要學(xué)習(xí)層與層之間是如何鏈接起來的,比如 IP 層和數(shù)據(jù)鏈路層就是 ARP 協(xié)議。
最后當(dāng)你學(xué)完所有的協(xié)議后,再回顧一下,一個(gè)數(shù)據(jù)包是如何從 send() 函數(shù)發(fā)送出去的。
離散的 IP 數(shù)據(jù)包又是如何抽象出“面向連接”的 TCP 層,并且要清晰的認(rèn)識(shí)到這里的連接是一種邏輯狀態(tài),建立、斷開連接則是同步雙方的通信狀態(tài)。
基于這樣的認(rèn)識(shí),才能輕易的回答出類似:“TCP連接建立后出現(xiàn)服務(wù)器崩潰、斷電、網(wǎng)線被拔...會(huì)發(fā)生什么情況”這樣的問題。
這里推薦一些網(wǎng)絡(luò)學(xué)習(xí)資源:
書籍:
入門:《網(wǎng)絡(luò)是怎么連接的》、《圖解 TCP/IP 》
深入學(xué)習(xí):《計(jì)算機(jī)網(wǎng)絡(luò):自頂向下》、《TCP/IP 卷一》
官方:RFC 文檔(這是計(jì)算機(jī)網(wǎng)絡(luò)的協(xié)議標(biāo)準(zhǔn)文檔)
抓包:《Wireshark 網(wǎng)絡(luò)分析就這么簡(jiǎn)單》,這本書寫得很幽默風(fēng)趣,可以看看。
源碼:之前看了一個(gè)pdf《tcp源碼分析》:

網(wǎng)課:哈工大的計(jì)算機(jī)網(wǎng)絡(luò),B站自取~
國外經(jīng)典課程:CS144,這門課的視頻其實(shí)并不突出,一般般吧,但是 Assignment/Lab 挺有意思的,用 C++ 實(shí)現(xiàn)一個(gè) TCP,當(dāng)然了不會(huì)像 linux 中網(wǎng)絡(luò)協(xié)議棧那么復(fù)雜,但是麻雀雖小五臟俱全。
網(wǎng)絡(luò)編程:做一些網(wǎng)絡(luò)工具:聊天室、p2p
簡(jiǎn)單網(wǎng)絡(luò)攻擊:比如去玩玩 ARP 攻擊,在寢室或者你們家里搞點(diǎn)“網(wǎng)絡(luò)攻擊”
我覺得學(xué)習(xí)計(jì)網(wǎng),做點(diǎn)網(wǎng)絡(luò)編程、簡(jiǎn)單網(wǎng)絡(luò)攻擊、抓包,會(huì)讓學(xué)習(xí)更加有趣,我當(dāng)時(shí)是這幾個(gè)都玩了下,你對(duì)這些網(wǎng)絡(luò)協(xié)議的認(rèn)識(shí)就會(huì)更加深刻的。
PS:公號(hào)內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起 100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!


【神秘禮包獲取方式】
