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