談談我對網絡分層協議的理解
網絡協議分層的知識幾乎是所有技術公司面試的題目。大多數求職者在面試前死記硬背所有的分層,面試的時候對答如流,面試后全還給面試者了。面試者也很滿意,因為他也知道,在實際的項目中,大家都不會用到這些鬼東西了。并且他也不一定比面試者背誦的內容懂得更多。
我并不是對面試者“死記硬背”網絡協議分層概念吹毛求疵,這多多少少是大學計算機教育的悲哀。 業界本來“計算機科學”的素養就不夠,再沒有“軟件工程”的基本能力,只能淪為沒有創造力的外包工人。對網絡協議分層知識的考察如果不涉及各個層次涉及的設備,就只能退化為記憶力的競賽,更沒有體現“網絡”本身的味道和精神。
何為協議?仔細理解理解一下PDU,幀,分組,數據段和消息的區別,然后擴展一些網絡兩端解包封包的內容,明白各協議是如何在網絡的兩端對各層添加/去除包頭/包尾的,更要深刻理解數據是如何從一端的協議棧逐層下沉,在對端的協議棧逐層上升。
如何理解分層?從沖突域和廣播域開始,明白集線器,交換器,路由器,網關的區別,擴展一些以太網共享介質,CSMA/CD機制和路由的知識,對比聯想一下村口的廣播,烽火臺,郵遞員和網絡實現的關系。
其實,網絡通信的本質有兩點。第一,消息能夠送達;第二,消息能夠被解析。第一點有廣播和路由來保證,第二點有協議簇來保證。
傳統共享式以太網的典型代表是總線型以太網。在這種類型的以太網中,通信信道只有一個,采用介質共享(介質爭用)的訪問方法(CSMA/CD介質訪問方法)。每個站點在發送數據之前首先要偵聽網絡是否空閑,如果空閑就發送數據。否則,繼續偵聽直到網絡空閑。如果兩個站點同時檢測到介質空閑并同時發送出一幀數據,則會導致數據幀的沖突,雙方的數據幀均被破壞。這時,兩個站點將采用"二進制指數退避"的方法各自等待一段隨機的時間再偵聽、發送。這就相當于大家在一個房間內同時高聲說話(說話即廣播),當誰也聽不清楚了,就按照算法詢問一下,有人說沒?沒人說了再說。通俗的說,基于CSMA/CD介質訪問方法推論,只要基于廣播的方式發送信息而會發生沖突的范圍,都是沖突域。中繼器和集線器都只是對網絡通信距離的延展,處于同一個沖突域和廣播域之中。也就是說,中繼器和集線器既不能隔離沖突域,也不能隔離廣播域。
如果面試者被問及網絡協議分層能夠從沖突域,廣播域出發,再引申出四層功能來,那么就可以直接錄用了。
網橋可以隔離沖突域,但不能隔離廣播域。網橋又稱為橋接器。和中繼器類似,傳統的網橋只有兩個端口,用于連接不同的網段。和中繼器不同的是,網橋具有一定的"智能"性,可以"學習"網絡上主機的地址,同時具有信號過濾的功能。網橋可以識別橋接網絡的數據流,主機對主機的通信則不會轉發到另一個網段,而廣播類型的數據包則會被網橋轉發。這里要把CSMA/CD介質訪問方法的廣播原理和網絡通信的廣播類型(二層廣播即單播和三層廣播)區別看待。
交換機被稱為交換式集線器。它的出現是為了解決連接在集線器上的所有主機共享可用帶寬的缺陷。交換機是通過為需要通信的兩臺主機直接建立專用的通信信道來增加可用帶寬的。從這個角度上來講,交換機相當于多端口網橋。那么交換機的沖突域就是交換機的一個接口,接口和接口之間則不是一個沖突域。在一個接口上如果連接了集線器,集線器上所有的主機都在一個沖突域中。但是,交換機同樣沒有過濾廣播通信的功能。如果交換機收到一個廣播數據包后,它會向其所有的端口轉發此廣播數據包。因此,交換機和其所有接口所連接的主機共同構成了一個廣播域。我們將使用交換機作為互連設備的局域網稱為交換式局域網。
到目前為止,在一個廣播域內,消息能夠送達是靠廣播(類比基本靠吼,這就是鏈路層,沒有超出一箭之遠),網絡地址主要是MAC地址(網卡出廠全球唯一地址,類比身份信息),協議解析只用到以太網協議:Ethernet和IEEE 802.3等(類比中文,英文等)。當然還有其他的一堆協議,不一一列舉。
路由器工作在網絡層,可以識別網絡層的地址——IP地址,有能力過濾第三層的廣播消息。實際上,除非做特殊配置,否則路由器從不轉發廣播類型的數據包。因此,路由器的每個端口所連接的網絡都獨自構成一個廣播域。
到這里,突然覺得網絡層也清晰起來。
網絡層是可以識別IP地址的層,也就是通過路由器尋找IP地址,就可以定位一個網絡(類比郵遞員)。由于地址中網絡層包了主機的鏈路層地址,在定位到的網絡中廣播(吼一聲)就可以找到目標主機了。但是路由器只關心網絡地址,定位目標主機的任務交給目的網絡的交換機即可。所以用到的協議是IP協議,ARP協議等(也有管理功能的ICMP)。由此,我們可以總結,互聯網上存在大量的主機,而這些主機又分別屬于不同的大量網絡中,路由的重要作用就是定位到目標主機所在的網絡,從IP地址的分類和IP地址分為網絡地址和主機地址兩部分,應該可以明白網絡層的含義(而不用刻意去記)。
為了提供傳輸控制,引入了兩種傳輸類型迥異的傳輸協議TCP和IP。復雜的傳輸控制方法和對比,這里不展開討論。重點是,從上面的討論,已經可以定位網絡中的一臺主機,而一臺主機上可以運行很多應用程序(綁定監聽端口的應用程序又稱為服務,即響應外部請求,向外提供服務),如何知道網絡上發過來消息應該有那一個應用程序處理呢?端口號的作用就是用來區分應用程序(我們知道,一個端口是不能被不同的應用程序重復綁定的),但端口號只會在應用層處理,在傳輸層是透明傳輸,不做處理。研究傳輸層,可以通過對比的分析TCP和IP的差異深入理解為什么引入傳輸層(在不可靠的網絡層和應用層之間,提供一個中間層)。
應用層只是調用socket接口,負責處理特定的應用程序細節。在socket接口中,需要明確的指定TCP還是UDP。其實到了應用層,開發者可以根據需要增加各種不同的首部,定義新的協議。在應用層需要強調的是,Linux/UNIX的哲學是一切皆文件,外部設備也被視為文件,而網絡數據的收發和讀寫打破了這一切。應用層接口并沒有與Linux/UNIX文件接口保持一致,而是設計了一套稱為套接字socket的特殊接口。《深入Linux內核架構》中給出了一個理由:網絡中的所有層次使用了許多不同的通信協議,為建立連接需要指定許多選項,而且無法在打開設備文件時完成這些任務。20世紀80年代的BSD UNIX程序員也曾經為此頭痛,套接字的接口就是最終采用的解決方案,而今已成為事實的工業標準。
1988年David D. Clark在其《互聯網架構的設計哲學》中總結當初設計互聯網的最高層次目標是:在一個基于分組交換的通訊設備中,大量的不同的網絡通過使用一種稱為網關的包通訊處理機連接在一起,其中網絡中節點,包括路由器,網關的實現都采用了一種存儲轉發包的思想。這個目標里面提到了幾個關鍵詞:分組交換,網關,分組。這些關鍵詞體現了網絡設計的一些重大決策,比如,采用分組交換是存儲轉發和多路復用的基礎,引入網關的實現多個不同網絡互連,并且網關不保留實質性連接狀態信息和包的序列信息(網關按包獨立轉發),分組的設計是網絡協議的基礎。
文章還討論了一個很有挑戰性的問題:架構與性能之間的關系。 互聯網結構的設計者強烈地認為,僅僅重視邏輯正確性而忽視性能是一個重大錯誤。 但是,他們在提升受到架構限制的任何方面的性能的嘗試中遇到了很大困難。 這些困難產生的原因有二,首先這個架構的目標不是保證性能,而是提供多樣性,其次(也許更基本),因為看來不存在正式的工具來描述性能。這也提出了關鍵性的另一個問題,就是在體系結構中如何規范的描述結構性能問題,以期能切實指導實踐者,單純的指明“這個網絡能吞吐多少數據”并不能解決根本性的問題,也不是體系結構需要進行描述的。
一個系統是與其所運行的環境高度配合的,商業利益清單可以很容易的對目標進行問責。從批評者的語言里思考一下,或許可以得到一些靈感。
2006年Geoffrey G. Xie在論文《互聯網架構:回顧和展望》中總結了互聯網架構設計的三大原則。第一點是犧牲效率獲得簡單性,其后果是網路對底層硬件和上層應用需求都不做任何假設,衍生了復雜的QoS,傳輸控制和流量工程等。第二點是報文服務,目前也被稱為IP細腰,邏輯上看,這個細腰構成網絡上數據流動的協議水位線。其缺點是網絡設備不感知數據內容。第三點是端到端論斷,和IP細腰一起,讓整個網絡以主機為中心,而不是以數據為中心。ACM通訊上發布文章《網絡命名內容》,提出了對內容進行編址,用內容細腰替代IP細腰的一家之言。
【本文是51CTO專欄作者石頭的原創文章,轉載請通過作者微信公眾號補天遺石(butianys)獲取授權】