內(nèi)容
TCP/IP協(xié)議,是一個有層次的協(xié)議棧,一直都有聽說過,四層負(fù)載均衡,七層負(fù)載均衡,二層轉(zhuǎn)發(fā),三層路由...那這些層次的含義是什么?
TCP/IP網(wǎng)絡(luò)分層模型
TCP/IP當(dāng)初的設(shè)計者,創(chuàng)造性地提出了分層的概念,把復(fù)雜的網(wǎng)絡(luò)通信劃分出多個層次,再給每一個層次分配不同的職責(zé),層次內(nèi)只專心做自己的事情就好,用“分而治之”的思想,把一個大麻煩拆分成了數(shù)個小麻煩,從而解決了網(wǎng)絡(luò)通信的難題。

層次順序,從下往上,所以從最下面一層開始慢慢解釋。
鏈接層(Link Layer)
負(fù)責(zé)在以太網(wǎng)、WiFi這樣的底層網(wǎng)絡(luò)上發(fā)送原始數(shù)據(jù)包,工作在網(wǎng)卡這個層次,使用MAC地址來標(biāo)記網(wǎng)絡(luò)上的設(shè)備,所以有時候也叫MAC層。
網(wǎng)際層 / 網(wǎng)絡(luò)互聯(lián)層(Internet Layer)
IP協(xié)議就處在這一層。因為IP協(xié)議定義了“IP地址”的概念,所以就可以在鏈接層的基礎(chǔ)上,用IP地址取代MAC地址,把許許多多的局域網(wǎng)、廣域網(wǎng)連接成一個虛擬的巨大網(wǎng)絡(luò),在這個網(wǎng)絡(luò)里找設(shè)備時,只要把IP地址,再翻譯成MAC地址就可以了。
傳輸層(Transport Layer)
這個層次協(xié)議的職責(zé)是保證數(shù)據(jù)在IP地址標(biāo)記的兩點之間 “可靠”地傳輸,是TCP協(xié)議工作的層次,另外還有一個是UDP。
TCP是一個有狀態(tài)的協(xié)議,需要先與對方建立連接,然后才能發(fā)送數(shù)據(jù),而且保證數(shù)據(jù)不丟失不重復(fù)。而UDP比較簡單,他是無狀態(tài),不用事先建立連接就可以任意發(fā)送數(shù)據(jù),但不保證數(shù)據(jù)一定會發(fā)到對方。兩個協(xié)議的另一個重要區(qū)別在于數(shù)據(jù)的形式。TCP數(shù)據(jù)是連續(xù)的“字節(jié)流”,有先后順序。而UDP,則是分散的小數(shù)據(jù)包,是順序發(fā),亂序收。
應(yīng)用層
由于下面的三層把基礎(chǔ)打得非常好,所以在這一層,想干嘛就干嘛了,有各種面向具體應(yīng)用的協(xié)議。例如,Telnet、SSH、FTP、SMTP,還有HTTP
小結(jié)
MAC層傳輸單位是幀(frame),IP層的傳輸單位是包(packet),TCP層的傳輸單位是段(Segment),HTTP的傳輸單位是消息或報文(message)。這些名詞,都可以統(tǒng)稱為數(shù)據(jù)包。
OSI網(wǎng)絡(luò)分層模型
OSI,開放式系統(tǒng)互聯(lián)通信參考模型(Open System Interconnection Reference Model)。70年代,網(wǎng)絡(luò)協(xié)議頻出,ISO感覺野路子太多了,就想來個大一統(tǒng)。于是,設(shè)計出了一個新的網(wǎng)絡(luò)分層模型,想用這個框架來統(tǒng)一既存的各種網(wǎng)絡(luò)協(xié)議。就是這個OSI
主要分成了七層,部分層次與TCP/IP很像:

