對(duì)于開發(fā)人員而言,從復(fù)雜的問題中找尋規(guī)律是基本的能力,亦如抽象。如果單一抽象仍不能較好詮釋問題,那還可以從分層的角度來定義問題。分層能使我們暫時(shí)從最旁枝末節(jié)的點(diǎn)抽身出來,擁有更高的視野,視其全貌。網(wǎng)絡(luò)環(huán)境復(fù)雜度不言而喻,所以分層也就成了公認(rèn)選擇。
1. 協(xié)議層級(jí)

上圖中兩種分層方式,左邊的五層結(jié)構(gòu)可以看成是實(shí)踐派的做法,右邊的七層結(jié)構(gòu)可以堪稱是學(xué)術(shù)派的研究。不談優(yōu)劣,只談適應(yīng)不適應(yīng)。目前主流使用的是五層結(jié)構(gòu),因?yàn)樗舆m應(yīng)于具體開發(fā)過程。畢竟分層是為了解耦,解耦必然帶來性能降低及復(fù)雜度增加,所以取個(gè)權(quán)衡值才是最實(shí)在的。
那么對(duì)左邊封層方式,逐層簡(jiǎn)要介紹如下:
1.1 Application 應(yīng)用層
顧名思義,主要由應(yīng)用、以及應(yīng)用之間通信協(xié)議構(gòu)成。典型應(yīng)用有瀏覽器、郵件、文件服務(wù)等,與之對(duì)應(yīng)的則分別是HTTP、SMTP、FTP等協(xié)議。該層主要有如下兩個(gè)要素:
- 訪問形式: 域名,如 www.baidu.com
- 信息單元: message,或稱為消息
1.1.1 Domain name system(DNS)
前文中提到過,每個(gè)可聯(lián)網(wǎng)設(shè)備在網(wǎng)絡(luò)中真正唯一的標(biāo)識(shí)符是其網(wǎng)卡上的MAC地址,其他的只是為了便于訪問而存在的高可讀性字段。類似于中國(guó)公民,其身份證號(hào)碼在國(guó)境內(nèi)是唯一的,但數(shù)字可讀性差,所以還需要建立起姓名等映射關(guān)系便于訪問。同樣的,域名相當(dāng)于真正要訪問MAC地址的高可讀性映射,只是綁定關(guān)系讓其變得有意義。而建立這種綁定關(guān)系的,就是域名系統(tǒng)DNS。
DNS中域名對(duì)應(yīng)的直接映射并非MAC地址,而是一串稱為IP地址的數(shù)字。

IP Address
茫茫人海,只知道身份證號(hào)碼和姓名來找一個(gè)人是十分低效甚至無法達(dá)成的,這時(shí)候,逐層的具體地址就派上了大用場(chǎng)。同樣的,為了更便捷有效地管理網(wǎng)絡(luò)上各式各樣數(shù)量巨大的聯(lián)網(wǎng)設(shè)備,IP協(xié)議按類似省市縣的分層形式制訂了子網(wǎng)系統(tǒng)。
以IPv4(Version 4)為例,每個(gè)IP地址共32位,除去不同類型起始碼,其余主要由網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)構(gòu)成,對(duì)應(yīng)“A省B市”的結(jié)構(gòu):

1.1.2 Port端口
通常應(yīng)用是以進(jìn)程的形式存在,單個(gè)主機(jī)上會(huì)有多個(gè)進(jìn)程同時(shí)運(yùn)行。IP地址雖然標(biāo)示了當(dāng)前主機(jī)號(hào),但還不能標(biāo)示到具體進(jìn)程。因此不同主機(jī)上的進(jìn)程如需通訊,還必須通過額外字段標(biāo)明進(jìn)程,這個(gè)字段就是Port端口。
Port是一個(gè)16位數(shù)字,通常和IP地址同時(shí)使用。隨著互聯(lián)網(wǎng)的發(fā)展,部分Port(0~1024)已被某些知名服務(wù)占用,如80/8080等。通過測(cè)試某些端口是否有響應(yīng),即可測(cè)試對(duì)應(yīng)服務(wù)是否存在。
1.2 Transport 傳輸層
傳輸層負(fù)責(zé)在應(yīng)用間傳遞message,即服務(wù)于應(yīng)用層。與應(yīng)用層兩要素相比,不同之處在于:
- 訪問形式:端口,8080
- 信息單元:segment
既然是在應(yīng)用間傳遞信息,就必然要標(biāo)明應(yīng)用本身。而在一個(gè)host上,port是綁定到進(jìn)程的,因此只需要通過port口進(jìn)行標(biāo)注即可。主流傳輸協(xié)議有TCP和UDP兩種,具體將在單獨(dú)章節(jié)介紹。
1.3 Network 網(wǎng)絡(luò)層
網(wǎng)絡(luò)層負(fù)責(zé)在主機(jī)間移動(dòng)segment,即服務(wù)于傳輸層。與傳輸層兩要素相比,不同之處在于:
- 訪問形式:IP地址,如 192.168.128.10
- 信息單元:datagram
因?yàn)槭窃谥鳈C(jī)間傳遞信息,那么自然標(biāo)識(shí)符也只需要精確到IP本身即可。從硬件上講,一個(gè)主機(jī)通常一至多個(gè)網(wǎng)卡,各自有不同IP地址,但均和主機(jī)本身綁定。網(wǎng)絡(luò)層送出的信息中指明對(duì)端IP,傳入的信息中也可拆分出具體Port,隨后傳送到具體應(yīng)用解析即可。
1.4 Link 鏈路層
前文提到,主機(jī)間的鏈路可能需要多個(gè)結(jié)點(diǎn)(如Switch、Router甚至ISP)的參與,要想把一條datagram成功送達(dá)對(duì)端主機(jī),也絕非易事,因此專門分出一個(gè)鏈路層來完成鏈路的形成、維護(hù)、斷開等工作。鏈路層服務(wù)于網(wǎng)絡(luò)層,要素區(qū)別在于:
- 訪問形式:IP地址,如192.168.128.10
- 信息單元:frame
注意到這里的信息單元并非datagram,也就是說,鏈路層的信息與datagram除去header,其實(shí)還有可能內(nèi)容本身也不相同。因?yàn)殒溌酚刹煌行螣o形的硬件鏈路構(gòu)成,每一段鏈路的傳輸率、最大傳輸單元MTU等也各自不同,所有大于鏈路最大傳輸單元的datagram要想順利傳輸,就必須切分成合適的frame,傳輸完成后,再重新組裝。
有人可能會(huì)問,一直說MAC地址是唯一標(biāo)識(shí),怎么到了鏈路層還沒用上,別急,這就來了。
1.4.1 MAC Address
MAC地址是由網(wǎng)卡生產(chǎn)商生產(chǎn)時(shí)固化進(jìn)網(wǎng)卡的,為保證其唯一性,MAC地址中有一段是不同生產(chǎn)商申請(qǐng)到的代號(hào)。

