不僅需要背誦,而且特別需要將原理爛熟于胸的學科斗塘。很多問題看起來懂了赢织,但是就怕往細里問,一問就發(fā)現(xiàn)你懂得沒有那么透徹馍盟。
為什么網(wǎng)絡(luò)要分層呀于置?二層設(shè)備、三層設(shè)備朽合、四層 LB 和七層 LB 中層俱两,不同的層次之間有不同的溝通方式饱狂,這個叫作協(xié)議。
第一個問題:請問經(jīng)理握手時宪彩,員工在干什么休讳? TCP 建立連接的三次握手協(xié)議時,IP和 MAC 層對應(yīng)都有什么操作尿孔?
除了上面這個不恰當?shù)谋扔骺∪幔炭茣€會列出每個層次所包含的協(xié)議,然后開始逐層地去講這些協(xié)議活合。但是這些協(xié)議之間的關(guān)系呢雏婶?卻很少有教科書會講。
第三層:IP 協(xié)議里面包含目標地址和源地址白指。第三層里路由協(xié)議留晚,?A(原始地址)->B->C(中轉(zhuǎn)站)->D(目標地址)通過路由轉(zhuǎn)發(fā)的。
第二個問題:A 知道自己的下一個中轉(zhuǎn)站是 B告嘲,那從 A 發(fā)出來的包错维,應(yīng)該把 B 的 IP 地址放在哪里呢?如果放在 IP 協(xié)議中的目標地址橄唬,那包到了中轉(zhuǎn)站赋焕,怎么知道最終的目的地址是 D 呢?
二層設(shè)備處理的通常是 MAC 層的東西仰楚。發(fā)送一個 HTTP 的包隆判,在第七層工作,那是不是不需要經(jīng)過二層設(shè)備僧界?或者即便經(jīng)過了侨嘀,二層設(shè)備也不處理呢?或者換一種問法捎泻,二層設(shè)備處理的包里飒炎,有沒有 HTTP 層的內(nèi)容呢?
綜合的問題笆豁。電腦通過 SSH 登錄到公有云主機里面,都需要經(jīng)歷哪些過程赤赊?或者說你打開一個電商網(wǎng)站闯狱,都需要經(jīng)歷哪些過程?說得越詳細越好抛计。
網(wǎng)絡(luò)為什么要分層哄孤?
復(fù)雜的程序都要分層。想象網(wǎng)絡(luò)包就是一段 Buffer吹截,或者一塊內(nèi)存瘦陈,是有格式的凝危。同時,想象自己是一個處理網(wǎng)絡(luò)包的程序晨逝,而且這個程序可以跑在電腦上蛾默,可以跑在服務(wù)器上,可以跑在交換機上捉貌,也可以跑在路由器上支鸡。你想象自己有很多的網(wǎng)口,從某個口拿進一個網(wǎng)絡(luò)包來趁窃,用自己的程序處理一下牧挣,再從另一個網(wǎng)口發(fā)送出去。
復(fù)雜的程序都要分層醒陆,這是程序設(shè)計的要求瀑构。比如,復(fù)雜的電商還會分數(shù)據(jù)庫層刨摩、緩存層检碗、Compose 層、Controller 層和接入層码邻,每一層專注做本層的事情折剃。
當一個網(wǎng)絡(luò)包從一個網(wǎng)口經(jīng)過的時候,你看到了像屋,首先先看看要不要請進來怕犁,處理一把。有的網(wǎng)口配置了混雜模式己莺,經(jīng)過的全部拿進來奏甫。
process_layer2(buffer):從 Buffer 中,摘掉二層的頭凌受,假設(shè)這個包的 MAC 地址和你的相符阵子,那說明就是發(fā)給你的,調(diào)用process_layer3(buffer):摘掉三層的頭胜蛉,(如不是挠进,轉(zhuǎn)發(fā)出去)如果 IP 地址是自己的,那就是發(fā)給自己的誊册。根據(jù) IP 頭里面的標示领突,拿掉三層的頭,到底是調(diào)用process_tcp(buffer) 還是process_udp(buffer) 呢案怯?
假設(shè)是 TCP 的君旦,調(diào)用process_tcp(buffer)。查看四層的頭,如果是發(fā)起或應(yīng)答金砍,發(fā)送回復(fù)包局蚀;正常數(shù)據(jù)包,交給上層了恕稠。在四層的頭里面有端口號琅绅,不同的應(yīng)用監(jiān)聽不同的端口號。如果發(fā)現(xiàn)瀏覽器應(yīng)用在監(jiān)聽這個端口谱俭,發(fā)給瀏覽器
瀏覽器解析 HTML奉件,顯示出頁面來。電腦的主人看到頁面很開心昆著,就點了鼠標县貌。點擊鼠標的動作被瀏覽器捕獲。瀏覽器知道凑懂,又要發(fā)起另一個 HTTP 請求了煤痕,于是使用端口號,將請求發(fā)給了你接谨。
send_tcp(buffer)摆碉。Buffer 里面就是 HTTP 請求的內(nèi)容。加 TCP 的頭脓豪,記錄源端口號巷帝。瀏覽器會給你目的端口號,一般為 80 端口扫夜。
send_layer3(buffer)楞泼。Buffer 里面已經(jīng)有了 HTTP 的頭和內(nèi)容,以及 TCP 的頭笤闯。加IP 的頭堕阔,記錄下源 IP 的地址和目標 IP 的地址。
send_layer2(buffer)颗味。Buffer 里面已經(jīng)有了 HTTP 的頭和內(nèi)容超陆、TCP 的頭,以及 IP 的頭浦马。這個函數(shù)里面要加一下 MAC 的頭时呀,記錄下源 MAC 地址,得到的就是本機器的 MAC 地址和目標的 MAC 地址捐韩。知道就直接加上退唠;不知道就要通過一定的協(xié)議處理過程,找到 MAC 地址荤胁。反正要填一個,不能空著屎债。
只要 Buffer內(nèi)容完整仅政,從網(wǎng)口發(fā)出去了垢油。
所有不能表示出層層封裝含義的比喻,都是不恰當?shù)摹?/b>網(wǎng)絡(luò)世界不是這樣的圆丹。正確的應(yīng)該是滩愁,總經(jīng)理之間溝通的時候,經(jīng)理將總經(jīng)理放在自己兜里辫封,然后組長把經(jīng)理放自己兜里硝枉,員工把組長放自己兜里,像套娃娃一樣倦微。那員工直接溝通妻味,不帶上總經(jīng)理,就不恰當了欣福。
網(wǎng)絡(luò)世界责球,應(yīng)該是總經(jīng)理說話,經(jīng)理補充兩句拓劝,組長補充兩句雏逾,員工再補充兩句。
當然是 TCP 發(fā)送每一個消息郑临,都會帶著 IP 層和 MAC 層了栖博。因為,TCP 每發(fā)送一個消息厢洞,IP 層和 MAC 層的所有機制都要運行一遍仇让。 TCP 三次握手了,其實IP 層和 MAC 層為此也忙活好久了犀变。
只要是在網(wǎng)絡(luò)上跑的包妹孙,都是完整的』裰Γ可以有下層沒上層蠢正,絕對不可能有上層沒下層。
對 TCP 協(xié)議來說省店,三次握手也好嚣崭,重試也好,只要想發(fā)出去包懦傍,就要有 IP 層和 MAC 層雹舀,不然是發(fā)不出去的。
所謂的二層設(shè)備粗俱、三層設(shè)備说榆,都是這些設(shè)備上跑的程序不同而已。一個 HTTP 協(xié)議的包經(jīng)過一個二層設(shè)備,二層設(shè)備收進去的是整個網(wǎng)絡(luò)包签财。這里面 HTTP串慰、TCP、 IP唱蒸、 MAC 都有邦鲫。什么叫二層設(shè)備呀,就是只把 MAC 頭摘下來神汹,看看到底是丟棄庆捺、轉(zhuǎn)發(fā),還是自己留著屁魏。那什么叫三層設(shè)備呢滔以?就是把 MAC 頭摘下來之后,再把 IP 頭摘下來蚁堤,看看到底是丟棄醉者、轉(zhuǎn)發(fā),還是自己留著披诗。
記住秘訣:始終想象自己是一個處理網(wǎng)絡(luò)包的程序:如何拿到網(wǎng)絡(luò)包撬即,根據(jù)規(guī)則如何發(fā)出去;
評論1
很像發(fā)快遞的過程(http呈队,應(yīng)用層)剥槐,你向順豐下單(第一次請求),順豐接單(應(yīng)答),你向手機小伙聯(lián)系(回應(yīng)應(yīng)答),
你將消息放進盒子里(開始封裝請求宪摧,會話層)粒竖,
快遞員封裝一層盒子貼上快遞單帶回網(wǎng)店(傳輸層),
到快遞點檢查是否區(qū)域快件(網(wǎng)絡(luò)層)几于,
將快件交給運輸車(鏈路層)蕊苗,
各個快遞轉(zhuǎn)運中心(物理層),
轉(zhuǎn)運輸車(鏈路層)沿彭,
到達區(qū)域分發(fā)(網(wǎng)絡(luò)層)朽砰,
網(wǎng)點派送(傳輸層),
快遞員方面簽收(會話層)喉刘,
拆開檢查(表示層)瞧柔,
收到快遞(應(yīng)用層)。