- 第一層:物理層,網(wǎng)絡(luò)的物理形式,例如電纜、光纖、網(wǎng)卡、集線器等等
- 第二層:數(shù)據(jù)鏈路層,相當(dāng)于TCP/IP的鏈接層;
- 第三層:網(wǎng)絡(luò)層,相當(dāng)于TCP/IP的網(wǎng)際層;
- 第四層:傳輸層,相當(dāng)于TCP/IP的傳輸層;
- 第五層:會話層,維護(hù)網(wǎng)絡(luò)中的連接狀態(tài),即保持會話和同步;
- 第六層:表示層,把數(shù)據(jù)轉(zhuǎn)換為合適、可理解的語法和語義;
- 第七層:應(yīng)用層,面向具體的應(yīng)用傳輸數(shù)據(jù)
不過ISO很清楚,TCP/IP協(xié)議才是主導(dǎo),OSI分層模型在發(fā)布的時候,就明確地表明是一個參考,不是強(qiáng)制標(biāo)準(zhǔn)。但是OSI模型也是有優(yōu)點的,對比一下就可以看出,TCP/IP是一個純軟件的棧,沒有網(wǎng)絡(luò)應(yīng)用的最根基的電纜、網(wǎng)卡等物理設(shè)備的位置。而OSI補(bǔ)足了這個缺失,在理論層面上描述網(wǎng)絡(luò)更加完整。
還有一個重要的形式上的有點:OSI為每一層標(biāo)記了明確了編號,最底層是一層,最上層是七層。而TCP/IP的層次只有名字,沒有編號。所以,比較好叫。這些只是理論上的,沒有與現(xiàn)實完全對應(yīng)。
兩個分層模型的映射關(guān)系
現(xiàn)在我們有了兩個網(wǎng)絡(luò)分層模型:TCP/IP和OSI,那這兩個模型是怎么去做互相映射或者說,互相解釋的?(OSI在設(shè)計之初,就有參考了TCP/IP等多個協(xié)議)

- 第一層:物理層,TCP/IP里無對應(yīng);
- 第二層:數(shù)據(jù)鏈路層,對應(yīng)TCP/IP的鏈接層;
- 第三層:網(wǎng)絡(luò)層,對應(yīng)TCP/IP的網(wǎng)際層;
- 第四層:傳輸層,對應(yīng)TCP/IP的傳輸層;
- 第五、六、七層:統(tǒng)一對應(yīng)到TCP/IP的應(yīng)用層。
這就是“理想與現(xiàn)實”之間的矛盾,理想很美好,有七層,但現(xiàn)實很殘酷,只有四層,多余的五六層就此消失。
實際原因:
OSI的分層模型,在四層以上分得太細(xì),而TCP/IP實際應(yīng)用時的會話管理、編碼轉(zhuǎn)換、壓縮等具體應(yīng)用經(jīng)常聯(lián)系得很緊密,很難分開。例如,HTTP協(xié)議就同時包含了連接管理和數(shù)據(jù)格式定義。
所以,當(dāng)我們在說:
四層負(fù)載均衡,是指工作在傳輸層上,基于TCP/IP協(xié)議的特性,例如IP地址、端口號等實現(xiàn)對后端服務(wù)器的負(fù)載均衡。
七層負(fù)載均衡,是指工作在應(yīng)用層上,看到的是HTTP協(xié)議,解析HTTP報文里的URI、主機(jī)名、資源類型等數(shù)據(jù),再用適當(dāng)?shù)牟呗赞D(zhuǎn)發(fā)給后端服務(wù)器。
TCP/IP協(xié)議棧的工作方式
我們可以把HTTP利用TCP/IP協(xié)議棧傳輸數(shù)據(jù),想象成一個發(fā)快遞的過程。
假設(shè)內(nèi)容:
- 假設(shè)你想把一個毛絨玩具送給朋友,但你要先拿個塑料袋套一下,這件玩具就相當(dāng)于HTTP協(xié)議里要傳輸?shù)膬?nèi)容,比如HTML,然后HTTP協(xié)議為他加一個HTTP專用附加數(shù)據(jù)。塑料袋相當(dāng)于HTTP頭。
- 你把玩具交給快遞小哥,為了保護(hù)貨物,他又加了層包裝再貼了個標(biāo)簽,相當(dāng)于TCP層給數(shù)據(jù)再次打包,加上了TCP頭。
- 接著快遞小哥下樓,把包裹放進(jìn)了三輪車?yán)铮\(yùn)到集散點,然后再裝進(jìn)更大的卡車?yán)铮喈?dāng)于IP層、MAC層對TCP數(shù)據(jù)包加上了IP頭、MAC頭
- 之后經(jīng)過漫長的運(yùn)輸,包裹到達(dá)目的地,要卸貨再放進(jìn)另一位快遞員的三輪車,就是在IP層、MAC層傳輸后拆包。
- 快遞員到了你朋友的家門口,撕掉標(biāo)簽,去除了TCP層的頭,你朋友再拆掉塑料袋包裝,也就是HTTP頭,最后就拿到了玩具,也就是真正的HTML頁面。
這個比喻里,省略了很多TCP/IP協(xié)議里的細(xì)節(jié),比如建連、路由、數(shù)據(jù)切分與重組、錯誤檢查等,但核心的數(shù)據(jù)傳輸過程是差不多的。HTTP協(xié)議的傳輸過程,就是這樣通過協(xié)議棧逐層向下,每一層都添加本層的專有數(shù)據(jù),層層打包,然后通過下層發(fā)送出去。接收則是相反的操作,從下往上穿過協(xié)議棧,逐層拆包,每層去掉本層的專有頭,上層就會拿到自己的數(shù)據(jù)。
但下層的傳輸過程對于上層完全是“透明”的,上層也不需要關(guān)系下層的具體實現(xiàn)細(xì)節(jié),所以就HTTP層次來看,它不管下層是不是TCP/IP協(xié)議,看到的只是一個可靠的傳輸鏈路,只要把數(shù)據(jù)加上自己的頭,對方就能原樣收到。

