今天這篇的標(biāo)題是“掃盲”,也就是說:即使那些完全不懂 IT 領(lǐng)域,也不懂CT領(lǐng)域的讀者,依然能看懂(至少能看懂一部分)。為了做到這點(diǎn),我會(huì)盡量使用通俗的比喻,并適當(dāng)加一些示意圖。
另外,就算你已經(jīng)比較了解網(wǎng)絡(luò)通信領(lǐng)域,本文中提到的某些部分,也可能是你所不知道的。也就是說:懂行的同學(xué),看看此文,也會(huì)有幫助。
本文的標(biāo)題特地強(qiáng)調(diào)了【系統(tǒng)性】——我希望這篇教程能幫助讀者對(duì)“計(jì)算機(jī)網(wǎng)絡(luò)通信”這個(gè)領(lǐng)域進(jìn)行系統(tǒng)性學(xué)習(xí)(何為“系統(tǒng)性學(xué)習(xí)”?)
為了做到【系統(tǒng)性】這個(gè)目的,這篇教程很長。建議大伙兒慢慢看,不要著急。
★基本概念
為了足夠通俗,我先要介紹一些基本概念。
◇信道(channel)
這是通訊領(lǐng)域非?;镜母拍睿隙ㄒ攘牧乃?。
通俗地說,信道就是“傳送信息的通道”。
◇信道的類型
首先,信道可以從廣義上分為“物理信道 & 邏輯信道”。
顧名思義,“物理信道”就是直接使用某種【物理介質(zhì)】來傳送信息;至于“邏輯信道”——是基于“物理信道”之上抽象出來的玩意兒(待會(huì)兒講到“協(xié)議?!钡臅r(shí)候再聊)。
◇信道的帶寬
“帶寬”指的是:某個(gè)信道在單位時(shí)間內(nèi)最大能傳輸多少比特的信息。
請(qǐng)注意:
電氣領(lǐng)域 & 計(jì)算機(jī)領(lǐng)域都有“帶寬”這個(gè)概念,但兩者的定義不太一樣。電氣領(lǐng)域所說的“帶寬”指的是“模擬帶寬”,單位是“赫茲/Hz”;計(jì)算機(jī)領(lǐng)域所說的“帶寬”指“數(shù)字帶寬”,單位是“比特率”或“字節(jié)率”。
后續(xù)章節(jié)提到“帶寬”,都是指計(jì)算機(jī)領(lǐng)域的術(shù)語。
◇帶寬的單位——容易把外行繞暈
“比特率”或“字節(jié)率”很容易搞混淆。用英文表示的話——大寫字母 B 表示【字節(jié)】;小寫字母 b 表示【比特】。
由于帶寬的數(shù)字通常很大,要引入“K、M、G”之類的字母表示數(shù)量級(jí),于是又引出一個(gè)很扯蛋的差異——“10進(jìn)制”與“2進(jìn)制”的差異。
【10進(jìn)制】的 K 表示 1000;M 表示 1000×1000(1百萬)
【2進(jìn)制】的 K 表示 1024(2的10次方);M 表示 1024×1024(2的20次方)
為了避免扯皮,后來國際上約定了一個(gè)規(guī)矩:對(duì)【2進(jìn)制】的數(shù)量級(jí)要加一個(gè)小寫字母 i。比如說:Ki 表示 1024;Mi 表示 1024×1024 …… 以此類推。
舉例:
1Kbps 表示“1000比特每秒”
1KiBps 表示“1024字節(jié)每秒”
◇信道的工作模式:單工 VS 半雙工 VS 全雙工
再來說說信道的工作模式。大致可以分為如下三種。為了讓大伙兒比較好理解,我對(duì)每一種都舉相應(yīng)的例子。
單工(simplex)
比如“電臺(tái)廣播”就是典型的【單工】?!半娕_(tái)”可以發(fā)信號(hào)給“收音機(jī)”,但“收音機(jī)”【不能】發(fā)信號(hào)給“電臺(tái)”。
半雙工(half-duplex)
比如“單條鐵路軌道”,就是典型的【半雙工】。火車在單條鐵軌上,可以有兩種運(yùn)行方向;但對(duì)于同一個(gè)瞬間,只能選其中一個(gè)方向(否則就撞車了)。
全雙工(full-duplex)
比如“光纖”就是典型的【全雙工】。在同一根光導(dǎo)纖維中,可以有多個(gè)光束【同時(shí)相向】傳播,互相不會(huì)干擾對(duì)方。
◇端點(diǎn)
為了敘述方便,我把參與通訊的對(duì)象(主體)稱作“通訊端點(diǎn)”,簡稱“端點(diǎn)”。
這里的“端點(diǎn)”是廣義的,可以是硬件(比如某個(gè)網(wǎng)卡),也可以是軟件(比如某個(gè)應(yīng)用程序)。
◇單播、組播/多播、廣播、選播
對(duì)于“網(wǎng)絡(luò)通訊”,至少得有 N 個(gè)端點(diǎn)參與,并且【N ≥ 2】才有意義。
當(dāng) N 個(gè)端點(diǎn)構(gòu)成一個(gè)網(wǎng)絡(luò),這時(shí)候就會(huì)涉及到“單播、組播、廣播”這幾個(gè)概念。
通俗地說:
單播(unicast)——發(fā)送給網(wǎng)絡(luò)中的指定的【單個(gè)】端點(diǎn)
組播/多播(multicast)——發(fā)送給網(wǎng)絡(luò)中的指定的【多個(gè)】端點(diǎn)
廣播(broadcast)——發(fā)送給網(wǎng)絡(luò)中的【所有】端點(diǎn)
選播(anycast)——發(fā)送給網(wǎng)絡(luò)中隨機(jī)選擇的【單個(gè)】端點(diǎn)
◇通訊協(xié)議(protocol)
所謂的“通訊協(xié)議”就是:參與通訊的各方所采用的某種【約定】。只有大家都遵守這個(gè)約定,才有可能相互傳遞信息。
打個(gè)比方:如果兩個(gè)人要用自然語言交流,前提是:雙方使用相同(或相互兼容)的自然語言。
“通訊協(xié)議”就類似某種自然語言,參與通訊的多個(gè)端點(diǎn),都必須能理解這個(gè)語言。
★從“分層”到“參考模型”
◇分層
在聊“分層”之前,先說說“分工”。比如在一個(gè)公司中,通常設(shè)有不同的工種/崗位,這就是【分工】。
對(duì)于網(wǎng)絡(luò)通訊也是如此,不太可能用一種通訊協(xié)議完成所有的信息傳遞任務(wù)(注:對(duì)于特別簡單的網(wǎng)絡(luò),或許有可能只用單一協(xié)議;但如今的網(wǎng)絡(luò)通訊已經(jīng)很復(fù)雜,用【單個(gè)】通訊協(xié)議包辦所有事情,已經(jīng)不太可能)
一旦采用了多種通訊協(xié)議,這幾種協(xié)議之間,該如何配合捏?
在網(wǎng)絡(luò)通訊領(lǐng)域,采用的是【分層】的設(shè)計(jì)思路。多個(gè)層次的協(xié)議在一起協(xié)同工作,技術(shù)上稱作“協(xié)議棧”(洋文叫做“protocol stack”)。
◇協(xié)議棧的原理
對(duì)于多層次的協(xié)議棧。每個(gè)層次都有各自的“端點(diǎn)”(進(jìn)行通訊的主體)。處于【同一層次】的兩個(gè)端點(diǎn)會(huì)使用該層次的協(xié)議進(jìn)行通訊(注:同一個(gè)層次的協(xié)議,可能只有一個(gè),也可能有多個(gè))。
除了最頂層,每個(gè)層次的端點(diǎn)會(huì)向其【直接】上層提供“服務(wù)”;除了最底層,每個(gè)層次的端點(diǎn)會(huì)調(diào)用【直接】下層提供的“服務(wù)”(這里所說的“服務(wù)”指某種“編程接口”,技術(shù)行話叫 API)。
(“協(xié)議棧”的示意圖)
(“服務(wù)”與“協(xié)議”之間的關(guān)系)
◇邏輯信道
(前一個(gè)小節(jié)說了)每個(gè)層次會(huì)向上一個(gè)層次提供服務(wù)(API 調(diào)用)。對(duì)上層而言,調(diào)用下層提供的 API 發(fā)送信息,其效果相當(dāng)于在使用某種【信道】進(jìn)行通訊,這也就是我在 ★基本概念 那個(gè)章節(jié)所說的“邏輯信道”。
(“邏輯信道”示意圖)
◇數(shù)據(jù)格式的原理
大部分協(xié)議會(huì)把要傳送的數(shù)據(jù)切割為 N 份,每一份就是一個(gè)數(shù)據(jù)包。
通常來說,數(shù)據(jù)包的格式有如下三部分:
頭部
身體(也稱作“有效載荷”)
尾部(注:很多協(xié)議沒有尾部)
如果你收過快遞,可以把“網(wǎng)絡(luò)數(shù)據(jù)包”與“快遞包裹”作一個(gè)對(duì)照——
數(shù)據(jù)包的“頭/尾”,就類似于快遞包裹的【包裝袋】。數(shù)據(jù)包的“身體”,就類似于快遞包裹里面的東西。
對(duì)于【相鄰】兩層的協(xié)議,【下】層包含【上】層。也就是說:下層協(xié)議的【載荷】就是上層協(xié)議的【整體】。
還是以快遞舉例:
假設(shè)你從網(wǎng)上買了一臺(tái)筆記本電腦。電腦出廠時(shí),電腦廠商肯定會(huì)提供一個(gè)包裝盒。快遞公司在寄送這臺(tái)筆記本的時(shí)候,又會(huì)在筆記本的盒子外面再加一個(gè)包裝袋。對(duì)應(yīng)到網(wǎng)絡(luò)協(xié)議——“快遞公司的包裝袋”相當(dāng)于【下層】協(xié)議;“電腦廠商的包裝盒”,相當(dāng)于【上層】協(xié)議。
(上下層協(xié)議的格式及包含關(guān)系)
◇網(wǎng)絡(luò)分層的參考模型
上述所說的“分層 & 協(xié)議棧”只是一個(gè)抽象的(籠統(tǒng)的)思路。具體要分幾層?每一層要干啥事兒?這些都是很有講究滴!網(wǎng)絡(luò)技術(shù)發(fā)展了幾十年,已經(jīng)有很多牛人提出了各種不同的劃分方案,稱之為“網(wǎng)絡(luò)分層的參考模型”(為了打字省力,以下簡稱“模型”)。
在各種模型中,名氣最大的當(dāng)然是“OSI 模型”(洋文稱作“OSI model”)。在后續(xù)的章節(jié)中,我會(huì)以這個(gè)模型為主體,進(jìn)行介紹。
除了“OSI 模型”還有一個(gè)很出名的模型是“TCP/IP 模型”(因?yàn)榛ヂ?lián)網(wǎng)很成功,它才跟著出名)。對(duì)“TCP/IP 模型”的分層,不同的文章或書籍,說法不太一樣(“3層、4層、5層”皆有),這就引發(fā)了一些爭議。包括幾位熱心讀者也在博客留言,表達(dá)不同意見。為了避免一家之言,貼出XX百科的“”,其中給出了幾種比較有名的說法。
另外,我想提醒一下:
由于本文是基于【OSI 模型】進(jìn)行展開。對(duì)于 TCP/IP 模型到底算幾層,這方面的爭論【不】影響本文后續(xù)的內(nèi)容。
★OSI 概述
◇OSI 的歷史
“OSI”的全稱是“Open System Interconnection”。先說說它的歷史。
上世紀(jì)70年代,“國際電信聯(lián)盟”(ITU)想對(duì)各國的電信系統(tǒng)(電話/電報(bào))建立標(biāo)準(zhǔn)化的規(guī)格;與此同時(shí),“國際標(biāo)準(zhǔn)化組織”(ISO)想要建立某種統(tǒng)一的標(biāo)準(zhǔn),使得不同公司制造的大型主機(jī)可以相互聯(lián)網(wǎng)。
后來,這兩個(gè)國際組織意識(shí)到:“電信系統(tǒng)互聯(lián)”與“電腦主機(jī)互聯(lián)”的性質(zhì)差不多。于是 ISO 與 ITU 就決定合作,兩家一起干。這2個(gè)組織的2套班子,從上世紀(jì)70年代開始搞,搞來搞去,搞了很多年,一直到1984年才終于正式發(fā)布 OSI 標(biāo)準(zhǔn)。
◇OSI 標(biāo)準(zhǔn)的兩個(gè)組成部分
嚴(yán)格來講,OSI 包括兩大部分——
其一,抽象的概念模型,也就是前面提到的【OSI model】;
其二,針對(duì)這個(gè)概念模型的具體實(shí)現(xiàn)(具體的通訊協(xié)議),洋文叫做【OSI protocols】。
(前面說了)OSI 是由 ISO & ITU 聯(lián)手搞出來滴。這兩個(gè)國際組織里面的人,要么是來自各國的電信部門,要么是來自各國的高校學(xué)者。總而言之,既有嚴(yán)重的官僚風(fēng)氣,又有明顯的學(xué)究風(fēng)氣。(正是因?yàn)檫@兩種風(fēng)氣疊加,所以搞了很多年,才搞出 OSI)
OSI 的協(xié)議實(shí)現(xiàn)(OSI protocols),不客氣地說,就是一堆垃圾——據(jù)說把 OSI protocols 所有的協(xié)議文檔,全部打印成 A4 紙,摞起來得有一米多高!是不是很嚇人?協(xié)議搞得如此復(fù)雜,嚴(yán)重違背了 IT 設(shè)計(jì)領(lǐng)域的 KISS 原則。
由于 OSI protocols 實(shí)在太復(fù)雜,后來基本沒人用。但 OSI model 反而廣為流傳,并且成為“網(wǎng)絡(luò)分層模型”中名氣最大,影響力最廣的一個(gè)。
因此,本文后續(xù)章節(jié)中,凡是提到 OSI,指的是【OSI model】。
◇OSI 模型的7層
OSI 模型總共分7層,示意圖參見如下表格:
|
層次 |
中文名 |
英文名 |
|
第7層 |
應(yīng)用層 |
Application Layer |
|
第6層 |
表示層 |
Presentation Layer |
|
第5層 |
會(huì)話層 |
Session Layer |
|
第4層 |
傳輸層 |
Transport Layer |
|
第3層 |
網(wǎng)絡(luò)層 |
Network Layer |
|
第2層 |
數(shù)據(jù)鏈路層 |
Data Link Layer |
|
第1層 |
物理層 |
Physical Layer |
(注:為了打字省力,在后續(xù)章節(jié)把“數(shù)據(jù)鏈路層”直接稱為“鏈路層”)
考慮到本文是針對(duì)一般性讀者的【掃盲教程】,我重點(diǎn)聊第1~4層。搞明白這幾個(gè)層次之后,有助于你更好地理解網(wǎng)絡(luò)的很多概念,也有助于你更好地理解很多信息安全的概念。
網(wǎng)上已經(jīng)有很多關(guān)于 OSI 的文章,可惜大部分寫得粗糙——很多文章只是在照抄定義。
要想更好地理解 OSI 模型,你得搞明白:為啥需要引入某某層?(請(qǐng)注意:這是一個(gè) WHY 型的問題)
接下來在討論 OSI 的每個(gè)層次時(shí),我都會(huì)專門寫一個(gè)小節(jié),談該層次的【必要性】。搞明白【必要性】,你就知道為啥要引入這個(gè)層次。
★物理層:概述
◇物理層的必要性
通俗地說:直接與物理介質(zhì)打交道的層次,就是物理層。這一層的必要性比較明顯。
因?yàn)樗械耐ㄓ?,歸根結(jié)底都要依賴于【物理介質(zhì)】。與物理介質(zhì)打交道,需要牽涉到很多與【物理學(xué)】相關(guān)的東東。比如:“無線電通訊”需要關(guān)心“頻率/波長”;電纜通訊需要跟“電壓”打交道;“光纖通訊”需要關(guān)心“玻璃的折射率&光線的入射角” ……
“物理層”的主要職責(zé)是:屏蔽這些細(xì)節(jié),使得“物理層”之上的層次不用再去操心物理學(xué)。
◇物理信道的類型
何為“物理信道”,在本文開篇的“基本概念”已經(jīng)提到了。
對(duì)于“物理信道”,還可以進(jìn)一步細(xì)分為如下三大類:
1. 有線信道(比如:雙絞線、同軸電纜、光纖、等等)
2. 無線信道(比如:微波通訊、電臺(tái)廣播、衛(wèi)星通訊、等等)
3. 存儲(chǔ)信道
“存儲(chǔ)信道”比較少見,很多人沒聽說過,稍微解釋一下。
假設(shè)你要把一大坨信息傳送給另一個(gè)人,除了用“有線 or 無線”這兩種通訊方式,還可以把信息先保存到某種【存儲(chǔ)介質(zhì)】(比如硬盤),然后再把存儲(chǔ)介質(zhì)用某種方式(比如快遞)轉(zhuǎn)交給對(duì)方。這就是所謂的“存儲(chǔ)信道”。
◇信噪比(Signal-to-noise ratio)
信噪比這個(gè)概念是從通信領(lǐng)域借用的術(shù)語。
對(duì)于“物理信道”,總是會(huì)存在某些環(huán)境干擾,稱之為“噪聲”(Noise)。“信道傳輸?shù)挠杏眯畔ⅰ迸c“無用的干擾噪聲”,這兩者的比值就是“信噪比”。
“信噪比”單位是【分貝】?!胺重悺庇⑽慕凶觥癲ecibel”(簡寫為 dB)。“deci”表示“十進(jìn)制”;“bel”是為了紀(jì)念大名鼎鼎的貝爾(電話它爹)。
◇帶寬的限制因素
“物理信道”要依賴于物理傳輸介質(zhì)。不管使用何種物理介質(zhì),都要受限于某些基本的物理學(xué)定律(比如“光速上限”)。另外,不管何種物理介質(zhì),總是會(huì)有或多或少的環(huán)境干擾(噪聲)。這兩個(gè)因素導(dǎo)致了:任何“物理信道”的最大傳輸率總是有限滴。
由于物理層是最底下的一層,物理層之上的其它層次總是要直接或間接地依賴【物理信道】。因此,其它層次建立的“邏輯信道”,其帶寬只會(huì)比“物理信道”的最大帶寬更小。換句話說:“物理信道”的帶寬上限也就是整個(gè)協(xié)議棧的帶寬上限。
◇多路復(fù)用(Multiplexing)
一般來說,凡是能實(shí)現(xiàn)【長距離】通訊的“物理信道”,都有相當(dāng)?shù)慕?jīng)濟(jì)成本。比如鋪設(shè)“光纖、同軸電纜”都要花錢。無線電通訊雖然免去了鋪設(shè)線路的成本,但需要競標(biāo)購買頻段。因此,物理信道非常強(qiáng)調(diào)“多路復(fù)用”。
所謂的“多路復(fù)用”,通俗地說就是:盡可能地共享物理信道,不要浪費(fèi)了。
“多路復(fù)用”有很多種類型;不同的類型,原理也不同。為了展示各種不同的原理,我拿【無線通信】來說事兒。
無線通信領(lǐng)域的“多路復(fù)用”,【至少】有如下幾種:
頻分多路復(fù)用/FDM(Frequency-Division Multiplexing)
這個(gè)最簡單,就是根據(jù)頻率拆分。不同的線路占用不同的頻段,互不干擾。(電臺(tái)廣播用的就是這個(gè)思路)
但這個(gè)思路的缺點(diǎn)很明顯——
其一,要依賴足夠?qū)挼念l段(頻段是稀缺資源);
其二,不同線路的流量可能會(huì)動(dòng)態(tài)變化。如果某個(gè)線路空閑,其占用的頻段就浪費(fèi)了。
(注:光纖通訊中有個(gè)“波分多路復(fù)用/WDM”,本質(zhì)上就是 FDM)
時(shí)分多路復(fù)用/TDM(Time-Division Multiplexing)
這種思路只用一個(gè)很窄的頻段。為了在同一個(gè)頻道發(fā)送多個(gè)信道,采用【分時(shí)機(jī)制】,把時(shí)間切割成很小的時(shí)間片,每個(gè)線路占用一個(gè)時(shí)間片。周而往復(fù)。
這個(gè)思路有點(diǎn)像十字路口的紅綠燈——每隔一段時(shí)間,其中一條路可以通行。
這個(gè)思路的優(yōu)點(diǎn)是:可以只使用一個(gè)很窄的頻段。缺點(diǎn)是:線路越多,每條線路等待越久;即使某個(gè)線路空閑,依然會(huì)占用時(shí)間片(浪費(fèi)了資源)。
碼分多路復(fù)用/CDM(Code-Division Multiplexing)
這種思路采用某種【編碼】的技巧,使得多個(gè)端點(diǎn)可以在同一個(gè)時(shí)間點(diǎn)使用同一頻段發(fā)送數(shù)據(jù);由于他們采用不同的編碼方式,不會(huì)相互干擾。
一般來說,CDM 要依賴于“擴(kuò)頻技術(shù)”(spread spectrum),需占用一個(gè)比較寬的頻道范圍。這算是缺點(diǎn)。但其優(yōu)點(diǎn)很明顯——
其一,可以支持 N 個(gè)線路(N 動(dòng)態(tài)變化);
其二,即使任何一個(gè)線路的流量動(dòng)態(tài)變化,也不會(huì)浪費(fèi)物理信道的資源。
顯然,這種思路明顯優(yōu)于 FDM & TDM。如今在移動(dòng)通訊領(lǐng)域大名鼎鼎的 CDMA(碼分多址),采用的就是這個(gè)思路。
★物理層:具體實(shí)例
◇物理層的【協(xié)議】
物理層的協(xié)議主要有如下:
USB 協(xié)議
藍(lán)牙協(xié)議的一部分
IEEE 802.11 的一部分(Wi-Fi)
IEEE 802.16(WiMAX)
IEEE 1394(火線接口)
RS-232 協(xié)議(串行接口/串口)
……
(考慮到篇幅)我不可能具體細(xì)聊這些協(xié)議,只是貼出每個(gè)的XX百科鏈接,感興趣的同學(xué)自己點(diǎn)進(jìn)去看。
◇物理層的【協(xié)議實(shí)現(xiàn)】
對(duì)于電腦主機(jī)(含移動(dòng)設(shè)備),“網(wǎng)卡硬件”包含了物理層的協(xié)議實(shí)現(xiàn)(參見如下示意圖)
另外,還有一些專門的【1層】網(wǎng)絡(luò)設(shè)備,也提供物理層的功能(參見下一個(gè)小節(jié))。
(OSI 模型中,不同層次的協(xié)議實(shí)現(xiàn))
◇物理層相關(guān)的【網(wǎng)絡(luò)設(shè)備】
調(diào)制解調(diào)器(modem)
通俗地說,“調(diào)制解調(diào)器”就是用來翻譯“數(shù)字信號(hào) & 模擬信號(hào)”。
在發(fā)送信息時(shí),modem 把電腦要發(fā)送的“字節(jié)流”(數(shù)字信號(hào))翻譯成“模擬信號(hào)”,然后通過物理介質(zhì)發(fā)送出去;當(dāng)它從物理介質(zhì)收到“模擬信號(hào)”,再翻譯成“數(shù)字信號(hào)”,傳回給電腦。
早期的撥號(hào)上網(wǎng),modem 面對(duì)的物理介質(zhì)是“固話線路”;如今家庭寬帶普及,光纖入戶,modem 面對(duì)的物理介質(zhì)是“光纖線路”。
(老式 modem,用于固定電話線路)
中繼器(repeater)
信號(hào)在物理介質(zhì)中傳輸,會(huì)出現(xiàn)【衰減】(不論是“有線 or 無線”都有可能衰減)?!爸欣^器”的作用是【信號(hào)增益】,使得信號(hào)能傳得更遠(yuǎn)。
另外,比如“微波通訊”是直線傳播,而地球表面有弧度,還有地形的起伏。所以每隔一定距離要建“微波塔”。這玩意兒也相當(dāng)于“中繼器”。
(微波塔示意圖)
集線器(hub)
可以把“集線器”視作更牛逼的“中繼器”——“中繼器”只有兩個(gè)口(只能連接兩個(gè)通訊端點(diǎn)),而“集線器”有多個(gè)口(同時(shí)連接多個(gè)通訊端點(diǎn))。
通常所說的“集線器”是指“以太網(wǎng)集線器”。這種設(shè)備如今已經(jīng)逐步淘汰,很少見到了。
另外,很多同學(xué)應(yīng)該都用過“USB hub”,就是針對(duì) USB 線的“集線器”(“USB 線”也可以視作某種通訊介質(zhì))。
(老式的10兆以太網(wǎng)集線器)
★鏈路層:概述
◇鏈路層的必要性
對(duì)信息的打包
物理層傳輸?shù)男畔?,通俗地說就是【比特流】(也就是一長串比特)。但是對(duì)于計(jì)算機(jī)來說,“比特流”太低級(jí)啦,處理起來極不方便?!版溌穼印币傻牡谝粋€(gè)事情,就是把“比特流”打包成更大的一坨,以方便更上層的協(xié)議進(jìn)行處理。在 OSI 模型中,鏈路層的一坨,稱之為“幀”(frame)。
差錯(cuò)控制
物理介質(zhì)的傳輸,可能受到環(huán)境的影響。這種影響不僅僅體現(xiàn)為“噪聲”,有時(shí)候會(huì)出現(xiàn)嚴(yán)重的干擾,導(dǎo)致物理層傳輸?shù)摹氨忍亓鳌背鲥e(cuò)(某個(gè)比特“從0變1”或“從1變0”)。因此,鏈路層還需要負(fù)責(zé)檢查物理層的傳輸是否出錯(cuò)。在 IT 行話中,檢測是否出錯(cuò),稱之為“差錯(cuò)控制機(jī)制”(后面有一個(gè)小節(jié)會(huì)簡單說一下這個(gè)話題)。
流量控制
假設(shè)兩個(gè)端點(diǎn)通過同一個(gè)物理信道進(jìn)行通訊,這兩個(gè)端點(diǎn)處理信息的速度可能不同。如果發(fā)送方輸出信息的速度超過接收方處理信息的速度,通訊就會(huì)出問題。于是就需要有某種機(jī)制來協(xié)調(diào),確保發(fā)送方的發(fā)送速度不會(huì)超出接收方的處理速度。在技術(shù)行話中,這稱之為“流量控制”,簡稱“流控”。
信道復(fù)用
在上一個(gè)章節(jié)已經(jīng)講到:用于遠(yuǎn)距離通訊的“物理介質(zhì)”,總是有成本。因此需要對(duì)物理信道進(jìn)行“多路復(fù)用”,就會(huì)導(dǎo)致多個(gè)端點(diǎn)共用同一個(gè)物理信道。如果同時(shí)存在多個(gè)發(fā)送者和多個(gè)接收者。接收者如何知道某個(gè)信息是發(fā)給自己而不是別人?
另外,某些物理介質(zhì)可能不支持并發(fā)(無法同時(shí)發(fā)送信息)。某些物理介質(zhì)可能是【半雙工】,所有這些物理層的限制,都使得“多路復(fù)用”變得復(fù)雜。為了解決這些問題,鏈路層需要提供了某種相應(yīng)的機(jī)制(協(xié)議),術(shù)語叫做“介質(zhì)訪問控制”(洋文是“Media Access Control”,簡稱 MAC)。后續(xù)小節(jié)會(huì)聊它。
◇差錯(cuò)控制
為了發(fā)現(xiàn)傳輸?shù)男畔⑹欠癯鲥e(cuò),設(shè)計(jì)了很多相應(yīng)的數(shù)學(xué)算法。這些算法大體分為兩類:“檢錯(cuò)算法 & 糾錯(cuò)算法”。
簡而言之,“檢錯(cuò)算法”只能檢測出錯(cuò)誤,而“糾錯(cuò)算法”不但能檢測出錯(cuò)誤,還能糾正錯(cuò)誤。很顯然,“糾錯(cuò)算法”更牛逼,但是它也更復(fù)雜。
常見的“檢錯(cuò)算法”對(duì)傳輸?shù)臄?shù)據(jù)計(jì)算出一個(gè)【校驗(yàn)值】,接收方收到數(shù)據(jù)會(huì)重新計(jì)算校驗(yàn)和,如果算出來不對(duì),就把收到的數(shù)據(jù)丟棄,讓對(duì)方重發(fā)。“校驗(yàn)算法”的原理類似于《掃盲文件完整性校驗(yàn)——關(guān)于散列值和數(shù)字簽名》一文中提到的“散列算法/哈希算法”。
“糾錯(cuò)算法”更高級(jí),由于涉及到更多數(shù)學(xué),我就不展開啦。
對(duì)于【無線】物理信道,由于出錯(cuò)的概率更高,并且重新傳輸數(shù)據(jù)的成本也更高。所以【無線】通訊的鏈路層協(xié)議,更傾向于用【糾錯(cuò)】機(jī)制;作為對(duì)比,【有線】通訊的鏈路層協(xié)議,更傾向于用【檢錯(cuò)】機(jī)制。
◇MAC 協(xié)議
“MAC 協(xié)議”用來確保對(duì)下層物理介質(zhì)的使用,不會(huì)出現(xiàn)沖突。為了形象,我拿“鐵路系統(tǒng)”來比喻,說明“MAC 協(xié)議”的用途。
假設(shè)有一條【單軌】鐵路連接 A/B 兩地。有很多火車想從 A 開到 B,同時(shí)還有很多火車想從 B 開到 A。
首先,要確保不發(fā)生撞車(如果已經(jīng)有車在 A 開往 B 的途中,那么 B 就不能再發(fā)車);其次,即使是同一個(gè)方向的車,出發(fā)時(shí)間也要錯(cuò)開一個(gè)時(shí)間間隔。
所有這些協(xié)調(diào)工作,都是靠“MAC 協(xié)議”來搞定。
◇MAC 地址
為了完成上述任務(wù),光有“MAC 協(xié)議”還不夠,還需要為每一個(gè)端點(diǎn)引入【惟一的】標(biāo)識(shí)。這個(gè)標(biāo)識(shí)就稱作“MAC 地址”。
通俗地說,每個(gè)網(wǎng)卡都內(nèi)置了一個(gè)“MAC 地址”。這個(gè)地址是網(wǎng)卡在出廠的時(shí)候就已經(jīng)設(shè)置好的,并且用某種機(jī)制確保該地址【全球唯一】。
如何保證 MAC 地址全球唯一捏?簡單說一下:
MAC 地址包含6個(gè)字節(jié)(48個(gè)比特),分為兩半。第一部分稱作【OUI】,OUI 的24個(gè)比特中,其中2個(gè)比特有特殊含義,其它22個(gè)比特,用來作為網(wǎng)卡廠商的唯一編號(hào)。這個(gè)編號(hào)由國際組織 IEEE 統(tǒng)一分配。
MAC 地址第二部分的24比特,由網(wǎng)卡廠商自己決定如何分配。每個(gè)廠商只要確保自己生產(chǎn)的網(wǎng)卡,后面這24比特是唯一的,就行啦。
(MAC 地址的構(gòu)成) 順便說說【虛擬網(wǎng)卡】的 MAC 地址。
“虛擬網(wǎng)卡”是由【虛擬化軟件】創(chuàng)建滴。IEEE 也給每個(gè)虛擬化軟件的廠商(含開源社區(qū))分配了唯一的 OUI。因此,虛擬化軟件在創(chuàng)建“虛擬網(wǎng)卡”時(shí),會(huì)使用自己的 OUI 生成前面24個(gè)比特;后面的24比特,會(huì)采用某種算法使之盡可能【隨機(jī)化】。由于“2的24次方”很大(224 = 16777216),碰巧一樣的概率很低。
(注:如果手工修改 MAC 地址,故意把兩塊網(wǎng)卡的 MAC 地址搞成一樣,那確實(shí)就做不到唯一性了。并且會(huì)導(dǎo)致鏈路層的通訊出問題)
★鏈路層:具體實(shí)例
◇鏈路層的【協(xié)議】
鏈路層的協(xié)議主要有如下:
MAC 協(xié)議(介質(zhì)訪問控制)
LLC 協(xié)議(邏輯鏈路控制)
ARP 協(xié)議(解析 MAC 地址)
IEEE 802.3(以太網(wǎng))
IEEE 802.11 的一部分(Wi-Fi)
L2TP 協(xié)議(2層VPN)
PPP 協(xié)議(撥號(hào)上網(wǎng))
SLIP 協(xié)議(撥號(hào)上網(wǎng))
……
(考慮到篇幅)我不可能具體細(xì)聊這些協(xié)議,只是貼出每個(gè)的XX百科鏈接,感興趣的同學(xué)自己點(diǎn)進(jìn)去看。
◇鏈路層的【協(xié)議實(shí)現(xiàn)】
對(duì)于電腦主機(jī)(含移動(dòng)設(shè)備),“網(wǎng)卡硬件 & 網(wǎng)卡驅(qū)動(dòng)”會(huì)包含鏈路層協(xié)議的實(shí)現(xiàn)(參見如下示意圖)。
另外,還有一些專門的【2層】網(wǎng)絡(luò)設(shè)備,也提供鏈路層的功能(參見下一個(gè)小節(jié))。
(OSI 模型中,不同層次的協(xié)議實(shí)現(xiàn))
◇鏈路層相關(guān)的【網(wǎng)絡(luò)設(shè)備】
網(wǎng)絡(luò)交換機(jī)(network switch)
(注:一般提到“網(wǎng)絡(luò)交換機(jī)”,如果不加定語,指的就是“2層交換機(jī)”;此外還有更高層的交換機(jī),在后續(xù)章節(jié)介紹)
為啥要有交換機(jī)捏?我拿“以太網(wǎng)的發(fā)展史”來說事兒。
以太網(wǎng)剛誕生的時(shí)候,稱之為“經(jīng)典以太網(wǎng)”,電腦是通過【集線器】相連?!凹€器”前面提到過,工作在【1層】(物理層),并不理解鏈路層的協(xié)議。因此,集線器的原理是【廣播】模式——它從某個(gè)網(wǎng)線接口收到的數(shù)據(jù),會(huì)復(fù)制 N 份,發(fā)送到其它【每個(gè)】網(wǎng)線接口。假設(shè)有4臺(tái)電腦(A、B、C、D)都連在集線器上,A 發(fā)數(shù)據(jù)給 B,其實(shí) C & D 也都收到 A 發(fā)出的數(shù)據(jù)。顯然,這種工作模式很(低效)。由于“經(jīng)典以太網(wǎng)”的工作模式才“10兆”,所以集線器雖然低效,還能忍受。
后來要發(fā)展“百兆以太網(wǎng)”,再用這種傻SB的廣播模式,就不能忍啦。于是“經(jīng)典以太網(wǎng)”就發(fā)展為“交換式以太網(wǎng)”。用【交換機(jī)】代替“集線器”。
交換機(jī)是工作在2層(鏈路層)的設(shè)備,能夠理解鏈路層協(xié)議。當(dāng)交換機(jī)從某個(gè)網(wǎng)線接口收到一份數(shù)據(jù)(鏈路層的“幀”),它可以識(shí)別出“鏈路幀”里面包含的目標(biāo)地址(接收方的 MAC 地址),然后只把這份數(shù)據(jù)轉(zhuǎn)發(fā)給“目標(biāo) MAC 地址相關(guān)的網(wǎng)線接口”。
由于交換機(jī)能識(shí)別2層協(xié)議,它不光比集線器的性能高,而且功能也強(qiáng)得多。比如(稍微高級(jí)點(diǎn)的)交換機(jī)可以實(shí)現(xiàn)“MAC 地址過濾、VLAN、QoS”等多種額外功能。
網(wǎng)橋/橋接器(network bridge)
“交換機(jī)”通常用來連接【同一種】網(wǎng)絡(luò)的設(shè)備。有時(shí)候,需要讓兩臺(tái)不同網(wǎng)絡(luò)類型的電腦相連,就會(huì)用到【網(wǎng)橋】。
下面以“操作系統(tǒng)虛擬機(jī)”來舉例(完全沒用過虛擬機(jī)的同學(xué),請(qǐng)?zhí)^這個(gè)舉例)。
在這篇博文,我介紹了虛擬機(jī)的幾種“網(wǎng)卡模式”,其中有一種模式叫做【bridge 模式】。一旦設(shè)置了這種模式,Guest OS 的虛擬網(wǎng)卡,對(duì)于 Host OS 所在的外部網(wǎng)絡(luò),是【雙向】可見滴。也就是說,物理主機(jī)所在的外部網(wǎng)絡(luò),也可以看見這塊虛擬網(wǎng)卡。
現(xiàn)在,假設(shè)你的物理電腦(Host OS)只安裝了【無線網(wǎng)卡】(WiFi),而虛擬化軟件給 Guest OS 配置的通常是【以太網(wǎng)卡】。顯然,這是兩種【不同】的網(wǎng)絡(luò)。為啥 Guest OS 的以太網(wǎng)卡設(shè)置為“bridge 模式”之后,外部 WiFi 網(wǎng)絡(luò)可以看到它捏?
奧妙在于——虛擬化軟件在內(nèi)部悄悄地幫你實(shí)現(xiàn)了一個(gè)“網(wǎng)橋”。這個(gè)網(wǎng)橋把“Host OS 的 WiFi 網(wǎng)卡”與“Guest OS 的以太網(wǎng)卡”關(guān)聯(lián)起來。WiFi 網(wǎng)卡收到了鏈路層數(shù)據(jù)之后,如果接收方的 MAC 地址對(duì)應(yīng)的是 Guest OS,網(wǎng)橋會(huì)把這份數(shù)據(jù)丟給 Guest OS 的網(wǎng)卡。
這種網(wǎng)卡模式之所以稱作“bridge 模式”,原因就在于此。
◇鏈路層相關(guān)的【軟件工具】
嗅探抓包工具(Sniffer)
要了解鏈路層的數(shù)據(jù)包結(jié)構(gòu),需要用到“嗅探工具”。這類工具能捕獲流經(jīng)你網(wǎng)卡的所有【鏈路層】數(shù)據(jù)包。前面聊“協(xié)議?!钡臅r(shí)候說過:下層數(shù)據(jù)包的載荷就是上層數(shù)據(jù)包的整體。因此,拿到【鏈路層】數(shù)據(jù)包也就意味著:你已經(jīng)拿到2層之上的所有數(shù)據(jù)包的信息了。
有些抓包工具自帶圖形界面,可以直接顯示數(shù)據(jù)包的內(nèi)容給你看。還有些只提供命令行(只是把獲取的數(shù)據(jù)包保存為文件),然后要搭配其它圖形化的工具來展示數(shù)據(jù)包的內(nèi)容。
抓包的工具有很多,名氣最大的是 Wireshark(原先叫做 Ethereal)。
ARP 命令
首先,ARP 是“MAC 地址解析協(xié)議”的洋文名稱。該協(xié)議根據(jù)“IP 地址”解析“MAC 地址”。
Windows 自帶一個(gè)同名的 arp 命令,可以用來診斷與“MAC 地址”相關(guān)的信息。比如:列出當(dāng)前子網(wǎng)中其它主機(jī)的 IP 地址以及對(duì)應(yīng)的 MAC 地址。這個(gè)命令在 Linux & Mac OS 上也有。
★網(wǎng)絡(luò)層:概述
◇網(wǎng)絡(luò)層的必要性
路由機(jī)制(routing)
在 OSI 模型中,鏈路層本身【不】提供路由功能。你可以通俗地理解為:鏈路層只處理【直接相連】的兩個(gè)端點(diǎn)(注:這么說不完全嚴(yán)密,只是幫助外行理解)
對(duì)于某個(gè)復(fù)雜網(wǎng)絡(luò),可能有很多端點(diǎn),有很復(fù)雜的拓?fù)浣Y(jié)構(gòu)。當(dāng)拓?fù)渥銐驈?fù)雜,總有一些端點(diǎn)之間【沒有直連】。那么,如何在這些【沒有直連】的端點(diǎn)之間建立通訊捏?此時(shí)就需要提供某種機(jī)制,讓其它端點(diǎn)幫忙轉(zhuǎn)發(fā)數(shù)據(jù)。這就需要引入“路由機(jī)制”。
為了避免把“鏈路層”搞得太復(fù)雜,路由機(jī)制放到“鏈路層”之上來實(shí)現(xiàn),也就是“網(wǎng)絡(luò)層”。
基于【路由】的地址編碼方式
鏈路層已經(jīng)提供了某種全球唯一的地址編碼方式(MAC 地址)。但“MAC 地址”有如下幾個(gè)問題:
其一,它是固定的(雖然可以用技術(shù)手段去修改 MAC 地址,但很少這么干)
其二,MAC 地址的編碼是基于【廠商】,無法體現(xiàn)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。或者說,“MAC 地址”對(duì)于“路由機(jī)制”是不夠友好滴。
因此,需要引入一種更抽象(更高層)的地址,也就是“網(wǎng)絡(luò)層地址”。咱們常說的“IP 地址”,是“網(wǎng)絡(luò)層地址”的實(shí)現(xiàn)方式之一。
為了幫你理解,舉個(gè)例子:
每個(gè)人都有身份證號(hào)(這就類似于“MAC 地址”)。當(dāng)某人加入了某個(gè)公司,公司會(huì)為此人再分配一個(gè)“員工號(hào)”(這就類似于“網(wǎng)絡(luò)地址”)。既然有身份證號(hào),為啥公司還要另搞一套“員工編號(hào)”捏?因?yàn)椤皢T工編號(hào)”有額外的好處。比如說:可以把員工號(hào)劃分為不同的區(qū)間,對(duì)應(yīng)不同的部門。這樣一來,只要看到員工號(hào),就知道此人來自哪個(gè)部門。
類似道理,每個(gè)網(wǎng)卡都有自己固定的 MAC 地址,當(dāng)這個(gè)網(wǎng)卡接入到不同的網(wǎng)絡(luò),每次都可以再分配不同的“網(wǎng)絡(luò)地址”。通過“網(wǎng)絡(luò)地址”可以看出這個(gè)網(wǎng)卡屬于哪個(gè)網(wǎng)絡(luò)(對(duì)路由比較方便)。
網(wǎng)際互聯(lián)(internetwork)
引入“網(wǎng)絡(luò)層”的另一個(gè)目的是:屏蔽不同類型的網(wǎng)絡(luò)之間的差異,從而有利于【網(wǎng)際互聯(lián)】(也就是建立“網(wǎng)絡(luò)的網(wǎng)絡(luò)”)。
一般來說,要想聯(lián)通【異種】網(wǎng)絡(luò),就要求每個(gè)網(wǎng)絡(luò)中都有一臺(tái)主機(jī)充當(dāng)【網(wǎng)關(guān)】(gateway)?!揪W(wǎng)關(guān)】起到“中介/翻譯”的作用——幫不同的網(wǎng)絡(luò)翻譯協(xié)議,使得不同的網(wǎng)絡(luò)可以互相聯(lián)通。
假設(shè)【沒有】統(tǒng)一的網(wǎng)絡(luò)層,網(wǎng)關(guān)的工作就很難做。就好比說:如果全球沒有某種通用的自然語言,就需要培養(yǎng)非常多不同類型的翻譯人才(假設(shè)有30種主要語言,任意兩種互譯,就需要幾百種不同的翻譯人才)。
反之,如果有了某種統(tǒng)一的網(wǎng)絡(luò)層標(biāo)準(zhǔn),問題就好辦多了(還是假設(shè)有30種主要語言,只要選定某種作為通用語,然后培養(yǎng)29種翻譯人才,就可以實(shí)現(xiàn)任意兩種語言互譯)。
如今的互聯(lián)網(wǎng)時(shí)代,【IP 協(xié)議】就是那個(gè)充當(dāng)統(tǒng)一標(biāo)準(zhǔn)的網(wǎng)絡(luò)層協(xié)議。
◇網(wǎng)絡(luò)拓?fù)洌╪etwork topology)
網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)有很多種,有簡單的,有復(fù)雜的。一般來說,再復(fù)雜的拓?fù)?,也可以逐步分解為若干簡單拓?fù)涞慕M合。
對(duì)拓?fù)涞难芯浚袑iT一個(gè)數(shù)學(xué)分支(拓?fù)鋵W(xué))??紤]到本文只是掃盲,我不可能再去聊“拓?fù)鋵W(xué)”。因此,只挑幾種簡單的拓?fù)浣Y(jié)構(gòu),讓大伙兒有個(gè)直觀的印象。
(常見的網(wǎng)狀拓?fù)浣Y(jié)構(gòu):星形拓?fù)?、環(huán)形拓?fù)洹⒖偩€拓?fù)?、網(wǎng)狀拓?fù)涞鹊龋?/span>
如今的互聯(lián)網(wǎng),整體的拓?fù)浣Y(jié)構(gòu)超級(jí)復(fù)雜。但還是可以逐步分解為上述幾種基本的拓?fù)浣Y(jié)構(gòu)。
(互聯(lián)網(wǎng)的復(fù)雜拓?fù)?,右下角是圖中某個(gè)小點(diǎn)的放大。
為節(jié)省大伙兒的”學(xué)習(xí)”流量,我貼的是縮小圖。
◇互聯(lián)網(wǎng)的拓?fù)洹獜摹皻v史”的角度看其健壯性
從上面那張圖可以看出:互聯(lián)網(wǎng)拓?fù)涞摹揪植俊坑泻芏嗍恰靶切瓮負(fù)洹保ó?dāng)然也有其它的)。但從【宏觀】上看,更像是“網(wǎng)狀拓?fù)洹薄?br />在現(xiàn)實(shí)生活中,對(duì)于復(fù)雜結(jié)構(gòu),通常都會(huì)采用“樹狀層次結(jié)構(gòu)”,以便于管理。比如:域名系統(tǒng)、公司組織結(jié)構(gòu)、官僚系統(tǒng) …… 那為啥互聯(lián)網(wǎng)的【宏觀】拓?fù)浣Y(jié)構(gòu)是“網(wǎng)狀”捏?這就要說到互聯(lián)網(wǎng)的歷史。
在上世紀(jì)50年代(冷戰(zhàn)高峰期),漂亮國軍方的指揮系統(tǒng)高度依賴于電信公司提供的電話網(wǎng)絡(luò)。當(dāng)時(shí)的電話網(wǎng)絡(luò)大致如下——
在基層,每個(gè)地區(qū)有電話交換局,每一部電話都連入當(dāng)?shù)氐慕粨Q局。
在全國,設(shè)有若干個(gè)長途局,每個(gè)交換局都接入某個(gè)特定的長途局(不同地區(qū)的交換局通過長途局中轉(zhuǎn))。
簡而言之,當(dāng)時(shí)漂亮國的電話網(wǎng)絡(luò)是典型的【多級(jí)星形拓?fù)洹?。這種拓?fù)涞膬?yōu)點(diǎn)是:簡單、高效、便于管理;但缺點(diǎn)是:健壯性很差。從這個(gè)案例中,大伙兒可以再次體會(huì)到“效率”與“健壯性”之間的矛盾。
話說1957年的時(shí)候,蘇聯(lián)成功試射第一顆洲際彈道導(dǎo)彈(ICBM),漂亮國軍方開始擔(dān)心:一旦蘇聯(lián)先用洲際導(dǎo)彈攻擊美國,只要把少數(shù)幾個(gè)長途局轟掉,軍方的指揮系統(tǒng)就會(huì)癱瘓。也就是說,“長途局”已經(jīng)成為美國軍方的【單點(diǎn)故障】(何為“單點(diǎn)故障”?參見這篇博文)。
1960年,美國國防部找來大名鼎鼎的蘭德公司進(jìn)行咨詢,要求提供一個(gè)應(yīng)對(duì)核打擊的方案。該公司的研究員 Paul Baran 設(shè)計(jì)了一個(gè)方案,把“星形拓?fù)洹备臑椤揪W(wǎng)狀拓?fù)洹?。采用【網(wǎng)狀拓?fù)洹康暮锰幵谟冢杭词拱l(fā)生全面核大戰(zhàn),大量骨干節(jié)點(diǎn)被摧毀,整個(gè)網(wǎng)絡(luò)也不會(huì)被分隔成幾個(gè)孤島,軍方的指揮系統(tǒng)依然能正常運(yùn)作。
(左邊:互聯(lián)網(wǎng)誕生前——美國的電話網(wǎng)絡(luò) 右邊:蘭德公司的“Baran 方案”)
有了蘭德公司的方案,美國軍方找到當(dāng)時(shí)最大的電信公司 AT&T,想要實(shí)現(xiàn)這個(gè)系統(tǒng),結(jié)果被否決了。AT&T 高層認(rèn)為:搞這樣一種系統(tǒng)根本不切實(shí)際。于是 Baran 的方案中途夭折。
為啥 AT&T 反對(duì)這個(gè)方案捏?一方面,成功的大公司總是有很強(qiáng)的思維定勢(關(guān)于這點(diǎn),參見這篇文章);另一方面,Baran 的設(shè)計(jì)方案確實(shí)很超前——其前瞻性不僅包括“拓?fù)浣Y(jié)構(gòu)”,而且把當(dāng)時(shí)電信行業(yè)的幾大核心觀念完全顛覆掉了(具體如何顛覆,后續(xù)章節(jié)還會(huì)再聊)。
時(shí)間一晃又過了好多年,到了60年代末,由于一系列機(jī)緣巧合,英國佬發(fā)現(xiàn)了“Baran 方案”的價(jià)值,并據(jù)此搞了一個(gè)小型的 NPL 網(wǎng)絡(luò)(NPL 是“國家物理實(shí)驗(yàn)室”的縮寫)。然后在某次 ACM 會(huì)議上,美國佬看到英國佬的論文,才意識(shí)到:Baran 方案完全可行。經(jīng)歷了“出口轉(zhuǎn)內(nèi)銷”的命運(yùn)之后,該方案重新被美國國防部重視。之后,(國防部下屬的)“高級(jí)計(jì)劃研究局”(ARPA)開始籌建“阿帕網(wǎng)”(ARPANET),才有了如今的互聯(lián)網(wǎng)。
◇路由的大致原理
聊完“拓?fù)洹?,再來聊“路由”?br />當(dāng)主機(jī) A 向主機(jī) B 發(fā)送網(wǎng)絡(luò)層的數(shù)據(jù)時(shí),大致會(huì)經(jīng)歷如下步驟:
1.
A 主機(jī)的協(xié)議棧先判斷“A B 兩個(gè)地址”是否在同一個(gè)子網(wǎng)(“子網(wǎng)掩碼”就是用來干這事兒滴)。
如果是同一個(gè)子網(wǎng),直接發(fā)給對(duì)方;如果不是同一個(gè)子網(wǎng),發(fā)給本子網(wǎng)的【默認(rèn)網(wǎng)關(guān)】。
(此處所說的“網(wǎng)關(guān)”指“3層網(wǎng)關(guān)/網(wǎng)絡(luò)層網(wǎng)關(guān)”) 2.
對(duì)于“默認(rèn)網(wǎng)關(guān)”,有可能自己就是路由器;也可能自己不是路由器,但與其它路由器相連。
也就是說,“默認(rèn)網(wǎng)關(guān)”要么自己對(duì)數(shù)據(jù)包進(jìn)行路由,要么丟給能進(jìn)行路由的另一臺(tái)設(shè)備。
(萬一找不到能路由的設(shè)備,這個(gè)數(shù)據(jù)就被丟棄,于是網(wǎng)絡(luò)通訊出錯(cuò))
3.
當(dāng)數(shù)據(jù)到達(dá)某個(gè)路由器之后,有如下幾種可能——
3.1
該路由器正好是 B 所在子網(wǎng)的網(wǎng)關(guān)(與 B 直連),那就把數(shù)據(jù)包丟給 B,路由過程就結(jié)束啦;
3.2
亦或者,路由器會(huì)把數(shù)據(jù)包丟給另一個(gè)路由器(另一個(gè)路由器再丟給另一個(gè)路由器) …… 如此循環(huán)往復(fù),最終到達(dá)目的地 B。
3.3
還存在一種可能性:始終找不到“主機(jī) B”(有可能該主機(jī)“斷線 or 關(guān)機(jī) or 根本不存在”)。為了避免數(shù)據(jù)包長時(shí)間在網(wǎng)絡(luò)上閑逛,還需要引入某種【數(shù)據(jù)包存活機(jī)制】(洋文叫做“Time To Live”,簡稱 TTL)。
通常會(huì)采用某個(gè)整數(shù)(TTL 計(jì)數(shù))表示數(shù)據(jù)包能活多久。當(dāng)主機(jī) A 發(fā)出這個(gè)數(shù)據(jù)包的時(shí)候,這個(gè)“TTL 計(jì)數(shù)”就已經(jīng)設(shè)置好了。每當(dāng)這個(gè)數(shù)據(jù)包被路由器轉(zhuǎn)發(fā)一次,“TTL 記數(shù)”就減一。當(dāng) TTL 變?yōu)榱?,這個(gè)數(shù)據(jù)包就死了(被丟棄)。
對(duì)于某些大型的復(fù)雜網(wǎng)絡(luò)(比如互聯(lián)網(wǎng)),每個(gè)路由器可能與其它 N 個(gè)路由器相連(N 可能很大)。對(duì)于上述的 3.2 情形,它如何判斷:該轉(zhuǎn)發(fā)給誰捏?
這時(shí)候,“路由算法”就體現(xiàn)出價(jià)值啦——
一般來說,路由器內(nèi)部會(huì)維護(hù)一張【路由表】。每當(dāng)收到一個(gè)網(wǎng)絡(luò)層的數(shù)據(jù)包,先取出數(shù)據(jù)包中的【目標(biāo)地址】,然后去查這張路由表,看誰距離目標(biāo)最近,就把數(shù)據(jù)包轉(zhuǎn)發(fā)給誰。
上面這段話看起來好像很簡單,其實(shí)路由算法挺復(fù)雜滴??紤]到本文是“掃盲性質(zhì)”,而且篇幅已經(jīng)很長,不可能再去聊“路由算法”的細(xì)節(jié)。對(duì)此感興趣的同學(xué),可以去看《計(jì)算機(jī)網(wǎng)絡(luò)》的第5章。
◇路由算法的演變史(以互聯(lián)網(wǎng)為例)
(技術(shù)菜鳥可以跳過這個(gè)小節(jié))
由于互聯(lián)網(wǎng)的 IP 協(xié)議已經(jīng)成為“網(wǎng)絡(luò)層協(xié)議”的事實(shí)標(biāo)準(zhǔn),我簡單聊一下互聯(lián)網(wǎng)的路由機(jī)制是如何進(jìn)化滴。
第1階段:靜態(tài)全局路由表
(前面說了)互聯(lián)網(wǎng)的前身是“阿帕網(wǎng)/ARPANET”。在阿帕網(wǎng)誕生初期(上世紀(jì)70年代),全球的主機(jī)很少。因此,早期的路由表很簡單,既是“全局”滴,又是“靜態(tài)”滴。簡而言之,每個(gè)路由器內(nèi)部都維護(hù)一張“全局路由表”,這個(gè)“路由表”包含了全球所有其它路由器的關(guān)聯(lián)信息。每當(dāng)來了一個(gè)數(shù)據(jù)包,查一下這張全局路由表,自然就清楚要轉(zhuǎn)發(fā)給誰,才能最快到達(dá)目的地。
早期的阿帕網(wǎng),主機(jī)的變化比較少,也很少增加路由器。每當(dāng)出現(xiàn)一個(gè)新的路由器,其它路由器的管理員就手工編輯各自的“全局路由表”。
為了加深大伙兒印象,特意找來兩張70年代初的阿帕網(wǎng)拓?fù)鋱D(注:圖中的 IMP 是“Interface Message Processor”的縮寫,也就是如今所說的“路由器”)。
(1973年的阿帕網(wǎng))
(1977年的阿帕網(wǎng))
第2階段:動(dòng)態(tài)全局路由表
后來,“阿帕網(wǎng)/互聯(lián)網(wǎng)”的規(guī)模猛增,路由器數(shù)量也跟著猛增,隔三差五都有新的路由器冒出來。再用“靜態(tài)路由表”這種機(jī)制,(編輯路由表的)管理員會(huì)被活活累死。于是改用“動(dòng)態(tài)路由表”,并引入某種“路由發(fā)現(xiàn)機(jī)制”。但“路由表”依然是【全局】滴。
第3階段:動(dòng)態(tài)分級(jí)路由表
再到后來,全球的路由器越來越多,成千上萬,再搞“全局路由表”已經(jīng)不太現(xiàn)實(shí)了——
一方面,“全局路由表”越來越大(查詢的速度就越來越慢)
另一方面,由于互聯(lián)網(wǎng)的流量越來越大,每來一個(gè)數(shù)據(jù)包都要查表,查詢?cè)絹碓筋l繁。
于是,路由器開始吃不消了。為了解決困境,想出一個(gè)新招數(shù):引入“分級(jí)路由”(hierarchical routing)。所謂的“分級(jí)路由”就是:把整個(gè)互聯(lián)網(wǎng)分為多個(gè)大區(qū)域,每個(gè)大區(qū)域內(nèi)部再分小區(qū)域,小區(qū)域內(nèi)部再分小小區(qū)域 …… 看到這里,熟悉“數(shù)據(jù)結(jié)構(gòu)與算法”的同學(xué)就會(huì)意識(shí)到——這相當(dāng)于構(gòu)造了一個(gè)【樹狀】層次結(jié)構(gòu)。
有了這個(gè)層次結(jié)構(gòu),每個(gè)路由器重點(diǎn)關(guān)注:自己所在的那個(gè)最小化區(qū)域里面的網(wǎng)絡(luò)拓?fù)?。如此一來,每個(gè)路由器的“路由表”都會(huì)大幅度減小。
(全局路由表 VS 分級(jí)路由表)
◇互聯(lián)網(wǎng)的路由——從“CAS”的角度看其健壯性
如果把互聯(lián)網(wǎng)視作一個(gè)系統(tǒng),每個(gè)公網(wǎng)上的路由器都是一個(gè)自適應(yīng)的主體。假如某個(gè)地區(qū)的網(wǎng)絡(luò)流量突然暴漲,骨干網(wǎng)路由器會(huì)自動(dòng)分流;假如因?yàn)榈卣鸹騑ar,導(dǎo)致某個(gè)地區(qū)的骨干網(wǎng)路由器全部下線,周邊地區(qū)的路由器也會(huì)自動(dòng)避開這個(gè)區(qū)域 …..
所有這些工作,【不需要】依靠任何最高指揮中樞,去進(jìn)行協(xié)調(diào)。
相反,如果互聯(lián)網(wǎng)的路由系統(tǒng)中,設(shè)立了某種“Center委員會(huì)”進(jìn)行實(shí)時(shí)調(diào)度,那互聯(lián)網(wǎng)早就完蛋了,根本無法成長為今天這種規(guī)模。
◇網(wǎng)絡(luò)層的兩種交換技術(shù)——電路交換(circuit switching) VS 分組交換(packet switching)
(技術(shù)菜鳥可以跳過這個(gè)小節(jié))
前面聊“互聯(lián)網(wǎng)誕生”,說到蘭德公司的“Baran 方案”。該方案對(duì)當(dāng)時(shí)的電信系統(tǒng)提出幾大革命性的變化,其中之一就是“分組交換”技術(shù)(也稱“數(shù)據(jù)包交換”or“封包交換”)。
一般來說,網(wǎng)絡(luò)層的設(shè)計(jì)有兩種截然不同的風(fēng)格:【電路交換 VS 分組交換】。有時(shí)候也分別稱之為“有連接的網(wǎng)絡(luò)層 VS 無連接的網(wǎng)絡(luò)層”。此處所說的“連接”指的是某種“虛電路”(洋文叫做“virtual circuit”,簡稱 VC)。
要理解“虛電路”,首先要從老式的電話系統(tǒng)說起。
最早期的電話,既沒有撥號(hào)盤也沒有按鍵,全靠一張嘴。當(dāng)你拿起電話,先告訴接線員你要打給誰,接線員會(huì)用一根跳接線,插入電話交換設(shè)備的某個(gè)插孔,從而把你的電話機(jī)與對(duì)方的電話機(jī)相連。于是建立了一條兩人之間的電話通路,也就是“電路”。你可以把“接線員”想象成某種“人肉路由器” ??
(1900年法國巴黎的電話交換局,可以看到接線員在操作電話交換設(shè)備)
后來發(fā)明了“自動(dòng)電話交換機(jī)”,導(dǎo)致“接線員”全體下崗。雖然自動(dòng)化了,但原理還是一樣——當(dāng)你在電話上撥了某人的號(hào)碼,電話局的交換機(jī)會(huì)自動(dòng)選擇一條線路。只有當(dāng)這條線路建立起來,對(duì)方的電話才會(huì)響。一旦雙方開始通話,雙方之間的語音都是通過這條線路傳輸。并且這條線路是獨(dú)占的——只要通話不掛斷,這條線路就不會(huì)再分配給其他人使用。
前面提到“互聯(lián)網(wǎng)誕生的歷史”,當(dāng)時(shí)軍方推動(dòng)的“Baran 方案”被 AT&T 斷然拒絕。因?yàn)檫@個(gè)方案完全顛覆了傳統(tǒng)的電話系統(tǒng)——
顛覆之1:把“模擬信號(hào)”顛覆為“數(shù)字信號(hào)”(這點(diǎn)比較好理解,我就不解釋了)
顛覆之2:把“星形拓?fù)洹鳖嵏矠椤熬W(wǎng)狀拓?fù)洹保P(guān)于這點(diǎn),前面的小節(jié)已經(jīng)討論了)
顛覆之3:把“電路交換”顛覆為“分組交換”(這就是本小節(jié)的重點(diǎn))
為了幫大伙兒理解上述第3點(diǎn),舉個(gè)例子:
假設(shè)主機(jī) A 要向主機(jī) B 發(fā)送一大坨數(shù)據(jù)。因?yàn)閿?shù)據(jù)太多,肯定要分成好幾坨小一點(diǎn)的(分成多個(gè)數(shù)據(jù)包)。如何把這些數(shù)據(jù)包發(fā)送給對(duì)方捏?
“電路交換”的實(shí)現(xiàn)方式
在發(fā)送數(shù)據(jù)之前,要先建立連接通道(通過路由算法,找出 A & B 之間的某條通路)。這條通路就是所謂的“虛電路/VC”。一旦 VC 建立,每一個(gè)數(shù)據(jù)包都是從這條拓?fù)渎窂竭M(jìn)行路由。
“分組交換”的實(shí)現(xiàn)方式
在發(fā)送數(shù)據(jù)之前,【不需要】建立通道,讓每個(gè)數(shù)據(jù)包獨(dú)立進(jìn)行路由。這種情況下,這幾個(gè)數(shù)據(jù)包可能會(huì)走【不同的】拓?fù)渎窂?。因此,?shù)據(jù)包到達(dá)的順序與發(fā)送的順序【不一定】相同。接收方收到所有數(shù)據(jù)包之后,還要自己進(jìn)行排序。
XX百科上有一個(gè) GIF 動(dòng)畫(這個(gè)鏈接),比較直觀地演示“分組交換/封包交換”的效果。由于這個(gè)動(dòng)畫稍微有點(diǎn)大(超過 1MB),我就不貼到博文中了。
當(dāng)時(shí)的電話系統(tǒng)主要承載語音傳輸,“電路交換”顯然性能更高。那為啥 Baran 的設(shè)計(jì)要采用“分組交換”捏?我又要再次提到【效率 VS 健壯性】之間的矛盾與均衡。
對(duì)于“電路交換”,一旦建立連接,同一個(gè)連接的所有數(shù)據(jù)都走相同的路徑(會(huì)經(jīng)過完全相同的路由器)。也就是說,傳輸?shù)倪^程中,如果某個(gè)路由器掛掉了(網(wǎng)絡(luò)掉線 or 硬件當(dāng)機(jī) or 軟件崩潰)。那么,該路由器正在處理的 N 個(gè)連接全都要報(bào)廢。而“分組交換”則更加靈活——即使某個(gè)路由器掛掉了,后續(xù)的數(shù)據(jù)包會(huì)自動(dòng)轉(zhuǎn)向另外的路由器,損失很小。
“Baran 方案”之所以采用“分組交換”的設(shè)計(jì),因?yàn)槿思疫@個(gè)方案是提交給軍方用來應(yīng)對(duì)【全面核戰(zhàn)爭】滴,當(dāng)然要考慮健壯性啦。
話說這兩種交換機(jī)制,各有很多支持者,并分裂為兩大陣營,分別是:“電信陣營 VS 互聯(lián)網(wǎng)陣營”。兩大陣營的口水戰(zhàn)持續(xù)了 N 年,都無法說服對(duì)方。到了后來設(shè)計(jì) OSI 模型的時(shí)候,為了保持中立性與通用性,OSI 模型本身并沒有強(qiáng)制要求網(wǎng)絡(luò)層采用哪一種風(fēng)格。
經(jīng)過幾十年之后,咱們已經(jīng)可以看出來:“互聯(lián)網(wǎng)陣營”占據(jù)主導(dǎo)地位。如今,連電信系統(tǒng)都是架構(gòu)在互聯(lián)網(wǎng)之上。
★網(wǎng)絡(luò)層:具體實(shí)例
◇網(wǎng)絡(luò)層的【協(xié)議】
網(wǎng)絡(luò)層的協(xié)議有很多。由于“互聯(lián)網(wǎng)”已經(jīng)成為全球的事實(shí)標(biāo)準(zhǔn),因此我只列出屬于“互聯(lián)網(wǎng)協(xié)議族”的那些“網(wǎng)絡(luò)層協(xié)議”:
IP 協(xié)議(含 IPv4 & IPv6)
ICMP
IGMP
IPSec
……
(考慮到篇幅)我不可能具體細(xì)聊這些協(xié)議,只是貼出每個(gè)的XX百科鏈接,感興趣的同學(xué)自己點(diǎn)進(jìn)去看。
對(duì)上述這些協(xié)議,最重要的當(dāng)然是 IP 協(xié)議。如果你想要深入了解 IP 協(xié)議,可以參考如下這本書。關(guān)于 IP 協(xié)議的書,此書的影響力最大。這本書共3卷,通常只需看第1卷。
《TCP-IP 詳解》
◇網(wǎng)絡(luò)層的【協(xié)議實(shí)現(xiàn)】
對(duì)于電腦主機(jī)(含移動(dòng)設(shè)備),網(wǎng)絡(luò)層的協(xié)議實(shí)現(xiàn)通常包含在操作系統(tǒng)自帶的網(wǎng)絡(luò)模塊中(也就是“操作系統(tǒng)協(xié)議?!保?。具體參見如下示意圖。
另外,還有一些專門的【3層】網(wǎng)絡(luò)設(shè)備,也提供網(wǎng)絡(luò)層的功能(參見本章節(jié)的后續(xù)小節(jié))。
(OSI 模型中,不同層次的協(xié)議實(shí)現(xiàn))
◇IP 地址的格式及含義
當(dāng)年設(shè)計(jì)阿帕網(wǎng)的時(shí)候,采用了【4字節(jié)】(32比特)來表示“網(wǎng)絡(luò)層地址”(也就是 IP 地址)。
“IP 地址”的含義很重要,我有必要解釋一下:
咱們平時(shí)所說的 IP 地址,采用【點(diǎn)分十進(jìn)制】來表示。就是把地址的4個(gè)字節(jié),先翻譯為十進(jìn)制,然后每個(gè)字節(jié)用一個(gè)小數(shù)點(diǎn)分隔開(參見如下示意圖):
(4字節(jié) IP 地址:“二進(jìn)制”與“點(diǎn)分十進(jìn)制”的對(duì)照示意圖)
“IP 地址”的32比特,分為兩部分:第1部分用來標(biāo)識(shí)【子網(wǎng)】,第2部分用來標(biāo)識(shí)該子網(wǎng)中的【主機(jī)】。
這兩部分各占用多少比特,是不確定的。在這種情況下,“操作系統(tǒng)協(xié)議棧”如何知道哪些比特標(biāo)識(shí)“子網(wǎng)”,哪些比特標(biāo)識(shí)“主機(jī)”捏?奧妙在于【子網(wǎng)掩碼】。所以,大伙兒在給系統(tǒng)配置 IP 地址的時(shí)候,通常都需要再設(shè)置一個(gè)【子網(wǎng)掩碼】,就這個(gè)用途。
◇IP 地址枯竭,及其解決方法
前一個(gè)小節(jié)提到:IP地址包含【4字節(jié)】(32比特)。因此,最多只能表示【2的32次方】(42億左右)的不同地址。考慮到還有很多地址保留給特殊用途,實(shí)際可用地址遠(yuǎn)遠(yuǎn)不到42億。
到了如今,全球網(wǎng)民都已經(jīng)幾十億了,IP 地址開始枯竭。咋辦捏?為了解決這個(gè)問題,發(fā)展出若干技術(shù)手段。簡單說一下最常見的幾種手段:
IPv6
名氣最大(最多人知道)的技術(shù)手段,大概是 IPv6 了。這招想要一勞永逸地解決地址枯竭的問題,采用了16字節(jié)(128比特)來表示 IP 地址。
設(shè)計(jì) IPv6 的人自豪地宣稱:即使給地球上的每一粒沙子分配一個(gè) IPv6 地址,依然綽綽有余(確實(shí)沒有吹牛,“2的128次方”是天文數(shù)字)。
但 IPv6 的缺點(diǎn)在于,【無法】向下兼容原有的 IP 協(xié)議(原有的協(xié)議叫“IPv4”)。IPv6 的普及一直比較慢,這是主要原因。
代理服務(wù)器(proxy)
一看到代理,很多人就想到”學(xué)習(xí)”。其實(shí)它也可以用來解決“地址枯竭”的問題。
比如說,某個(gè)公司有100人,100臺(tái)電腦。如果每臺(tái)電腦都分配公網(wǎng) IP 地址,就要消耗100個(gè)公網(wǎng)地址(太浪費(fèi)啦)。
可以只申請(qǐng)一個(gè)公網(wǎng) IP,然后在內(nèi)網(wǎng)搞一個(gè)代理服務(wù)器,公網(wǎng) IP 分配給它(代理服務(wù)器有兩個(gè)網(wǎng)卡,一個(gè)接內(nèi)網(wǎng),一個(gè)接公網(wǎng))。然后在其它電腦上設(shè)置代理,指向這臺(tái)代理服務(wù)器,就都可以上外網(wǎng)啦。
(注:在本文的末尾有一個(gè) ★雜項(xiàng) 的章節(jié),會(huì)專門聊一下“代理”這個(gè)話題)
網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)
前面 proxy 那招有個(gè)缺點(diǎn):內(nèi)網(wǎng)的每臺(tái)電腦里面的每個(gè)上網(wǎng)軟件,都要單獨(dú)設(shè)置代理。實(shí)在太麻煩啦!
后來就發(fā)明了某種更牛逼的招數(shù)——網(wǎng)絡(luò)地址轉(zhuǎn)換(洋文是“Network Address Translation”,簡稱 NAT)。
用了這招,還是只要申請(qǐng)一個(gè)公網(wǎng) IP,分配給內(nèi)網(wǎng)的網(wǎng)關(guān)(網(wǎng)關(guān)有兩個(gè)網(wǎng)卡,一個(gè)接內(nèi)網(wǎng),一個(gè)接公網(wǎng))。然后在內(nèi)網(wǎng)的網(wǎng)關(guān)配置 NAT 功能,自動(dòng)就可以讓內(nèi)網(wǎng)的每臺(tái)電腦訪問外網(wǎng)。
在這篇帖子,我介紹了虛擬機(jī)的幾種“網(wǎng)卡模式”,其中有一種模式叫做【NAT 模式】,就是指這個(gè)玩意兒。
采用了 NAT 技術(shù)之后,可能會(huì)對(duì)某些應(yīng)用軟件(尤其是 P2P 類型的)造成兼容性問題,于是又發(fā)明了一些“NAT 穿透技術(shù)”(NAT traversal)。這類技術(shù)有好幾種,如果有空的話,我會(huì)單獨(dú)寫教程介紹。
其它解決方法
關(guān)于“IPv4 地址空間耗盡”,解決方法肯定不止上面這幾招。限于篇幅,就此打住。更多的討論參見XX百科的“這個(gè)鏈接”。
◇網(wǎng)絡(luò)層相關(guān)的【網(wǎng)絡(luò)設(shè)備】
路由器(router)
(前面章節(jié)聊“路由原理”的時(shí)候,已經(jīng)介紹過它;這里就不再浪費(fèi)口水啦)
3層交換機(jī)(Layer 3 switching)
“3層交換機(jī)”是在“2層交換機(jī)”的基礎(chǔ)上,增加了對(duì)網(wǎng)絡(luò)層的處理。因此,它可以做到類似路由器的效果——在幾個(gè)子網(wǎng)之間轉(zhuǎn)發(fā)數(shù)據(jù)。
與路由器的差別在于——“3層交換機(jī)”鏈接的幾個(gè)子網(wǎng)是【同種】網(wǎng)絡(luò);而路由器可以連接【異種】網(wǎng)絡(luò)。
從上面這句話看,“3層交換機(jī)”的能力顯然不如“路由器”。既然已經(jīng)有“路由器”,為啥還要發(fā)明“3層交換機(jī)”捏?這就要說到【單臂路由器】的弊端。
對(duì)于企業(yè)內(nèi)網(wǎng)的“2層交換機(jī)”,通常都支持 VLAN 功能。通俗地說:可以在交換機(jī)中劃分多個(gè)【虛擬子網(wǎng)】。其實(shí)這些子網(wǎng)的中所有的電腦,都還是接入這臺(tái)交換機(jī),只不過這些子網(wǎng)配置了不同的網(wǎng)絡(luò)地址。對(duì)于同一個(gè) VLAN 內(nèi)部的通訊,“2層交換機(jī)”自己就可以搞定(只需要用到2層協(xié)議);但對(duì)于【跨】VLAN 主機(jī)之間的通訊,“2層交換機(jī)”就沒戲啦(它沒有路由功能)。因此,就必須在它旁邊外加一個(gè)路由器,形成如下拓?fù)浣Y(jié)構(gòu)。在這個(gè)拓?fù)渲?,路由器只與單個(gè)設(shè)備(2層交換機(jī))相連,所以稱之為“單臂”。
請(qǐng)注意:如下示意圖只畫了兩臺(tái)電腦,位于兩個(gè) VLAN。實(shí)際上可能有很多個(gè) VLAN,每個(gè)里面有幾十臺(tái)電腦。于是,交換機(jī)與路由器之間的傳輸通道就會(huì)成為瓶頸——【跨】VLAN 的任意兩臺(tái)電腦通訊,數(shù)據(jù)包都要到路由器那里兜一圈。為了消除這種瓶頸,才發(fā)明了“3層交換機(jī)”——把路由功能直接集成到交換機(jī)內(nèi)部。
無線熱點(diǎn)(Wireless Access Point)
“無線熱點(diǎn)”通常用來提供無線接入,使得某個(gè)【無線】設(shè)備能接入到某個(gè)【有線】網(wǎng)絡(luò)中。一般來說,熱點(diǎn)都內(nèi)置了路由功能,那么它就是“無線路由器”,對(duì)應(yīng)到“3層”(網(wǎng)絡(luò)層)。反之,如果沒有路由功能,它就是“網(wǎng)橋”,屬于“2層”(鏈路層)。
◇網(wǎng)絡(luò)層相關(guān)的【軟件工具】
ping
這個(gè)命令,很多人應(yīng)該都知道。早在 Win9x 就有這個(gè)命令了。它使用(網(wǎng)絡(luò)層的)ICMP 協(xié)議來測試某個(gè)遠(yuǎn)程主機(jī)是否可達(dá)。
提醒一下:
如果 ping 命令顯示某個(gè) IP 地址不可達(dá),有很多種情況。比如說:
這個(gè) IP 地址對(duì)應(yīng)的主機(jī)已經(jīng)關(guān)機(jī)
這個(gè) IP 地址對(duì)應(yīng)的主機(jī)已經(jīng)斷線
這個(gè) IP 地址對(duì)應(yīng)的主機(jī)拒絕響應(yīng) ICMP 協(xié)議
從你本機(jī)到這個(gè) IP 地址之間,有某個(gè)防火墻攔截了 ICMP 協(xié)議
……
traceroute
這是一個(gè)通用的工具,用來測試路由。很早以前的 Windows 就已經(jīng)內(nèi)置了它,命令是 tracert。在 POSIX(Linux&UNIX)上通常叫 traceroute
你可以用這個(gè)命令,測試你本機(jī)與互聯(lián)網(wǎng)另一臺(tái)主機(jī)之間的路由(也就是:從你本機(jī)到對(duì)方主機(jī),要經(jīng)過哪些路由器)
★傳輸層:概述
◇傳輸層的必要性
屏蔽“有連接 or 無連接”的差異
(上一個(gè)章節(jié)提到)網(wǎng)絡(luò)層本身已經(jīng)屏蔽了【異種網(wǎng)絡(luò)】的差異(比如“以太網(wǎng)、ATM、幀中繼”之間的差異),而且網(wǎng)絡(luò)層也屏蔽了路由的細(xì)節(jié)。但網(wǎng)絡(luò)層本身還有一個(gè)差異,也就是網(wǎng)絡(luò)層的兩種交換技術(shù):電路交換(有連接) VS 分組交換(無連接)。
前面章節(jié)也提到了:上述兩種交換技術(shù)各有很多支持者,并分裂為兩大陣營。當(dāng)年設(shè)計(jì) OSI 模型的時(shí)候,為了保持中立性與通用性,并沒有強(qiáng)制規(guī)定“網(wǎng)絡(luò)層”必須采用何種交換機(jī)制。
對(duì)于開發(fā)網(wǎng)絡(luò)軟件的程序員來說,當(dāng)然不想操心“網(wǎng)絡(luò)層用的是哪一種交換機(jī)制”。因此,需要對(duì)網(wǎng)絡(luò)層的上述差異再加一個(gè)抽象層(也就是“傳輸層”)。
從“主機(jī)”到“進(jìn)程”
前面介紹的“網(wǎng)絡(luò)層”,其設(shè)計(jì)是面向主機(jī)(電腦)?!熬W(wǎng)絡(luò)層地址”也就是某個(gè)主機(jī)的地址。
而“傳輸層”是面向【進(jìn)程】滴!因?yàn)閭鬏攲右峁┙o【網(wǎng)絡(luò)軟件】使用,而網(wǎng)絡(luò)軟件打交道的對(duì)象是【另一個(gè)網(wǎng)絡(luò)軟件】。因此,傳輸層必須在“網(wǎng)絡(luò)層地址”的基礎(chǔ)上,再引入某種新的標(biāo)識(shí),用來區(qū)分同一臺(tái)主機(jī)上的不同【進(jìn)程】。
◇傳輸層的特殊性
在 OSI 7層模型中,傳輸層正好居中。這是一個(gè)很特殊的位置。
OSI 模型最下面3層,與【網(wǎng)絡(luò)設(shè)備】比較密切。這里面所說的“網(wǎng)絡(luò)設(shè)備”,既包括那些獨(dú)立的主機(jī)(比如“路由器、交換機(jī)、等”),也包括電腦上的硬件(比如“網(wǎng)卡”)。
OSI 模型最上面3層,與【網(wǎng)絡(luò)軟件】比較密切(或者說,與“用戶的業(yè)務(wù)邏輯”比較密切)。
而中間的傳輸層,正好是承上啟下。對(duì)于開發(fā)應(yīng)用軟件的程序猿/程序媛,“傳輸層”是他們能感知的最低一層。
◇傳輸層的【端口】
剛才談“傳輸層的必要性”,提到說——“網(wǎng)絡(luò)層地址”只能標(biāo)識(shí)【主機(jī)】,而傳輸層必須要能標(biāo)識(shí)【進(jìn)程】。為了達(dá)到這個(gè)目的,于是就引入了“傳輸層端口”這個(gè)概念(為了打字省力,后續(xù)討論簡稱為“端口”)。
在 OSI 模型中,“端口”的官方稱呼是“傳輸服務(wù)訪問點(diǎn)”(洋文縮寫 TSAP)。但是作為程序員,我已經(jīng)習(xí)慣于“端口”這個(gè)稱呼。后續(xù)介紹依然用“端口”一詞。
當(dāng)程序員使用傳輸層提供的 API 開發(fā)網(wǎng)絡(luò)軟件時(shí),通常把“端口”與“網(wǎng)絡(luò)地址”一起使用(構(gòu)成“二元組”),就可以定位到某個(gè)主機(jī)上的某個(gè)進(jìn)程。
★傳輸層:具體實(shí)例
◇傳輸層的【協(xié)議】
為了讓程序員可以更爽地使用傳輸層來開發(fā)網(wǎng)絡(luò)軟件,傳輸層既要提供“有連接”的風(fēng)格,也要提供“無連接”的風(fēng)格。關(guān)于這兩種風(fēng)格的對(duì)比,前面已經(jīng)聊過,這里不再浪費(fèi)口水。
具體到“互聯(lián)網(wǎng)協(xié)議族”,有兩個(gè)主要的傳輸層實(shí)現(xiàn),分別是 TCP & UDP(前者是“有連接”,后者是“無連接”)。
除了 TCP & UDP,“互聯(lián)網(wǎng)協(xié)議族”還提供了其它一些傳輸層協(xié)議。因?yàn)楸容^冷門,我就不介紹啦。
◇傳輸層的【協(xié)議實(shí)現(xiàn)】
對(duì)于電腦主機(jī)(含移動(dòng)設(shè)備),傳輸層的協(xié)議實(shí)現(xiàn)通常包含在操作系統(tǒng)自帶的網(wǎng)絡(luò)模塊中(也就是“操作系統(tǒng)協(xié)議?!保>唧w參見如下示意圖。
另外,還有一些專門的【4層】網(wǎng)絡(luò)設(shè)備,也提供傳輸層的功能(參見后續(xù)的小節(jié))。
(OSI 模型中,不同層次的協(xié)議實(shí)現(xiàn))
◇套接字(socket API)
前面說了:傳輸層是面向程序員(讓他們可以更方便地開發(fā)網(wǎng)絡(luò)軟件)。因此,就需要提供一些封裝傳輸層的【庫】(API)。程序員只需要調(diào)用這些【庫】,就可以使用傳輸層的協(xié)議進(jìn)行通訊啦。
影響力最大的傳輸層封裝庫,當(dāng)然是 socket API。它來自加州大學(xué)伯克利分校。
在互聯(lián)網(wǎng)誕生初期,伯克利分校開發(fā)了一個(gè) UNIX 操作系統(tǒng)的的變種,叫做“伯克利 UNIX 發(fā)行版”(BSD Unix),也就是如今 BSD 操作系統(tǒng)的前身。伯克利發(fā)行版內(nèi)置了一套用來進(jìn)行網(wǎng)絡(luò)編程的 API,當(dāng)時(shí)叫做“伯克利套接字”(Berkeley sockets)。由于這套 API 用起來很方便,很多其它的 UNIX 變種也移植了這套 API,于是就逐漸成了業(yè)界的事實(shí)標(biāo)準(zhǔn)。到了上世紀(jì)90年代,Windows & Linux 也都提供了這套 API。
由于大部分讀者不是程序員,“套接字”這個(gè)話題就到此為止。如果你是個(gè)程序員,并且對(duì)網(wǎng)絡(luò)編程感興趣,可以參考我的電子書清單,其中有一個(gè)分類目錄是【IT 類 / 軟件開發(fā) / 網(wǎng)絡(luò)相關(guān)】。
◇傳輸層相關(guān)的【網(wǎng)絡(luò)設(shè)備】
4層交換機(jī)(Layer 4 switching)
前面已經(jīng)介紹了“3層交換機(jī)”,“4層交換機(jī)”是其進(jìn)一步的改良,可以識(shí)別傳輸層的協(xié)議,獲取 TCP or UDP 的端口號(hào)。
有了這個(gè)能力,網(wǎng)管就可以在這種交換機(jī)上配置一些管理策略。比如說:(根據(jù)傳輸層端口號(hào))過濾掉某種流量,或者對(duì)某種流量設(shè)置轉(zhuǎn)發(fā)的優(yōu)先級(jí)。
狀態(tài)防火墻(stateful firewall)
網(wǎng)絡(luò)防火墻分好幾種,大部分屬于這種。它能完全處理 TCP 協(xié)議的狀態(tài),顯然它屬于“4層”(傳輸層)。
◇傳輸層相關(guān)的【軟件工具】
netcat 家族——傳輸層的“瑞士軍刀”
很多與 TCP/UDP 相關(guān)的事情,都可以用 netcat 搞定。另外,netcat 還有很多衍生品(衍生的開源項(xiàng)目),構(gòu)成一個(gè)豐富的 netcat 家族。在上述教程也有介紹。
netstat & ss
Windows 和 POSIX(Linux&UNIX)都有一個(gè) netstat 命令,可以查看當(dāng)前系統(tǒng)的 TCP/UDP 狀態(tài)(包括當(dāng)前系統(tǒng)開啟了哪些監(jiān)聽端口)。
另外,Linux 上還有一個(gè) ss 命令,功能更強(qiáng)(但這個(gè)命令在 Windows 上默認(rèn)沒有)
nmap
這是最著名的開源的掃描器,可以掃描遠(yuǎn)程主機(jī)監(jiān)聽了哪些傳輸層端口(注:前面提到的“netcat 家族”也可以干這事兒)
nmap 的功能很強(qiáng),“端口掃描”只是其功能之一。
★業(yè)務(wù)層(OSI 上三層):概述
一不小心,這篇教程已經(jīng)寫了這么長。為了照顧那些有“閱讀障礙”的讀者,我要稍微控制一下篇幅,就把 OSI 的【上三層】合在一起討論。
前面的章節(jié)說過:【上三層】更接近于“網(wǎng)絡(luò)軟件”,對(duì)應(yīng)的是應(yīng)用軟件的業(yè)務(wù)邏輯,因此我統(tǒng)稱為“業(yè)務(wù)層”。
注:有些書(比如《計(jì)算機(jī)網(wǎng)絡(luò)》)會(huì)把 OSI 的上三層統(tǒng)稱為“應(yīng)用層”。由于 OSI 模型中本來就有一個(gè)“應(yīng)用層”,我認(rèn)為這樣容易搞混(尤其不利于技術(shù)菜鳥),所以另外起了一個(gè)“業(yè)務(wù)層”的名稱。
◇業(yè)務(wù)層的必要性
業(yè)務(wù)層顯然是必要滴。因?yàn)閭鬏攲游挥诓僮飨到y(tǒng),它不可能去了解網(wǎng)絡(luò)軟件的業(yè)務(wù)邏輯。為了讓網(wǎng)絡(luò)軟件能夠相互通訊,肯定要在傳輸層之上再定義更高層的協(xié)議。
問題在于:網(wǎng)絡(luò)軟件千奇百怪,其業(yè)務(wù)邏輯各不相同,因此,“業(yè)務(wù)層如何設(shè)計(jì)”,【無】一定之規(guī)。有些軟件只用一個(gè)協(xié)議來搞定所有的業(yè)務(wù)邏輯(只有一層);有些軟件會(huì)參考 OSI,把業(yè)務(wù)邏輯的協(xié)議分為三層;還有些軟件可能會(huì)分出更多的層次。
再強(qiáng)調(diào)一下:業(yè)務(wù)層的協(xié)議如何分層,完全看具體的業(yè)務(wù)邏輯,不要生搬硬套任何現(xiàn)有的參考模型。
◇會(huì)話層 & 表示層 & 應(yīng)用層
對(duì)于大部分讀者來說,【沒必要】花時(shí)間去了解 OSI 最上面三層之間的區(qū)別。你只需把最上面三層視作【一坨】——他們都是與網(wǎng)絡(luò)軟件的業(yè)務(wù)邏輯密切相關(guān)滴。
那么,哪些人需要詳細(xì)了解“這三層的差異”捏?
如果你是個(gè)程序員,并且你正好是開發(fā)【網(wǎng)絡(luò)】軟件,我建議你了解一下 OSI 模型的最上面三層,有助于你更深刻地思考某些網(wǎng)絡(luò)協(xié)議的設(shè)計(jì)。所謂的“更深刻”指的是:你不能光停留在 WHAT 層面,要提升到 HOW 甚至 WHY 層面(參見《學(xué)習(xí)技術(shù)的三部曲:WHAT、HOW、WHY》)
★業(yè)務(wù)層(OSI 上三層):具體實(shí)例
◇業(yè)務(wù)層的【協(xié)議】
業(yè)務(wù)層的協(xié)議非常多。即使光把各種協(xié)議的名稱列出來,也很費(fèi)勁。所以我就偷懶一下,只點(diǎn)評(píng)幾個(gè)特別重要的協(xié)議。
HTTP 協(xié)議
如果讓我評(píng)選最重要的業(yè)務(wù)層協(xié)議,我首推 HTTP 協(xié)議?;ヂ?lián)網(wǎng)的普及推動(dòng)了 Web 的普及,而 Web 的普及使得 HTTP 成為信息時(shí)代的重要支柱。當(dāng)你上網(wǎng)的時(shí)候,你看到的網(wǎng)頁(HTML 頁面)就是通過 HTTP 協(xié)議傳輸?shù)侥愕臑g覽器上。
如今 HTTP 已經(jīng)不僅僅用來展示網(wǎng)頁,還有很多業(yè)務(wù)層的協(xié)議是建立在 HTTP 協(xié)議之上。比如說:如果你用 RSS 訂閱我的WebSite,RSS 閱讀器需要調(diào)用 blogspot 博客平臺(tái)提供的 RSS 接口,這些 RSS 接口就是基于 HTTP 協(xié)議傳輸?shù)巍?br />考慮到本文的篇幅,我不可能在這里細(xì)聊 HTTP 協(xié)議的規(guī)格,有興趣的同學(xué)可以去看《HTTP 權(quán)威指南》這本書。
SSL/TLS 協(xié)議
最早的 HTTP 協(xié)議是【明文】滴;為了強(qiáng)化安全性,后來又設(shè)計(jì)了 SSL 協(xié)議,用來【加密】HTTP 流量;再后來,SSL 升級(jí)為 TLS(這倆是同義詞)。如今經(jīng)??吹降?HTTPS 相當(dāng)于“HTTP over TLS”。
SSL/TLS 設(shè)計(jì)得比較優(yōu)雅(很靈活),使得其它業(yè)務(wù)層的協(xié)議可以很方便地架構(gòu)在 SSL/TLS 之上。這樣的好處是:其它協(xié)議就不用自己再設(shè)計(jì)一套加密機(jī)制&認(rèn)證機(jī)制。
SSL/TLS 對(duì)于安全性很重要,因此我專門寫了一個(gè)系列教程(如下),詳細(xì)介紹該協(xié)議的技術(shù)細(xì)節(jié)。
《掃盲 HTTPS 和 SSL/TLS 協(xié)議》(系列)
域名相關(guān)的協(xié)議(DNS 及其它)
域名相關(guān)的協(xié)議,也很重要。因?yàn)橛蛎到y(tǒng)是整個(gè)互聯(lián)網(wǎng)的基礎(chǔ)設(shè)施。最早的域名查詢協(xié)議是“DNS 協(xié)議”,由于這個(gè)協(xié)議【沒有】加密,導(dǎo)致了一些安全隱患。比如 GFW 就利用 DNS 的這個(gè)弱點(diǎn),搞“域名污染/域名投毒”。因此,后來又設(shè)計(jì)了一系列新的域名協(xié)議,引入了加密的機(jī)制。
關(guān)于這些協(xié)議的掃盲教程,可以參考如下幾篇博文:
《掃盲 DNS 原理,兼談“域名劫持”和“域名欺騙/域名污染”》
《對(duì)比4種強(qiáng)化域名安全的協(xié)議——DNSSEC,DNSCrypt,DNS over TLS,DNS over HTTPS》
◇業(yè)務(wù)層相關(guān)的【網(wǎng)絡(luò)設(shè)備】
應(yīng)用層防火墻(application firewall)
前面提到了:大多數(shù)網(wǎng)絡(luò)防火墻處于4層(狀態(tài)防火墻),另外還有少數(shù)處于7層,也就是“應(yīng)用層防火墻”(有時(shí)候也稱之為“7層防火墻”)。
一般來說,這類防火墻具備了【深度包檢測】(deep packet inspection,簡稱 DPI)的能力,可以分析應(yīng)用層協(xié)議的【內(nèi)容】。
簡單說一下“深度包檢測”:
如果某個(gè)網(wǎng)絡(luò)設(shè)備,僅僅分析“應(yīng)用層協(xié)議”本身,它還【不夠格】稱之為 DPI。為了做到 DPI,還要能理解應(yīng)用層協(xié)議所承載的【內(nèi)容】。
比如說:某人通過【明文】的 HTTP 協(xié)議從網(wǎng)上下載了一個(gè) zip 壓縮包。對(duì)于這個(gè)下載行為,那些做得好的 DPI 設(shè)備不光能識(shí)別出“HTTP 協(xié)議的內(nèi)容是 ZIP 壓縮包”,而且還能從 ZIP 壓縮包中提取出里面的文件。
入侵檢測(intrusion detection system)
一般來說,“入侵檢測”如果不加定語,通常指“【網(wǎng)絡(luò)】入侵檢測”(洋文叫 NIDS);另外還有一種“【主機(jī)】入侵檢測”(洋文叫 HIDS)。HIDS 與本文無關(guān)。
“入侵檢測”是一種網(wǎng)絡(luò)安全設(shè)備,它通過嗅探(sniffer)的方式抓取網(wǎng)上的數(shù)據(jù)包,然后進(jìn)行分析,嘗試發(fā)現(xiàn)網(wǎng)絡(luò)中是否存在黑客/駭客的入侵的行為。故名“入侵檢測”。
由于 IDS 需要理解【應(yīng)用層】(7層)的內(nèi)容,因此它與“應(yīng)用層防火墻”有個(gè)共同點(diǎn),需要具備某種程度的 DPI(深度包檢測)能力。它倆的一大差異是【部署方式】。
考慮到很多讀者是 IT 外行,簡單說一下“旁路部署”——
如果你學(xué)過中學(xué)物理,應(yīng)該知道電路有“串聯(lián) & 并聯(lián)”。所謂的“旁路部署”類似于電路中的【并聯(lián)】。通俗地說:IDS 是【并聯(lián)】部署,防火墻是【串聯(lián)】部署。
GFW(Great Firewall)
由于“Great Firewall”中有“Firewall”字樣,很多【誤以為】GFW 是防火墻,其實(shí)不然!GFW 本質(zhì)上就是 IDS——其部署方式類似于 IDS(旁路部署),其工作方式有很大一部分也類似于 IDS(當(dāng)然啦,GFW 的功能比 IDS 更多)。
★雜項(xiàng)
有些概念,并不屬于某個(gè)特定的層次,單獨(dú)放到這個(gè)章節(jié)。
◇VPN(virtual private network)
同學(xué)們使用 VPN,一多半是為了學(xué)習(xí)。其實(shí) VPN 的本意(如其名稱所示)是為了提供某種虛擬化的私有的網(wǎng)絡(luò),讓身處異地的多個(gè)人,可以用 VPN 構(gòu)建出一個(gè)虛擬的內(nèi)網(wǎng),從而能在這個(gè)內(nèi)網(wǎng)中協(xié)同工作。
VPN 的類型很多,使用的技術(shù)也各不相同,因此 VPN 對(duì)應(yīng)的 OSI 層次很寬(“1層”到“6層”)。我到XX百科剽竊了如下這張圖,讓你見識(shí)一下 VPN 的多樣性。
(名目繁多的 VPN,分類示意圖)
◇代理(proxy)
那些經(jīng)?!睂W(xué)習(xí)”的同學(xué),對(duì)“代理”應(yīng)該都很熟悉了?!按怼迸c VPN 類似,一開始并不是用來學(xué)習(xí)滴,“學(xué)習(xí)”只是這倆的副業(yè)。
代理服務(wù)器(proxy server)
“代理服務(wù)器”部署在“客戶端 & 服務(wù)端”之間,起到某種“中介”的作用?!按矸?wù)器”的類型有很多,干的事情各不相同。
(“代理服務(wù)器”的簡單示意圖)
代理客戶端(proxy client)
早期的代理服務(wù)器,【不】需要“代理客戶端”。因?yàn)樵缙诘摹按矸?wù)器”支持的是【標(biāo)準(zhǔn)協(xié)議】。比如“HTTP proxy server”支持的是標(biāo)準(zhǔn) HTTP協(xié)議,而用戶的電腦上,已經(jīng)有瀏覽器(原生支持 HTTP 協(xié)議)。這種情況下,自然不需要再有“代理客戶端”。
后來,為了滿足某些特殊需求(比如”學(xué)習(xí)”),“代理服務(wù)器”必須使用某種特殊的(非標(biāo)準(zhǔn)的)協(xié)議。因此,就必須在用戶的環(huán)境中安裝“代理客戶端”。對(duì)于學(xué)習(xí)來說,你裝的學(xué)習(xí)軟件,相當(dāng)于“代理客戶端”。
代理的層次
“代理”也分不同的層次。比較常見的有如下幾種:
TCP 代理(TCP 端口轉(zhuǎn)發(fā))——4層(傳輸層)
SOCKS 代理——5層(會(huì)話層)
HTTP 代理——7層(應(yīng)用層)
……
◇網(wǎng)關(guān)(gateway)
前面的某些章節(jié),已經(jīng)稍微提及了“網(wǎng)關(guān)”這個(gè)概念,但還沒有具體介紹它。
嚴(yán)格來講,“網(wǎng)關(guān)”是一個(gè)邏輯概念,【不要】把它當(dāng)成具體的網(wǎng)絡(luò)設(shè)備。充當(dāng)“網(wǎng)關(guān)”的東東,可能是:路由器 or XX層交換機(jī) or XX層防火墻 or 代理服務(wù)器 ……
“網(wǎng)關(guān)”也分不同的層次。如果不加定語,通常指的是“3層網(wǎng)關(guān)”(網(wǎng)絡(luò)層網(wǎng)關(guān))。列幾種比較常見的,供參考:
路由器充當(dāng)網(wǎng)關(guān)——3層(網(wǎng)絡(luò)層)
3層交換機(jī)充當(dāng)網(wǎng)關(guān)——3層(網(wǎng)絡(luò)層)
4層交換機(jī)充當(dāng)網(wǎng)關(guān)——4層(傳輸層)
應(yīng)用層防火墻充當(dāng)網(wǎng)關(guān)——7層(應(yīng)用層)
代理服務(wù)器充當(dāng)網(wǎng)關(guān)——(取決于代理的層次,參見前一個(gè)小節(jié))
……
◇隧道協(xié)議(tunneling protocol)
所謂的“隧道協(xié)議”,通俗地說就是:用某種協(xié)議包裹另一種協(xié)議,以滿足某些特殊的需求。
看到這里,估計(jì)某些同學(xué)會(huì)感到納悶——因?yàn)槲以诒疚拈_頭介紹“協(xié)議?!钡臅r(shí)候提到說:相鄰的兩層協(xié)議,下層會(huì)包裹上層?!八淼绤f(xié)議的包裹”與“上下層協(xié)議的包裹”,差別在哪捏?
我來解釋一下:
“隧道協(xié)議”可以做到更靈活的包裹——既可以對(duì)層次相隔很遠(yuǎn)的協(xié)議進(jìn)行包裹,也可以對(duì)同一層的協(xié)議進(jìn)行包裹,甚至可以“倒掛”——所謂的“倒掛”就是讓【上】層反過來包裹【下】層。
舉例:
《如何讓【不支持】代理的網(wǎng)絡(luò)軟件,通過代理進(jìn)行聯(lián)網(wǎng)(不同平臺(tái)的 N 種方法)》,其中介紹了“HTTP 代理”的兩種模式:“轉(zhuǎn)發(fā)模式 & 隧道模式”。對(duì)于“HTTP 代理”的隧道模式,可以實(shí)現(xiàn)【TCP over HTTP】(把 TCP 協(xié)議打包到 HTTP 協(xié)議內(nèi)部),這就是剛才所說的“倒掛”。
另外,VPN 小節(jié)的那張圖中,有些類型的 VPN 就是用“隧道協(xié)議”的機(jī)制實(shí)現(xiàn)。
如果你覺得有些【網(wǎng)絡(luò)相關(guān)】的概念,不太明白,歡迎留言,進(jìn)行反饋。我會(huì)根據(jù)大伙兒的反饋,再對(duì)這篇教程進(jìn)行補(bǔ)充。

如若轉(zhuǎn)載,請(qǐng)注明出處:http://www.qjsdgw.cn/5656.html
