談到互聯(lián)網(wǎng),很多人腦海中會出現(xiàn)各種各樣的術語和服務,但是互聯(lián)網(wǎng)是如何設計并構建的呢?作為一個網(wǎng)絡,互聯(lián)網(wǎng)的架構本質(zhì)是什么? 石頭兄弟和我曾經(jīng)一起譯過一本《計算機網(wǎng)絡問題與解決方案》的巨著,但真正仔細閱讀并從中有所收獲的朋友并不多。最近,石頭兄弟推薦了另一篇文章https://cacm.acm.org/magazines/2023/2/268956-extracting-the-essential-simplicity-of-the-internet/fulltext ,內(nèi)容精煉簡潔,不敢私藏,編譯分享給大家。
如今,互聯(lián)網(wǎng)提供了人們所依賴的無處不在的連接。許多人也都知道,互聯(lián)網(wǎng)的基本設計是在20世紀70年代發(fā)明的,以允許計算機交換數(shù)據(jù)。自1983年陸續(xù)采用以來,它基本上保持不變 ,同時優(yōu)雅地適應應用程序,技術,規(guī)模,范圍和容量的根本變化,成為了人們不可或缺的一部分。
作為如此出色的IT基礎設施,其系統(tǒng)架構也是怎樣的呢?
1. 本質(zhì)需求:互聯(lián)網(wǎng)的服務模型
在進行通信時,所有主機上的軟件都必須依賴基礎設施的服務模型。因此,服務模型的設計需要在最適合主機軟件的內(nèi)容和基礎設施可以支持的內(nèi)容之間進行折衷。在設計數(shù)據(jù)傳輸服務模型時,必須選擇其傳輸單元并確保性能。鑒于計算機通信的突發(fā)性,一個小的傳輸單元是必要的,以實現(xiàn)有效的資源利用?;ヂ?lián)網(wǎng)使用一組比特的數(shù)據(jù)包,當前的數(shù)據(jù)包大小通常不超過1.5 kb。
互聯(lián)網(wǎng)應用程序有著各種各樣的網(wǎng)絡性能要求,從低延遲(交互式視頻或閉環(huán)控制)到高帶寬(傳輸大數(shù)據(jù)集)和可靠傳輸(文件傳輸)。工程化的本能是支持將這些需求與網(wǎng)絡基礎設施結合起來,以保證延遲、帶寬和可靠性方面的特定界限。然而,互聯(lián)網(wǎng)必須與各種各樣的本地分組網(wǎng)絡互聯(lián),例如無線和有線、共享接入以及點對點,其中許多網(wǎng)絡不能保證性能。這些網(wǎng)絡能夠支持的最小公分母是“盡最大努力”的數(shù)據(jù)包傳輸,網(wǎng)絡試圖傳輸所有的數(shù)據(jù)包,但是不能保證數(shù)據(jù)包是否、什么時候或以什么速率傳輸。
因此,關于服務模式的根本問題是,是更好的技術和支持所有應用需求或容納所有的數(shù)據(jù)分組網(wǎng)絡,只提供一個適度的最小公分母和“盡力而為”的服務模式?;ヂ?lián)網(wǎng)的設計選擇了質(zhì)樸的方式,即采用盡力而為的服務模式。
現(xiàn)在看來,這是一個更好的選擇。首先,較松散的服務模式對基礎設施施加了最低限度的要求,從而使互聯(lián)網(wǎng)得以極其迅速地發(fā)展。簡而言之,由于對性能的要求不高,互聯(lián)網(wǎng)的部署速度和范圍都很大。其次,應用程序有嚴格的網(wǎng)絡要求是電話網(wǎng)絡的延續(xù),電話網(wǎng)絡的智能終端系統(tǒng)與智能網(wǎng)絡相連,完全負責滿足電話的嚴格性能要求,即固定速率傳輸和可靠傳輸。隨著越來越強大的計算機作為終端,通過對互聯(lián)網(wǎng)應用程序的設計來適應不同級別的性能,從而放松了它們的需求。在大多數(shù)情況下,網(wǎng)絡運營商還可以通過提供足夠的帶寬來確保合理的性能,也就是說,通過部署更多和更快的鏈路,使網(wǎng)絡很少擁塞。
2. 體系抽象:互聯(lián)網(wǎng)的架構
體系結構是關于功能的組織,而不是它的實現(xiàn)。模塊化是體系結構的指導原則,要求將系統(tǒng)的目標分解為具有干凈接口的更小的任務。互聯(lián)網(wǎng)的目標是允許兩臺不同計算機上的應用程序進行通信,因此可以分解為兩個組成部分:
(i)網(wǎng)絡基礎設施的作用(主機之間盡最大努力傳輸數(shù)據(jù)包)
(ii)主機上的網(wǎng)絡支持軟件的作用(使應用程序更容易使用這種盡力而為的傳輸)。
2.1 網(wǎng)絡基礎設施
基礎設施實現(xiàn)的主機到主機交付任務可以分解為三個不同的任務,這些任務被分層設計,高層具有更廣泛的空間范圍,低層處理更多的本地任務。因此,從發(fā)送主機向接收主機發(fā)送數(shù)據(jù)包的過程涉及到將這些本地發(fā)送任務集合在一起。提供最佳數(shù)據(jù)包傳輸?shù)谋镜睾偷图壍娜蝿帐峭ㄟ^鏈路或廣播進行傳輸,這需要數(shù)模轉(zhuǎn)換和糾錯,這兩者都不是互聯(lián)網(wǎng)所特有的。這個本地傳遞任務由所謂的物理層(L1)處理。
鑒于 L1能夠通過鏈路發(fā)送比特流,下一個任務是在本地分組網(wǎng)絡中實現(xiàn)通信(如以太網(wǎng)或無線網(wǎng)絡)。這包括兩個步驟:
(i)用一組比特位組成數(shù)據(jù)包,前面有一個數(shù)據(jù)包頭,描述這些位應該傳送到哪里;
(ii)將這些數(shù)據(jù)包傳送到本地網(wǎng)絡中的適當目的地。將第二步限制為本地(而非全局)傳輸,可以使用不可伸縮的技術,如廣播(介質(zhì)本身確保廣播數(shù)據(jù)包到達所有主機(如無線))和洪泛(網(wǎng)絡確保洪泛數(shù)據(jù)包到達所有主機)。這個任務是由傳統(tǒng)上稱為鏈路層或 L2來處理的。在非廣播網(wǎng)絡中,這項任務是由本地網(wǎng)絡中的交換機實現(xiàn)的,這些交換機將數(shù)據(jù)包轉(zhuǎn)發(fā)到它們的目的地。
最后一項任務是將數(shù)據(jù)包從發(fā)送方的網(wǎng)絡傳送到目的地的網(wǎng)絡,利用 L2的能力將這些網(wǎng)絡中的數(shù)據(jù)包傳送到各個主機。這種網(wǎng)絡的互連由網(wǎng)絡互連層(L3)處理,并由在 L2連接到兩個或多個網(wǎng)絡的路由器實現(xiàn)。數(shù)據(jù)包通過一系列的路由器進行轉(zhuǎn)發(fā)(路由器到路由器的交付由兩個路由器所連接的網(wǎng)絡中的 L2支持) ,直到它們到達目的網(wǎng)絡。這一層連接網(wǎng)絡還定義了 互聯(lián)網(wǎng)的服務模型,即 L3將數(shù)據(jù)傳送到更高層的主機軟件。
因此,互聯(lián)網(wǎng)提供的無處不在的連接能力始于一個概念上簡單而大膽的設計。
2.2 主機軟件中的網(wǎng)絡支持
網(wǎng)絡基礎設施中主機對主機服務模型沒有指定數(shù)據(jù)包應該傳遞到哪個主機的應用程序,而且如果沒有額外的幫助,應用程序很難達到最佳性能。為了糾正這些問題,主機操作系統(tǒng)除了提供其他網(wǎng)絡支持外,還提供了傳輸層(L4)?;诜Q為“端口”的數(shù)據(jù)包頭中的元數(shù)據(jù),L4將數(shù)據(jù)包傳遞給主機上的各個應用程序為了使應用程序更容易使用盡力而為的服務,一些公共傳輸協(xié)議提供了三種功能。
- 字節(jié)流 API,應用程序可以使用類似文件的簡單接口來寫入和讀取數(shù)據(jù),而不必顯式地發(fā)送和接收單個數(shù)據(jù)包。
- 控制主機的數(shù)據(jù)包傳輸速率,以防止網(wǎng)絡過載,這種方法被稱為擁塞控制傳輸,涉及控制回路,在這個回路中,如果傳輸協(xié)議檢測到網(wǎng)絡擁塞(例如,通過丟失數(shù)據(jù)包或增加延遲) ,它們的發(fā)送速率就會降低。有許多擁塞控制算法,不同的是它們?nèi)绾螜z測和響應擁塞。
- 最基本的是可靠的數(shù)據(jù)包傳輸,應用程序不需要處理數(shù)據(jù)包丟失。這種丟失是最佳服務模型的自然組成部分,但是對于許多應用程序來說是不可接受的。盡管可靠性可以在應用程序本身或其他支持庫中實現(xiàn),但為了清晰起見,這種可靠性是在 L4中實現(xiàn)的。
四層互聯(lián)網(wǎng)架構是模塊化的自然結果。每一層只與正上方和正下方的層相互作用。由于數(shù)據(jù)包總是通過 L1的物理媒體到達,所以主機必須實現(xiàn)所有四個層; 路由器實現(xiàn)前三個層,而交換機只實現(xiàn)前兩個層。因此,這里有四個問題需要解答。
問題 # 1: 這種分層架構支持哪種多樣性,如何管理它?
只要一個層的兩個實現(xiàn)提供相同的向上和向下接口,它們在架構上是可互換的。此外,互聯(lián)網(wǎng)架構的模塊化允許在 L4處共存多個傳輸協(xié)議,在 L2處共存多個本地網(wǎng)絡設計,在 L1處共存多個物理技術,每個都提供自己獨特的接口。L1和 L2技術由網(wǎng)絡提供商選擇,網(wǎng)絡提供商可以確保它們的接口兼容,也就是說,本地網(wǎng)絡設計可以使用一組鏈路技術。應用程序在調(diào)用操作系統(tǒng)的網(wǎng)絡 API 時選擇它所需的 L4協(xié)議。應用程序和網(wǎng)絡提供商獨立作出選擇,也就是說,應用程序不知道它目前所在的網(wǎng)絡,網(wǎng)絡提供商也不知道其網(wǎng)絡上將使用哪些應用程序。當且僅當 L3上有一組所有 L2設計和 L4協(xié)議都兼容的接口時,這種方法才能無縫地工作。因此,我們必須在 L3有一個單一的協(xié)議,即互聯(lián)網(wǎng)協(xié)議(IP) ,目前是 IPv4及IPv6。IP 作為互聯(lián)網(wǎng)架構的“蜂腰”,其獨特性使所有其他層次的多元化創(chuàng)新成為可能。
問題 # 2: Internet 使用什么標識符?
互聯(lián)網(wǎng)必須使 L2和 L3數(shù)據(jù)包頭能夠識別路由的目的地,并允許用戶和應用程序識別他們想要訪問的服務。這導致了三種地址,通常,主機上每個可連接的硬件網(wǎng)絡接口(如 Wi-Fi、蜂窩網(wǎng)卡或以太網(wǎng)卡)都有一個稱為 MAC 地址的永久唯一地址,L2使用該地址來識別目的地。L3使用 IP 地址,它指定互聯(lián)網(wǎng)中的一個唯一網(wǎng)絡,以及當前使用該網(wǎng)絡中的地址的特定主機接口(這種地址分配可以隨時間變化)。用戶和應用程序使用應用程序級別的名稱來引用基于主機的服務。為了使這些名稱具有某種程度的持久性,它們獨立于服務所基于的機器以及這些主機可能放置在網(wǎng)絡中的位置。在這三個標識符(應用程序級別的名稱、 IP 地址和 MAC 地址)中,前兩個必須解析為次低級別的標識符。因此,當一臺主機上的應用程序試圖向另一臺主機上的應用程序發(fā)送數(shù)據(jù)包時,它必須將應用程序級別的名稱解析為 IP 地址。當數(shù)據(jù)包到達網(wǎng)絡時,它通過 L2發(fā)送到目的地主機或下一跳的路由器。在這兩種情況下,IP 地址都必須解析為 MAC 地址。
問題3: 如何組織互聯(lián)網(wǎng)基礎設施?
互聯(lián)網(wǎng)不僅僅是一個由路由器連接的非結構化的 L2網(wǎng)絡集合。相反,它是自治系統(tǒng)(AS)的集合,也稱為域,每個域包含一組由單個實體管理的 L2網(wǎng)絡。AS的例子包括企業(yè)、大學和商業(yè)互聯(lián)網(wǎng)服務提供商(ISP)。這些系統(tǒng)控制它們自己的內(nèi)部 L3路由,并且必須與其他系統(tǒng)建立路由協(xié)議,以便在系統(tǒng)之間提供主機到主機的傳輸。因此,L3涉及兩個路由任務:
(i)在 AS 內(nèi)的網(wǎng)絡之間進行路由(域內(nèi)路由) ,由該 AS 中的路由器處理;
(ii)在 AS 之間進行路由(域間路由) ,由連接兩個或更多個 AS 的所謂邊界路由器處理。
這兩個路由任務有不同的需求,因此需要不同的路由范例和協(xié)議。
問題4: 這些部分是如何組合在一起的?
通過互聯(lián)網(wǎng)傳送數(shù)據(jù)包的過程始于應用程序?qū)贸绦蚣墑e的名稱解析為一個 IP 地址,然后調(diào)用主機的網(wǎng)絡支持將數(shù)據(jù)發(fā)送到該目標 IP 地址。這將導致對 L4的調(diào)用,該調(diào)用將數(shù)據(jù)打包并調(diào)用 L3來傳遞這些數(shù)據(jù)包。在 L3,數(shù)據(jù)包通過一系列路由器被轉(zhuǎn)發(fā),直到它到達它的目的網(wǎng)絡(由數(shù)據(jù)包報頭中的目的 IP 地址標識)。每個路由器都有一個轉(zhuǎn)發(fā)表,它將目標 IP 地址映射到下一跳路由器的 IP 地址。在接收到數(shù)據(jù)包后,路由器在轉(zhuǎn)發(fā)表中查找合適的下一跳路由器,然后通過調(diào)用 L2將數(shù)據(jù)包發(fā)送到該下一跳節(jié)點。L2必須首先將下一跳路由器的 IP 地址解析為一個 MAC 地址,然后將數(shù)據(jù)包傳送到下一跳路由器(通過廣播或通過一系列交換機轉(zhuǎn)發(fā)數(shù)據(jù)包,如下一節(jié)所述) ,然后由下一跳路由器將數(shù)據(jù)包返回給 L3。這個過程中的關鍵技術挑戰(zhàn)是設置 L3轉(zhuǎn)發(fā)表,以便下一跳的集合總是導致數(shù)據(jù)包到達適當?shù)哪康牡亍?/p>
3. 互聯(lián)網(wǎng)的三個核心機制
互聯(lián)網(wǎng)架構確定了實現(xiàn)互聯(lián)網(wǎng)體系結構所必需的三個重要機制ーー路由、可靠性和名稱解析方案。
3.1 路由
術語“路由”是指通過互聯(lián)網(wǎng)將數(shù)據(jù)包轉(zhuǎn)發(fā)到目的地主機的一般問題,這種問題發(fā)生在 L3并由路由器實現(xiàn),或者在 L2由交換機實現(xiàn),而L2上的實現(xiàn)稱為交換而不是路由。從考慮 L3域內(nèi)路由開始,假設:
- 每個 L3包頭包含一個目的 IP 地址,
- 每個路由器有一組相鄰的路由器,它在 L2連接
- 每個路由器有一個轉(zhuǎn)發(fā)表,正確地指示路由器是否連接(在 L2)到數(shù)據(jù)包的目的地網(wǎng)絡,如果沒有,確定性地將到達數(shù)據(jù)包的目的地映射到數(shù)據(jù)包應該轉(zhuǎn)發(fā)到的相鄰下一跳路由器。
簡化問題,重點先放在一組靜態(tài)轉(zhuǎn)發(fā)表成功引導數(shù)據(jù)包到達其目的地的情況。路由器之間的互連集稱為網(wǎng)絡拓撲圖,假設它們是連接的; 將轉(zhuǎn)發(fā)表集稱為轉(zhuǎn)發(fā)狀態(tài); 將這些表的并集稱為路由狀態(tài)。給定的路由狀態(tài)實例是有效的,如果它總是將數(shù)據(jù)包指向它們的目的地; 如果存在一個環(huán)(即,一個起始位置和一個目的地址) ,數(shù)據(jù)包可以返回到它已經(jīng)訪問過的路由器。因此,當且僅當沒有環(huán)時,路由狀態(tài)實例才有效。
假設沒有循環(huán); 因為網(wǎng)絡是連接的和有限的,所以任何數(shù)據(jù)包最終都必須到達連接(在 L2)到其目的地的路由器。假設存在一個給定目的地的循環(huán); 任何尋址到該目的地的包進入循環(huán)將永遠不會到達目的地。
為什么要關心這個明顯的結果?因為互聯(lián)網(wǎng)使用各種路由算法來計算轉(zhuǎn)發(fā)狀態(tài),這些路由算法之間的關鍵概念差異在于它們在穩(wěn)態(tài)下避免循環(huán)的方式。路由協(xié)議是一種復雜的分布式系統(tǒng),它解決了由于網(wǎng)絡鏈路失效和恢復而導致網(wǎng)絡拓撲圖發(fā)生變化時,如何快速自動地重新計算轉(zhuǎn)發(fā)狀態(tài)的問題。這里,避免了這些分布式協(xié)議的復雜性,只關注算法在靜態(tài)網(wǎng)絡上收斂到一個穩(wěn)定狀態(tài)時所產(chǎn)生的轉(zhuǎn)發(fā)狀態(tài)。在這些算法中,避免穩(wěn)態(tài)循環(huán)的方法主要取決于路由器之間共享什么樣的信息。
例如,一個路由器知道它的鄰近路由器,并且可以使用洪泛算法與其他路由器共享這個本地信息。在穩(wěn)定狀態(tài)下,每個路由器都可以利用這些信息來組裝整個網(wǎng)絡拓撲圖。如果所有路由器在這個共享網(wǎng)絡拓撲圖上使用相同的無環(huán)路徑查找算法來計算它們的轉(zhuǎn)發(fā)表,那么得到的路由狀態(tài)總是有效的。這種方法稱為“鏈路狀態(tài)”路由。
許多計算機科學界人士認為,互聯(lián)網(wǎng)僅僅是一個復雜協(xié)議的集合,而不是一個概念上簡單而大膽的設計。
另一種情況是,每個路由器根據(jù)一些度量(如延遲)通知它的鄰近路由器它自己的距離所有其他網(wǎng)絡。路由器 α 可以計算其到每個目的地網(wǎng)絡 n 的距離為 dα (n) = minβ [ dβ (n) + d (α,β)] ,其中 dβ (n)是從每個相鄰路由器 β 到網(wǎng)絡 n 的距離,d (α,β)是兩個路由器之間的距離 α,β。這種分布式計算的穩(wěn)定狀態(tài)產(chǎn)生到每個目的地的最短路徑路由,這不能有環(huán)。這就是所謂的“距離矢量”路由。
當網(wǎng)絡拓撲圖發(fā)生變化時,在距離向量路由和鏈路狀態(tài)路由的重新計算路由過程中(即協(xié)議尚未收斂到穩(wěn)定狀態(tài)時)都可能出現(xiàn)路由狀態(tài)的臨時環(huán)路。如果不加以檢查,數(shù)據(jù)包在這樣的循環(huán)中無休止地循環(huán)可能會導致嚴重的擁塞控制。為了防止這種情況,IP 協(xié)議明智地在數(shù)據(jù)包頭中加入了一個字段,該字段從發(fā)送主機設置的初始數(shù)字開始,然后每當數(shù)據(jù)包到達一個新的路由器時,該數(shù)字就遞減。如果該字段達到零,則丟棄數(shù)據(jù)包,從而限制數(shù)據(jù)包可以穿越臨時環(huán)路的次數(shù),從而確保臨時環(huán)路不會發(fā)生災難性的情況。如果沒有這種簡單的機制,所有的路由協(xié)議都需要排除臨時環(huán)路,這種程度的關注可能會使路由協(xié)議復雜化。
考慮 L3域間路由。AS顯然必須攜帶它們作為源或目的地的所有數(shù)據(jù)包; 所有其他數(shù)據(jù)包都被視為傳輸通信,在從源 AS 到目的 AS 的路上通過其他 AS。AS 希望能夠自由選擇他們所攜帶的傳輸流量,以及他們用來將傳輸流量轉(zhuǎn)移到目的地的路線。對于互聯(lián)網(wǎng)服務提供商來說,這兩種策略選擇在很大程度上取決于它們與鄰近的自主網(wǎng)絡服務提供商的經(jīng)濟性考量,因此它們希望將這些選擇保密,以避免泄露有助于競爭對手的信息。
雖然域間路由選擇實際上是由邊界路由器實現(xiàn)的,這涉及到它們之間一些復雜的域內(nèi)協(xié)調(diào),但是可以簡單地建立域間路由模型,將互連的 AS 集合形成一個圖,并由 AS 自己做出路由決策。域間路由必須:
- 允許 AS 做出任意的策略選擇,所以不能使用距離向量
- 保持這些策略選擇的私有性,所以不能使用鏈路狀態(tài)路由
這將需要 AS 使他們的策略明確,以便每個其他 AS 可以計算使用這些策略的路由。另一種方法是允許AS系統(tǒng)通過選擇向誰宣傳他們的路由(通過向鄰近的AS系統(tǒng)發(fā)送消息說,“你可以使用我的路徑到達這個目的地”) ,以及當幾個鄰居已經(jīng)向他們發(fā)送到給定目的地的路由時,選擇這些路由來實現(xiàn)他們的策略。這些都是在距離向量路由中使用的相同消息和選擇,但距離向量不允許策略靈活性: 路由向所有鄰居公布,只選擇最短路徑。這種局部自由提供了政策靈活性和隱私,但是如何防止在計算路由時出現(xiàn)穩(wěn)態(tài)環(huán)路?互聯(lián)網(wǎng)的解決方案是交換路徑信息。當 AS“ A”公布到相鄰 AS“ B”的路徑(針對特定目的地)時,它指定該流量到目的地的整個 AS 級路徑。如果 AS“ B”看到它已經(jīng)在那條路徑上,它就不會使用那條路徑。如果所有的 AS都遵守這個明顯的約束,那么無論 AS做出什么策略選擇,我們稱之為“路徑向量”路由的穩(wěn)定狀態(tài)都將是無環(huán)的。路徑向量路由在目前的域間路由協(xié)議 BGP 中使用,因此,BGP 是將互聯(lián)網(wǎng)上的許多自動化系統(tǒng)粘合在一起的粘合劑。
由于對性能要求不高,互聯(lián)網(wǎng)的部署速度和范圍都很大。
這種路徑矢量方法確保在任何穩(wěn)態(tài)下都沒有回路。然而,這并不能確保路由協(xié)議收斂到一個穩(wěn)定狀態(tài), 例如,策略振蕩就是路徑向量算法不收斂的情況。它也不能確保所有產(chǎn)生的穩(wěn)定狀態(tài)提供所有端點之間的連接,因為所有 AS 都可以拒絕向給定 AS 提供過境連接。令人感到困惑的是,為什么這些異常沒有在互聯(lián)網(wǎng)上觀察到,理論分析表明,典型的運營實踐(路由選擇最大化收入和最小化成本)產(chǎn)生路由策略,將總是收斂到穩(wěn)定的狀態(tài),提供端到端連接之間的所有端點。
在非廣播網(wǎng)絡中,避免環(huán)路也起到了一定的作用,在非廣播網(wǎng)絡中,洪泛通常用于到達目的地。生成樹協(xié)議(spanning-tree protocol,STP)通過選擇不使用某些鏈接在網(wǎng)絡之外來創(chuàng)建一棵樹,也就是說,從網(wǎng)絡拓撲圖中消除所有環(huán)。一旦網(wǎng)絡成為生成樹,就可以通過讓每個交換機在生成樹的所有相鄰鏈路上轉(zhuǎn)發(fā)數(shù)據(jù)包(數(shù)據(jù)包到達的鏈路除外) ,將數(shù)據(jù)包洪泛給所有主機。這種洪泛允許主機和路由器通過一個“地址解析協(xié)議”(ARP)消息來解析 IP 地址到 MAC 地址,該消息詢問,“哪個主機或路由器有這個 IP 地址?”; 所有者然后響應其 MAC 地址。在這個 ARP 交換期間(實際上每當主機發(fā)送數(shù)據(jù)包時) ,交換機可以通過記住它們最近從該主機收到數(shù)據(jù)包的鏈路來學習如何在不發(fā)生洪泛的情況下到達特定主機。生成樹上的任意兩個節(jié)點之間只有一條路徑,因此可以通過發(fā)送來自該主機的數(shù)據(jù)包到達的鏈路來到達該主機。因此,使用這樣的“學習式交換機”,將 IP 地址解析為 MAC 地址的行為確定了發(fā)送和接收主機之間的轉(zhuǎn)發(fā)狀態(tài)。當向 MAC 地址已經(jīng)解析的主機發(fā)送數(shù)據(jù)包時,網(wǎng)絡不需要使用洪泛,而是可以直接發(fā)送數(shù)據(jù)包。
總而言之,所有的路由算法都必須有一種機制來避免處于穩(wěn)定狀態(tài)(即協(xié)議收斂之后)的環(huán)路形成,而穩(wěn)定狀態(tài)又依賴于交換的信息。為了限制 AS 中與相鄰路由器之間的信息交換,需要使用距離向量來保證無環(huán),從而產(chǎn)生最短路徑。為了提高域內(nèi)路由的路由靈活性,一個更好的選擇是鏈路狀態(tài),它需要洪泛的鄰居信息,但允許使用任意的無環(huán)路徑計算。為了允許 AS 在域間路由中實施單獨的策略控制,它們可以交換顯式的路徑信息以避免環(huán)路。為了在 L2中實現(xiàn)動態(tài)洪泛和路由學習,有必要將網(wǎng)絡拓撲圖轉(zhuǎn)換為生成樹,因為它們本身是無環(huán)的。在路由中可能會考慮其他問題,例如,如何從失敗中恢復而不必重新計算路由,以及如何使用集中控制來簡化路由協(xié)議(如 SDN) ,但是這里的重點是闡明在常用的路由范例中避免環(huán)路的作用。
3.2 可靠傳輸
在討論的路由分析時,即使有效的路由狀態(tài),由于過載鏈路或故障路由器仍然會導致數(shù)據(jù)包的丟棄?;ヂ?lián)網(wǎng)架構并不能保證前三層的可靠性,而是明智地將這個任務留給傳輸層或應用程序本身,丟失的數(shù)據(jù)包只有在被發(fā)送主機重新傳輸時才會被傳輸。
可靠的傳輸是由傳輸協(xié)議確保的,該協(xié)議建立了從一個應用程序獲取數(shù)據(jù)并將其傳輸?shù)竭h程應用程序的連接。一些重要的傳輸協(xié)議,例如廣泛使用的 TCP,提供了一個可靠的字節(jié)流抽象,其中字節(jié)流中的數(shù)據(jù)被分成數(shù)據(jù)包并按順序傳輸,所有數(shù)據(jù)包丟失由傳輸協(xié)議本身來恢復??煽康淖止?jié)流抽象可以完全由主機軟件實現(xiàn),可以區(qū)分一個字節(jié)流中的數(shù)據(jù)包和另一個字節(jié)流中的數(shù)據(jù)包,在數(shù)據(jù)包上有序號,這樣它們就可以在任何數(shù)據(jù)傳遞到接收應用程序之前被正確地重新排序,并且重新傳輸數(shù)據(jù)包直到它們成功地傳遞。
非正式情況下,可靠的傳輸協(xié)議從應用程序獲取數(shù)據(jù),以數(shù)據(jù)包的形式將其傳輸?shù)侥康牡?,最終通知應用程序傳輸已成功完成或失敗終止,在這兩種情況下都停止進一步的傳輸。假設底層網(wǎng)絡最終傳遞一個重復發(fā)送的數(shù)據(jù)包,因此持久協(xié)議總是能夠成功。對于這種情況,在發(fā)送方和接收方之間需要什么通信來確保協(xié)議可以通知應用程序它已經(jīng)成功了,當且僅當所有數(shù)據(jù)包已經(jīng)被接收么?有兩種常見的方法: 接收方可以在接收到數(shù)據(jù)包時向發(fā)送方發(fā)送確認(ACK) ,或者在懷疑數(shù)據(jù)包丟失時向發(fā)送方發(fā)送非確認(NACK)。
ACK 對于可靠的傳輸是必要的和充分的,而 NACK 既不是必要的也不是充分的。一個可靠的傳輸協(xié)議只有當它知道所有的數(shù)據(jù)包都已經(jīng)發(fā)送完畢時才能宣布成功,這只能通過每個數(shù)據(jù)包接收到一個 ACK 來推測。沒有 NACK (它本身可以被刪除)并不意味著已經(jīng)接收到了數(shù)據(jù)包。但是,NACK 可能很有用,因為它們可以提供關于發(fā)送方應該何時重新傳輸?shù)募皶r信息。例如,TCP 使用顯式 ACK 來提高可靠性,并根據(jù)超時和隱式 NACK (當預期的 ACK 未到達時)發(fā)起重新傳輸。
3.3 名稱解析
除了通過 ARP 將 IP 地址解析為 MAC 地址之外,互聯(lián)網(wǎng)還必須將應用級別的名稱解析為一個或多個 IP 地址。這些名稱非正式地稱為主機名,正式的名稱被稱為完備的域名??梢允褂梅菢藴市g語應用程序級別的名稱,既不指特定的物理機器(而 MAC 地址指的是) ,也不直接關系到域間路由中使用的域概念。
任何應用程序級的命名系統(tǒng)必須:
- 將每個名稱的管理控制分配給一個獨特的權限,該權限決定該名稱將解析到哪個 IP 地址;
- 處理高解析請求;
- 以數(shù)十億應用程序級名稱的規(guī)模提供這兩個屬性。
為了應對這些挑戰(zhàn),互聯(lián)網(wǎng)采用了一種稱為域名系統(tǒng)(DNS)的分層命名結構。命名空間被劃分為稱為域的區(qū)域,這些區(qū)域被遞歸地細分為較小的域,并且解析和管理控制都是分層完成的。每個命名域都有一個或多個命名服務器,可以在其域內(nèi)創(chuàng)建新的子域并解析名稱。名稱可以完備的解析為一個或多個 IP 地址),也可以將解析指向一個或多個可以進一步解析此類名稱的子域名服務器。此層次結構從一組頂級域(TLD)開始,商業(yè)注冊允許客戶在這些 TLD 下注冊子域。TLD 到其名稱服務器的解析由一組 DNS 根服務器(其地址為所有主機所知)處理,解析從那里沿著命名層次結構進行。例如, www.myschool.edu 首先由根服務器解析,該根服務器指向edu域名服務器,再指向 myschool. edu 的一個名稱服務器,然后將 www.myschool.edu 解析為一個 IP 地址。這種層次結構允許高度并行的名稱解析和完全分布式管理控制,這兩者對于處理 互聯(lián)網(wǎng)命名的規(guī)模至關重要。
4. 互聯(lián)網(wǎng)成功的秘密
本文試圖將互聯(lián)網(wǎng)難以理解的復雜性降低為一小組設計選擇:
- 服務模型
- 四層架構
- 三個關鍵機制(路由,可靠性和分辨率)
理解這些決定背后的原因不足以理解當今互聯(lián)網(wǎng)的復雜性,但足以設計一個具有大致相同屬性的新互聯(lián)網(wǎng)。不幸的是,這種簡單性并不足以解釋互聯(lián)網(wǎng)的長壽,為什么互聯(lián)網(wǎng)的設計在處理速度、規(guī)模、范圍、技術和使用方面的巨大變化方面如此成功呢?
4.1 質(zhì)樸
互聯(lián)網(wǎng)沒有設法滿足所有可能的應用要求,而是采用了一種非常有限但非常普遍的服務模式,這種模式?jīng)]有任何保障。于是再對智能設備和非智能網(wǎng)絡上:
- 允許新的應用程序蓬勃發(fā)展,因為互聯(lián)網(wǎng)沒有被定制到任何具體的應用需求;
- 利用主機的能力,以各種方式適應變化無常的最佳互聯(lián)網(wǎng)服務(例如,通過速率適應,緩沖和重傳) ;
- 能夠快速提高網(wǎng)絡速度,服務模式是相對簡單的。
如果因特網(wǎng)采用了一種更為復雜的服務模式,它可能會將自己局限于創(chuàng)建時存在的應用程序要求,可以用當時可用的技術實現(xiàn)。這將導致一種針對少數(shù)應用程序的復雜設計和迅速過時的技術,這是短期成功但長期失敗的根源。
4.2 模塊化
四層互聯(lián)網(wǎng)架構的模塊化導致了清晰的責任劃分: 網(wǎng)絡基礎設施(L1/L2/L3)支持更好的數(shù)據(jù)包傳遞(在容量、覆蓋范圍和彈性方面) ,而應用程序(由 L4協(xié)助)為用戶創(chuàng)建基于這種數(shù)據(jù)包傳遞服務模型的新功能。因此,這種架構使得兩種截然不同的生態(tài)系統(tǒng),即網(wǎng)絡基礎設施和互聯(lián)網(wǎng)應用得以獨立地繁榮發(fā)展。
然而,互聯(lián)網(wǎng)的模塊化超越了其正式的體系結構,在其標準驅(qū)動的基礎設施范圍內(nèi),最大限度地實現(xiàn)了自治的更一般方法,這與電話網(wǎng)絡更嚴格的一致性形成了鮮明的對比。例如,對 AS 的唯一要求是其路由器支持 IP 并參與域間路由協(xié)議 BGP。否則,每個系統(tǒng)都可以部署任何 L1和 L2技術以及任何域內(nèi)路由協(xié)議,而無需與其他系統(tǒng)協(xié)調(diào)。類似地,各個命名域必須支持 DNS 協(xié)議,否則可以采用它們選擇的任何名稱管理策略和名稱解析基礎結構。這種基礎結構的自主性允許出現(xiàn)不同的操作實踐。例如,一個大學校園網(wǎng)絡、一個超大規(guī)模的數(shù)據(jù)中心網(wǎng)絡和一個 ISP 骨干網(wǎng)絡有著非常不同的運營需求; 互聯(lián)網(wǎng)固有的自主性使得它們能夠以自己的方式滿足自己的需求,并且隨著時間的推移不斷發(fā)展。
4.3 失敗是常見情形
隨著系統(tǒng)規(guī)模的擴大,在任何時候,系統(tǒng)的某些組件發(fā)生故障的可能性越來越大。因此,通常會認為按照算法復雜性或狀態(tài)爆炸來擴展,而有效地處理故障也是一個關鍵的可擴展性要求。與期望正常運行并進入特殊模式以從故障中恢復的系統(tǒng)不同,幾乎所有的互聯(lián)網(wǎng)機制都將故障視為常見事件。
例如,在基本的路由算法中,無論是由于鏈路故障還是由于環(huán)路的重新計算,路由的計算都以相同的方式進行。類似地,當一個數(shù)據(jù)包丟失時,它必須被重新傳輸,但是這種重新傳輸預計會頻繁發(fā)生,而且在傳輸協(xié)議中并不是特殊情況。這種將失敗視為常見案例的設計風格,是谷歌等構建超大規(guī)模基礎設施的基礎,這種風格最初是在互聯(lián)網(wǎng)上開創(chuàng)的。
4.4 粗略共識和可運行代碼
互聯(lián)網(wǎng)發(fā)明者沒有采用當時電信世界中流行的正式設計委員會,而是明確地選擇了另一條道路: 鼓勵較小的團體構建可行的設計,然后由一個社區(qū)選擇采用哪種設計。大衛(wèi) · 克拉克是互聯(lián)網(wǎng)架構的領袖之一,他在一次演講中說: “我們拒絕國王、總統(tǒng)和投票。我們相信粗略的共識和可運行的代碼。”這種平等主義精神延伸到互聯(lián)網(wǎng)作為連接所有用戶的統(tǒng)一交流平臺的共同愿景。因此,互聯(lián)網(wǎng)的發(fā)展不僅受到純技術決策的影響,而且受到早期互聯(lián)網(wǎng)社區(qū)對連接世界的共同平臺價值以及他們對實現(xiàn)這一愿景的共同所有權的信念影響。
5. 沒有完美
有許多領域的互聯(lián)網(wǎng)的設計是次優(yōu)解,但其中大多數(shù)是低層次的細節(jié),不會改變高層次的表示?;ヂ?lián)網(wǎng)設計中有三個領域存在著更多的基本問題。
5.1 安全性
許多人將互聯(lián)網(wǎng)安全的糟糕狀況歸咎于安全性,認為安全性并不是其設計的首要考慮因素,盡管面對失敗時的處理能力確實是一個重要的考慮因素。這種批評是錯誤的,原因有兩個:
(1)在一個相互聯(lián)系的世界中,安全性是一個比網(wǎng)絡安全更復雜和難以捉摸的目標,而互聯(lián)網(wǎng)只能確保后者;
(2)雖然互聯(lián)網(wǎng)架構本身并不提供網(wǎng)絡安全,但有一些協(xié)議和技術,其中一些正在廣泛使用,可以在很大程度上實現(xiàn)了這些安全性。
更準確地說,如果能確保下列屬性是傳輸兩個主機之間的數(shù)據(jù):,那么就可以說網(wǎng)絡是安全的:
- 主機之間的連接是合理可靠的(可用性) ;
- 接收方可以告訴知道數(shù)據(jù)的來源;
- 數(shù)據(jù)在傳輸中沒有被篡改完整性) ;
- 數(shù)據(jù)沒有被任何中間人讀取,沒有人窺探一個鏈接并清楚哪個主機正在交換數(shù)據(jù)包(隱私)。
后三種一般可以通過加密協(xié)議來保證?;ヂ?lián)網(wǎng)的可用性容易受到分布式拒絕服務(DDoS)攻擊,其中許多主機被當作了機器人使目標的流量過載。有一些技術可以過濾掉這種攻擊性流量,但它們只是部分有效??捎眯赃€受到 BGP 易受攻擊的威脅,因為 AS的路由存在漏洞; 加密解決方案是可用的,但它們沒有得到廣泛部署。因此,有一些加密協(xié)議和緩解方法可以使因特網(wǎng)在很大程度上滿足安全網(wǎng)絡的定義。
然而,未能使互聯(lián)網(wǎng)成為一個固有的安全網(wǎng)絡絕對不是當前安全問題的主要原因,安全網(wǎng)絡不能防止主機軟件的不安全性。例如,如果一個應用程序被設計為泄露其用戶的信息,或者冒充其用戶執(zhí)行不必要的金融交易,那么網(wǎng)絡幾乎無法阻止這種惡意行為。如果用戶無意中下載了惡意應用程序,或者某些攻擊(如緩沖區(qū)溢出)將一個良性應用程序變成了惡意應用程序,那么主機就可能被感染。關于互聯(lián)網(wǎng)安全性的指責通常指的是在主機上放置惡意軟件的容易性,但這主要不是一個網(wǎng)絡安全問題。
5.2 網(wǎng)絡內(nèi)分組處理
早期的互聯(lián)網(wǎng)設計者認為,網(wǎng)絡基礎設施應該通常集中于數(shù)據(jù)包傳輸,避免更高層次的功能,但是目前幾乎每個運營的網(wǎng)絡都違反了所謂的網(wǎng)絡內(nèi)數(shù)據(jù)包處理的規(guī)則?,F(xiàn)代網(wǎng)絡有許多中間地帶,它們提供了不只是傳輸?shù)墓δ?,例如防火?控制哪些數(shù)據(jù)包可以進入網(wǎng)絡)、廣域網(wǎng)優(yōu)化(通過緩存以前的數(shù)據(jù)來提高網(wǎng)絡效率)和負載均衡(將請求導向負載不足的主機)。
2012年的一項調(diào)查顯示,大約三分之一的網(wǎng)絡組件是中間件,三分之一是路由器,三分之一是交換機。其中一些網(wǎng)內(nèi)處理功能部署在單個企業(yè)內(nèi)部,以提高其內(nèi)部效率; 這種行為只在企業(yè)網(wǎng)內(nèi)產(chǎn)生影響,因此被廣泛視為一種可接受的現(xiàn)實。此外,正如下面所討論的,一些云和內(nèi)容提供商已經(jīng)部署了大型專用網(wǎng)絡,部署網(wǎng)內(nèi)功能(特別是斷流、緩存和負載均衡) ,降低了延遲,提高客戶可見的可靠性。
5.3 缺乏進化能力
由于每個路由器都實現(xiàn)了 IP 協(xié)議,因此很難改變互聯(lián)網(wǎng)的服務模式。最近由于 IPv4地址短缺而加速過渡到 IPv6的過程,也保留了相同的服務模式。幾十年來,互聯(lián)網(wǎng)一直沒有重大的架構變化,沒有可行的方案替代互聯(lián)網(wǎng)。然而,中央控制的數(shù)據(jù)中心部署的大型專用網(wǎng)絡通過其網(wǎng)內(nèi)處理為客戶提供優(yōu)越的服務,今天的大多數(shù)客戶端流量要么通過本地控制中心緩存其原始 AS 服務,要么直接使用從源 AS 到具有其專用網(wǎng)內(nèi)處理中心的大型專用網(wǎng)絡。中央控制中心的大型專用網(wǎng)絡與云和內(nèi)容服務垂直整合,這些服務是現(xiàn)在比 ISP 更占主導地位的經(jīng)濟力量。
因此,已經(jīng)開始看到了一個新的全球基礎設施的過渡,這些私有網(wǎng)絡已經(jīng)取代了當前互聯(lián)網(wǎng)的幾乎所有流量的最后一公里,這將標志著互聯(lián)網(wǎng)經(jīng)濟時代的結束,當時它沒有真正的競爭對手,雖然互聯(lián)網(wǎng)面臨著許多挑戰(zhàn),但是,對于互聯(lián)網(wǎng)的未來,沒有一個挑戰(zhàn)比解決兩種愿景的分歧更為重要: 一種愿景是使早期互聯(lián)網(wǎng)社區(qū)活躍起來的,即一個統(tǒng)一的互聯(lián)網(wǎng)將所有用戶連接起來,基本上與端點提供的服務脫節(jié); 另一種愿景是以新興的大型私有網(wǎng)絡為代表,在這種網(wǎng)絡中使用網(wǎng)內(nèi)處理提供了更好的性能。
6. 一句話小結
互聯(lián)網(wǎng)是一個工程奇跡,體現(xiàn)了非常大膽且有預見的設計決策。不要讓互聯(lián)網(wǎng)的復雜性掩蓋了其核心設計的簡單性和所取得的成就,不要忘記導致互聯(lián)網(wǎng)誕生的勇氣、社區(qū)精神和高瞻遠矚,這或許是互聯(lián)網(wǎng)更有價值的一個方面。