上一篇中提到一個(gè)設(shè)備,叫做Switch交換機(jī),也叫網(wǎng)橋,是MAC地址的集成器。要記住,IP地址是人為地為設(shè)備分配一個(gè)標(biāo)識(shí)符,以便區(qū)隔管理,典型的如DHCP動(dòng)態(tài)內(nèi)存分配就印證了這個(gè)道理。因此網(wǎng)絡(luò)中一定存在一張IP地址和MAC地址的映射表,從而使得信息能夠真正抵達(dá)對(duì)應(yīng)的網(wǎng)卡。而通常,這個(gè)任務(wù)就交給了交換機(jī)。
1.5 Physical 物理層
物理層是最基礎(chǔ)的一層,它的職責(zé)只需要負(fù)責(zé)完好地傳輸每一個(gè)bit即可。有了鏈路層精確定位到的兩個(gè)MAC主機(jī),剩下的就交給硬件材料、協(xié)議等來完成了。如前所述,不會(huì)過多關(guān)注到底層的硬件細(xì)枝,因此如有興趣,可自行拓展閱讀。
2. packet封裝
前半部分對(duì)網(wǎng)絡(luò)中各個(gè)職能劃分了層級(jí),為了更加形象地展開剩下的packet封裝內(nèi)容,要先講個(gè)快遞的通用流程。
快遞相信大部分人都收過,貢獻(xiàn)我自己的一張,并大致分層如下:

-
應(yīng)用層
賣家將貨物裝箱,貼上快遞單,上寫發(fā)貨人、收貨人地址等聯(lián)系方式。
對(duì)應(yīng)的Message同樣封裝好內(nèi)容后,即送出。
-
傳輸層
分公司收到封裝好的包裹,按照地址,查詢下一站,并送出至相應(yīng)分撥中心。
對(duì)應(yīng)的Segment中包含源和目的IP:Port,及其他如稱重等輔助校驗(yàn)信息。
-
網(wǎng)絡(luò)層
分撥中心則負(fù)責(zé)決策將貨物送往另一分撥中心,這一層偏向?qū)ふ疫f送的最優(yōu)途徑。
網(wǎng)絡(luò)層對(duì)應(yīng)的同樣是為了給datagram找尋到送達(dá)的最優(yōu)途徑,最優(yōu)通常意味著最快,但不意味著所經(jīng)過的路徑本身最短。
-
鏈路層
確定具體對(duì)接分撥中心后,將進(jìn)一步確定使用何種交通工具送達(dá),并重組貨物結(jié)構(gòu)(如集裝箱化)以便于運(yùn)輸。
在網(wǎng)絡(luò)層中確定路徑后,鏈路層將負(fù)責(zé)重組收到的所有datagram,以便適應(yīng)不同鏈路的最大傳輸單元大小。
-
物理層
確定交通工具后,交給貨運(yùn)負(fù)責(zé)人員即可。

3. 小結(jié)
歸根結(jié)底,各層協(xié)議的定義只是為了更好地完成層級(jí)化后的本職工作,生活中也一樣,能真正地干好自己的本職工作,其實(shí)本身就是對(duì)別人最大的尊重。當(dāng)然也必須清晰地意識(shí)到,每一次層級(jí)的增多,再帶來更大兼容性的同時(shí),往往意味著更大的溝通成本,如應(yīng)用層對(duì)端可能只希望傳輸一個(gè)字符,實(shí)際上卻需要傳輸一堆額外的各層頭信息。