小結(jié)
- TCP/IP分為四層,核心是二層的IP和三層的TCP,HTTP在第四層;
- OSI分為七層,基本對應(yīng)TCP/IP,TCP在第四層,HTTP在第七層;
- OSI可以映射到TCP/IP,但這期間一、五、六層消失了;
- 日常交流的時候,我們通常使用OSI模型,用四層、七層等術(shù)語;
- HTTP利用TCP/IP協(xié)議棧逐層打包再拆包,實現(xiàn)了數(shù)據(jù)傳輸,但下面的細(xì)節(jié)并不可見。
辨認(rèn)四層+七層(不絕對,基于OSI):
- 凡是由操作系統(tǒng)負(fù)責(zé)處理的,就是四層或四層以下
- 否則,凡是需要由應(yīng)用程序(也就是自己寫的代碼)負(fù)責(zé)處理的,就是七層
額外
MAC地址(Media Access Control Address),也叫做局域網(wǎng)地址,可以唯一地標(biāo)識一個網(wǎng)卡,也就同時標(biāo)識了此網(wǎng)卡所屬的設(shè)備
在TCP/IP之外,還有一些協(xié)議位于OSI五層和六層的,比如,UNIX域套接字,就可以認(rèn)為是在五層
二層轉(zhuǎn)發(fā):設(shè)備工作在鏈路層,幀在經(jīng)過交換機(jī)設(shè)備時,檢查幀的頭部信息,拿到目標(biāo)mac地址,進(jìn)行本地轉(zhuǎn)發(fā)和廣播
三層路由:設(shè)備工作在ip層,報文經(jīng)過有路由功能的設(shè)備時,設(shè)備分析報文中的頭部信息,拿到ip地址,根據(jù)網(wǎng)段范圍,進(jìn)行本地轉(zhuǎn)發(fā)或選擇下一個網(wǎng)關(guān)(轉(zhuǎn)發(fā)包)
總:
首先這里的二層和三層指的都是 OSI 中的對應(yīng)的層級;
1)二層轉(zhuǎn)發(fā)就意味著是在數(shù)據(jù)鏈路層(Data Link Layer)做的轉(zhuǎn)發(fā),基于 MAC 地址,通常指的是交換機(jī);
2)三層路由意味著是在網(wǎng)絡(luò)層(Network Layer)做的轉(zhuǎn)發(fā),通常指的是路由器(當(dāng)然也有路由功能的交換機(jī));
3)當(dāng)數(shù)據(jù)傳輸?shù)骄W(wǎng)絡(luò)層,路由器會檢查目的 IP 是否與自己處于同一網(wǎng)段,是則進(jìn)行二層轉(zhuǎn)發(fā)即請求目的主機(jī)的 MAC 地址,否則進(jìn)行三層轉(zhuǎn)發(fā)即進(jìn)入路由的遞歸查找。DNS: 屬于應(yīng)用層,其本身并不負(fù)責(zé)傳輸、網(wǎng)際的實際操作,只是將域名解析為 IP,方便下一層的使用
CDN: 也應(yīng)當(dāng)屬于應(yīng)用層,類似于 DNS 他們都是針對傳輸后的數(shù)據(jù)內(nèi)容的操作,而非實際去處理傳輸?shù)炔僮鳌?/p>