前言 互聯(lián)網(wǎng)是怎么構(gòu)成的,又是怎么運作的?什么面試官老喜歡問 TCP/IP 網(wǎng)絡(luò)?為什么遠(yuǎn)隔萬里的計算機可以互相通信?計算機網(wǎng)絡(luò)作為 IT 行業(yè)的基石,是工程師永遠(yuǎn)繞不開的話題。 網(wǎng)絡(luò)的分層體系結(jié)構(gòu)計算機網(wǎng)絡(luò)是一個非常龐大且復(fù)雜的系統(tǒng),所以在設(shè)計之初就嚴(yán)格遵守著「分層」的設(shè)計理念。分層將龐大的問題細(xì)分為了若干個局部的小問題,具有下列好處:
其中「標(biāo)準(zhǔn)化」是促進(jìn)互聯(lián)網(wǎng)全球化的關(guān)鍵,在計算機網(wǎng)絡(luò)領(lǐng)域,你會聽說到各種各樣的協(xié)議,這些都是標(biāo)準(zhǔn)化的結(jié)果。試想,如果每個網(wǎng)卡廠商都使用了不同的網(wǎng)線接口風(fēng)格,那無疑是一個災(zāi)難。 主流網(wǎng)絡(luò)分層體系結(jié)構(gòu)有兩種:
值得一提的是,由國際化標(biāo)準(zhǔn)組織制定的 OSI 模型,本來是最應(yīng)該在全球范圍內(nèi)推廣的網(wǎng)絡(luò)模型,不過因為 OSI 的設(shè)計過于理想不合實際,再加上當(dāng)時應(yīng)用 TCP/IP 模型的因特網(wǎng)(Internet)已經(jīng)覆蓋了全球大部分地區(qū)。種種原因,導(dǎo)致 OSI 并沒有取得市場化的成功,僅僅是獲得了理論上的研究成果。而 TCP/IP 模型則被作為了事實上的國際標(biāo)準(zhǔn)。 TCP/IP 網(wǎng)絡(luò)模型請注意,計算機網(wǎng)絡(luò)的分層體系結(jié)構(gòu)雖然是抽象的,但實現(xiàn)則是具體的。 上圖展示了 HTTP 應(yīng)用數(shù)據(jù)在主機間傳輸?shù)倪^程,首先自上而下、宏觀的來看數(shù)據(jù)在分層網(wǎng)絡(luò)模型里的流轉(zhuǎn)。
TCP/IP 的每個層級都依賴于下層支撐,越往上就離用戶越近,反正則離硬件越近。從上至下,不斷為應(yīng)用數(shù)據(jù)附加首部的過程稱為封裝,從下至上不斷解析首部的過程則稱為解封裝。 最終在物理層傳輸?shù)臄?shù)據(jù)幀如上圖所示,含有多個首部(Head),它們具有不同的數(shù)據(jù)結(jié)構(gòu)和功能,服務(wù)于數(shù)據(jù)傳輸?shù)目尚行?。學(xué)習(xí)計算機網(wǎng)絡(luò),其實就是學(xué)習(xí)各式 Head 的功能,學(xué)習(xí)每一層的核心協(xié)議以及它所解決的問題。下面繼續(xù)自下而上的對數(shù)據(jù)幀進(jìn)行解析,深入各層級的實現(xiàn)細(xì)節(jié)。 物理介質(zhì)層物理介質(zhì)是連接網(wǎng)絡(luò)終端設(shè)備(計算機、交換機、路由器)的物理手段,最常見的有網(wǎng)線(雙絞線),除此還有光纖、無線電波等。不同的物理介質(zhì)決定了電信號傳輸?shù)木嚯x、帶寬、速率、抗干擾能力等性能參數(shù)。 所以物理介質(zhì)層主要解決的問題是:
物理層所帶來的最直觀的好處就是,我們可以使用同一根網(wǎng)線插進(jìn)任何品牌的計算機上。 數(shù)據(jù)鏈路層 上文提到,數(shù)據(jù)實際會以電信號的形式在物理介質(zhì)中傳輸,不過單純的 01 數(shù)字顯然是沒有價值的,需要為電信號進(jìn)行分組和排序,以特有的組織方式來賦予其特定的含義。數(shù)據(jù)鏈路層為了解決這個問題先后提出過包括有 Ethernet v.2、IEEE 802.2、Internetwork 在內(nèi)的多種協(xié)議,其中又以 Ethernet 協(xié)議占據(jù)主導(dǎo)地位。 Ethernet 協(xié)議,即以太網(wǎng)協(xié)議,規(guī)定了電信號的分組方式。一組電信號稱為一個數(shù)據(jù)幀,數(shù)據(jù)幀又由幀首、數(shù)據(jù)和幀尾三部分組成。發(fā)送方通過物理介質(zhì)把數(shù)據(jù)幀發(fā)送給接收方,接收方接收到一組電信號,就會認(rèn)為是接收到了一個數(shù)據(jù)幀。
在規(guī)范了電信號解讀方式后,數(shù)據(jù)鏈路層還要解決 “主機定位” 的問題:數(shù)據(jù)幀怎么知道自己應(yīng)該被哪一臺主機接收呢? 以太網(wǎng)協(xié)議規(guī)定了接入網(wǎng)絡(luò)的終端設(shè)備都必須安裝有網(wǎng)絡(luò)設(shè)配器(即 NIC 網(wǎng)卡),數(shù)據(jù)幀必須由網(wǎng)卡發(fā)送,再由另一張網(wǎng)卡接收。每張網(wǎng)卡都被分配一個 MAC 地址,具有全球唯一性。而數(shù)據(jù)接收方的 MAC 地址就被記錄在數(shù)據(jù)幀首部。 MAC 地址為 6 字節(jié),使用 12 個十六進(jìn)制數(shù)表示,e.g. 00:01:6C:06:A6:29
以太網(wǎng)協(xié)議數(shù)據(jù)幀定位原理:有了 MAC 地址以后,以太網(wǎng)協(xié)議采用廣播形式,將數(shù)據(jù)幀發(fā)給本地網(wǎng)絡(luò)內(nèi)所有的主機,主機在接收數(shù)據(jù)幀后會解析數(shù)據(jù)幀首部的目標(biāo)主機網(wǎng)卡 MAC 地址,再和自身的網(wǎng)卡 MAC 地址對比。若相同,就接收數(shù)據(jù)幀做下一步處理。若不同,則丟棄。 而且為了增幅廣播的性能和組網(wǎng)的靈活性,一般會在本地網(wǎng)絡(luò)中架設(shè)交換機來支持信號轉(zhuǎn)發(fā),交換機也是數(shù)據(jù)鏈路層的代表設(shè)備。 數(shù)據(jù)鏈路層主要解決的問題是:對電信號進(jìn)行分組并形成具有特定意義的數(shù)據(jù)幀,然后以廣播的形式通過物理介質(zhì)發(fā)送給接收方。 網(wǎng)絡(luò)層從理論來講,使用 MAC 地址就可以實現(xiàn)定位到這里世界上任意一臺計算機,前提是廣播的作用域也是全球范圍的,但這并不現(xiàn)實。MAC 地址的定位方式存在本地子網(wǎng)的局限性。所以除了以太網(wǎng)協(xié)議之外,還迫切的需要解決下列問題:
IP(Internet Protocol,因特網(wǎng)協(xié)議)是網(wǎng)絡(luò)層的核心協(xié)議,規(guī)定了網(wǎng)絡(luò)層的封裝規(guī)范,將上層(傳輸層)傳遞下來的數(shù)據(jù)段附加上 IP 首部封裝成 IP 數(shù)據(jù)包,又稱數(shù)據(jù)報文,IP 數(shù)據(jù)包同樣由包首部和數(shù)據(jù)兩部分組成,只是數(shù)據(jù)部分實際為傳輸層的數(shù)據(jù)段。 數(shù)據(jù)包首部長度為 20 字節(jié),數(shù)據(jù)部分最大長度為 65515 字節(jié),一個 IP 數(shù)據(jù)包總長達(dá) 65535 字節(jié)。而下層數(shù)據(jù)幀的數(shù)據(jù)部分最長為 1500 個字節(jié),所以如果 IP 數(shù)據(jù)包的實際長度超過了 1500,就需要對 IP 數(shù)據(jù)包進(jìn)行分片處理,由多個數(shù)據(jù)幀發(fā)送。 IP 數(shù)據(jù)包首部:
IP 地址:因為 MAC 地址無法滿足復(fù)雜的網(wǎng)絡(luò)環(huán)境需求,所以 IP 協(xié)議制定了一套邏輯上的網(wǎng)絡(luò)地址(IP/子網(wǎng)掩碼)。IP 地址有 IPv4 和 IPv6 兩個版本,通過子網(wǎng)掩碼將 IP 地址分為網(wǎng)絡(luò)號、主機號兩個部分,前者標(biāo)識了一個子網(wǎng),后者標(biāo)識了子網(wǎng)中的主機。如果兩臺主機處在同一子網(wǎng),那么它們的網(wǎng)絡(luò)號必須是相同的。IP 地址解決了 “如何輕易的進(jìn)行子網(wǎng)劃分” 的問題。 ARP 協(xié)議 引入 IP 地址后,接入網(wǎng)絡(luò)的主機至少擁有一個 IP 地址和 MAC 地址。需要強調(diào)的是,IP 地址本質(zhì)上是一個邏輯地址,為了解決上層復(fù)雜的子網(wǎng)架構(gòu)問題而生,并不能作為最終定位主機的依據(jù),這仍要依靠 MAC 地址來完成。因此,網(wǎng)絡(luò)層還需要找到一種方法來完成 IP to MAC 的映射,ARP 協(xié)議應(yīng)運而生。 ARP(Address Resolution Protocol,地址解析協(xié)議)提供了根據(jù) IP 地址來獲取 MAC 地址的能力,地址解析之名由此而來。 地址解析原理:主機間的通信時,ARP 協(xié)議首先會發(fā)起一個請求 IP 數(shù)據(jù)包,IP 數(shù)據(jù)包的首部包含有目標(biāo)主機 IP 地址,這個數(shù)據(jù)包經(jīng)由數(shù)據(jù)鏈路層、物理介質(zhì)層,最終廣播到子網(wǎng)內(nèi)所有主機,主機接受到該 IP 數(shù)據(jù)包后解析出其首部所包含的目標(biāo)主機 IP 地址,再和自身 IP 地址進(jìn)行比對。若相同,則根據(jù)數(shù)據(jù)包首部包含的源主機 IP 地址將 MAC 地址返回;若不相同,則丟棄該數(shù)據(jù)包。同時 ARP 協(xié)議還會緩存一份地址映射表在本地,表記錄為返回的 MAC 地址和目標(biāo)主機 IP 地址。下次再需要通信時,ARP 會直接查詢地址映射表以提高效率。 路由協(xié)議通過 ARP 協(xié)議的地址解析原理不難發(fā)現(xiàn),ARP 協(xié)議同樣具有子網(wǎng)局限性。為了突破這一限制實現(xiàn)跨子網(wǎng)通信,網(wǎng)絡(luò)層實現(xiàn)了路由協(xié)議。 路由協(xié)議提供了異構(gòu)網(wǎng)(子網(wǎng)間)互聯(lián)的能力,可以將一個子網(wǎng)的 IP 數(shù)據(jù)包發(fā)送到另一個子網(wǎng)。所謂 “路由” 即指導(dǎo)數(shù)據(jù)包轉(zhuǎn)發(fā)的路徑信息。路由協(xié)議是運行在路由器上的協(xié)議,在錯綜復(fù)雜的網(wǎng)絡(luò)世界中,路由器充當(dāng)了交通樞紐的角色,它會視實際的網(wǎng)絡(luò)環(huán)境來選擇最佳路徑進(jìn)行數(shù)據(jù)包轉(zhuǎn)發(fā),路由器是網(wǎng)絡(luò)層的代表設(shè)備。 IP 數(shù)據(jù)包路由原理:主機間的通信時,首先會通過 IP 協(xié)議來判斷兩臺主機是否處在同一子網(wǎng)。若是,直接交給 ARP 協(xié)議和以太網(wǎng)協(xié)議來完成子網(wǎng)廣播。若不是,以太網(wǎng)協(xié)議則會將 IP 數(shù)據(jù)包發(fā)送到子網(wǎng)網(wǎng)關(guān)(一般為路由器)進(jìn)行路由決策,在經(jīng)過若干次網(wǎng)關(guān)路由轉(zhuǎn)發(fā)之后,IP 數(shù)據(jù)包就進(jìn)入到目標(biāo)主機 IP 地址所處的子網(wǎng)中,最后還是通過子網(wǎng)廣播完成主機定位。 可見,路由器和路由協(xié)議解決了 “如何隔離子網(wǎng)之間的廣播信號” 和 “子網(wǎng)之間的計算機依舊能夠通信” 的問題。 傳輸層通過物理介質(zhì)層、數(shù)據(jù)鏈路層和網(wǎng)絡(luò)層的底層支撐,或者說通過 MAC 地址和 IP 地址的支撐,得以實現(xiàn)了主機間在全球互聯(lián)網(wǎng)中的互聯(lián)互通,所以三者也會被歸納為「基礎(chǔ)傳輸層」。 不過僅僅支持 “主機定位” 依舊是不足以滿足需求的,還需要完成主機上的 “應(yīng)用程序定位” 才可以。因為互聯(lián)網(wǎng)傳輸?shù)臄?shù)據(jù)往往是應(yīng)用程序的數(shù)據(jù),比如微信聊天,實際是兩臺設(shè)備上微信 APP 之間的數(shù)據(jù)傳輸。所以主機在接收到數(shù)據(jù)后,還需要解決:這個 IP 數(shù)據(jù)包應(yīng)該交由誰來處理?就是所謂的 “應(yīng)用程序定位” 問題。 對此,傳輸層規(guī)定為每個應(yīng)用程序都指定一個特殊的 “地址” 來輔助定位,這個 “地址” 就是 —— 進(jìn)程端口(Port) 傳輸層的主要作用就是建立進(jìn)程與進(jìn)程之間的通信,即 Port 到 Port 之間的數(shù)據(jù)傳輸,主要有 UDP 協(xié)議和 TCP 協(xié)議兩種實現(xiàn)。如果你具有網(wǎng)絡(luò)應(yīng)用編程經(jīng)驗,那么你對 (IP, Port) 的組合應(yīng)該不會感到陌生,這就是 Unix 系列操作系統(tǒng)定義的 Socket 套接字。 可用端口號在 [0, 65535] 之間,其中 [0, 1023] 屬于系統(tǒng)端口,由操作系統(tǒng)原生服務(wù)進(jìn)程使用,其余為用戶端口,由用戶自由分配。傳輸層的 PUD 為數(shù)據(jù)段(Segment),其首部也有 TCP 首部和 UDP 首部兩種類型。 數(shù)據(jù)段首部為 8 字節(jié),數(shù)據(jù)部分為上層應(yīng)用數(shù)據(jù)占 65527 字節(jié),總長不超過 65,535 字節(jié),正好作為下層 IP 數(shù)據(jù)包的數(shù)據(jù)部分。 TCP 協(xié)議TCP(Transmission Control Protocol,傳輸控制協(xié)議),是一種面向連接的可靠傳輸協(xié)議,提供可靠(無差錯、不丟失、不重復(fù)、按順序)的字節(jié)流數(shù)據(jù)傳輸服務(wù)。在傳輸效率和可靠性之間選擇了后者,所以有開銷大、傳輸速度慢的缺點。
TCP 的可靠性傳輸具有非常復(fù)雜的實現(xiàn)細(xì)節(jié),包括但不限于:
數(shù)據(jù)段首部:
其中的 TCP Flags 字段,是非常重要的功能標(biāo)識,占 8 位,分別為:
下面以三次握手和四次揮手為例,看看數(shù)據(jù)段首部是怎么進(jìn)行傳輸標(biāo)識并以此來保存可靠性的。 三次握手:
為什么要使用三次握手來保證數(shù)據(jù)傳輸?shù)目煽啃裕?/strong> 四次揮手:
UDP(User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議),是一種無連接的非可靠傳輸層協(xié)議。UDP 不提供數(shù)據(jù)包分組、組裝,不能對數(shù)據(jù)段進(jìn)行排序,所以 UDP 數(shù)據(jù)段的首部非常簡單。換句話說,當(dāng)數(shù)據(jù)段發(fā)送出去之后,發(fā)送方是無法得知其是否完整且安全的到達(dá)了接收方的。這樣的傳輸機制決定了它的最大優(yōu)點就是快,同時也決定了它最大的缺點不可靠、不穩(wěn)定。 UDP 數(shù)據(jù)段首部:
應(yīng)用層是直接面向用戶的,所以相對于數(shù)據(jù)傳輸?shù)募?xì)節(jié),應(yīng)用層更加關(guān)注數(shù)據(jù)的表示形式,其主要工作是定義數(shù)據(jù)格式并按照相應(yīng)的格式要求進(jìn)行數(shù)據(jù)解讀。因此,應(yīng)用層定義了各種各樣的協(xié)議來規(guī)范數(shù)據(jù)格式,常見的有 HTTP(萬維網(wǎng)), FTP(文件傳輸), SMTP(郵件) 等等。 以互聯(lián)網(wǎng)上應(yīng)用最廣泛的 HTTP(HyperText Transfer Protocol,超文本傳輸協(xié)議)為例,其數(shù)據(jù)首部格式如下: 如上圖標(biāo)記內(nèi)容,HTTP 規(guī)范了定義和解讀數(shù)據(jù)格式的方式:
總結(jié)一下,應(yīng)用層的作用主要是為計算機上的應(yīng)用程序提供服務(wù),包括提供數(shù)據(jù)格式表現(xiàn)、數(shù)據(jù)加密、遠(yuǎn)程終端會話等應(yīng)用功能。應(yīng)用層無需關(guān)心數(shù)據(jù)的傳輸細(xì)節(jié),這是分層設(shè)計帶來的好處,程序員完全可以在不了解底層協(xié)議的前提下使用應(yīng)用層的眾多協(xié)議來進(jìn)行工作。 最后回顧總結(jié)一下:
核心協(xié)議全家福: |
|
來自: 常有理 > 《IT技術(shù)》