TCP/IP四層網絡模型和OSI七層網絡模型

首先要說一下,四層模型和七層模型,我們往往是可以一塊兒來聊的。

1、首先我問要明白,爲啥要有協議

設想一下,各個電腦廠商,比如IBM、蘋果啥的,都弄自己的協議,結果就蘋果電腦和蘋果電腦自己可以通信,和IBM電腦就不可以通信,這不是尷尬麼。所以搞一個國際通行的協議,大家都按照這個來,所有電腦都可以通信,不是很好麼。

此時就必須搞一個標準的網絡模型出來,大家都按照這個來走,大家都要遵守統一的規範。這就是所謂OSI七層模型,他們分別是:應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層。那麼在這個基礎上,又簡化出了TCP/IP四層模型,數據鏈路層、網絡層、傳輸層、應用層。

那麼每一層代表的是啥,我一一給大家講解

2、從底向上的網絡分層

2.1、物理層

物理層,物理層幹啥的,就是電腦之間要聯網,一般咋弄?類似於說,你有臺電腦,現在要聯網,咋聯?以前N年前,大家記不記得都是在電腦上插根線是吧,然後才能上網,結果現在就是聯個wifi就行了,還有中國美國之前聯網靠的是海底的光纜。所以物理層就指的這個,就是怎麼把各個電腦給聯結起來,形成一個網絡,這就是物理層的含義,物理層負責傳輸0和1的電路信號。學過一些計算機的同學,計算機的最最底層,就是0/1,電信號。如下圖:
在這裏插入圖片描述

2.2、數據鏈路層

數據鏈路層,物理層給各個電腦連接起來了,還傳輸最底層的0和1電路信號,關鍵不行啊,你得定義清楚哪些0和1分爲一組,這些信號啥意思?這才能進行通信。所以數據鏈路層就幹這事兒,定義一下電路信號咋分組。

00000011(從電腦1出發,要到電腦2去)

00101(從電腦1出發,要到電腦3去)

0101(從電腦2觸發,要到電腦4去)

01(從電腦3出發,要到電腦5去)

很多年前,每個公司都定義自己的電路信號分組方式,但是後來出來了以太網協議,以太網。一組電信號是一個數據包,叫一個幀(frame),每個幀分成兩個部分,標頭(head)和數據(data),標頭包含一些說明性的東西,比如說發送者、接收者和數據類型之類的。

每臺電腦要往另外一臺電腦發送數據,一堆0/1電路信號,封裝成數據包,包含頭和數據,頭裏包含了從哪兒來到哪兒去,必須從一臺電腦的一個網卡,發送到另外一個電腦的一個網卡,所以以太網發送的數據包必須得指定,目標電腦的網卡的mac地址。

以太網規定了,每個網卡必須得包含一個mac地址,mac地址就是這個網卡的唯一標識,以太網協議規定了,接入網絡裏的所有設備,都得有個網卡,以太網協議裏的那個數據包,在數據鏈路層傳輸的數據包,必須從一個電腦的網卡傳輸到另外一個電腦的網卡,而這個網卡地址就叫做所謂的mac地址。每塊網卡出廠的時候,就有一個唯一的mac地址,48位的二進制,但是一般用12個16進制數字表示,前6個16進制是廠商編號,後6個16進制是網卡流水號。

windows上,ipconfig /all,看看物理地址,就是mac地址,7C-67-A2-20-AB-5C

所以在以太網裏傳輸數據包的時候,必須指定接收者的mac地址才能傳輸數據。

但是以太網的數據包怎麼從一個mac地址發送到另一個mac地址?這個不是精準推送的,以太網裏面,如果一個電腦發個數據包出去,會廣播給局域網內的所有電腦設備的網卡,然後每臺電腦都從數據包裏獲取接收者的mac地址,跟自己的mac地址對比一下,如果一樣,就說明這是發給自己的數據包。

但是上面這種廣播的方式,僅僅針對一個子網(局域網)內的電腦,會廣播,否則一個電腦不能廣播數據包給全世界所有的其他電腦吧,是僅僅廣播給一個子網裏面的電腦的。
如下圖:

在這裏插入圖片描述

2.3、網絡層

上面說到,子網內的電腦,通過以太網發個數據包,對局域網內的電腦,是廣播出去的。那麼怎麼知道哪些電腦在一個子網內呢?這就得靠網絡層了,這裏就有一套IP地址,IP地址就可以讓我們區分哪些電腦是一個子網的。

網絡層裏有IP協議,IP協議定義的地址就叫做IP地址。IP地址有IPv4和IPv6兩個版本,目前廣泛使用的是IPv4,是32個二進制數字組成的,但是一般用4個十進制數字表示,範圍從0.0.0.0到255.255.255.255之間。

每臺計算機,都會分配一個ip地址,ip地址的前24位(就是前面3個十進制數字),代表了網絡,後8位(就是最後1個十進制數字),代表了主機。

如果幾臺電腦是一個子網的,那麼前面的3個十進制數字一定是一樣的。舉個例子,大家平時做實驗,玩兒虛擬機吧,自己win上開幾個linux虛擬機,你會發現,win上的ip地址可能是192.168.0.103,然後幾個虛擬機的ip地址是192.168.0.182,192.168.0.125,192.168.0.106,類似這樣的。

這個win機器和幾個虛擬機,前面3個十進制數字都是192.168.0,就代表大家是一個子網內的,最後那個數字是這個子網的不同主機的編號。

但是實際上上面就是舉個例子,其實單單從ip地址是看不出來哪些機器是一個子網的,因爲從10進制是判斷不出來的。需要通過ip地址的二進制來判斷,結合一個概念來判斷,叫做子網掩碼。

比如說ip地址是192.168.56.1,子網掩碼是255.255.255.0。知道了子網掩碼之後,如果要判斷兩個ip地址是不是一個子網的,就分別把兩個ip地址和自己的子網掩碼進行二進制的與運算,與運算之後,比較一下代表網絡的那部分。

192.168.56.1和192.168.32.7,判斷是不是一個子網的,拿子網掩碼255.255.255.0,跟兩個ip地址的二進制做與運算

11000000.10101000.00111000.00000001
11111111.11111111.11111111.00000000

子網掩碼的二進制是:11111111.11111111.11111111.00000000,然後就跟ip地址的二進制做與好了,通過二進制來比較網絡部分的地址是不是一模一樣的。

有了網絡層的ip地址之後,兩臺在子網內的電腦終於可以通過廣播+mac地址判斷來傳輸數據包進行通信了。

但是如果發現要接受數據包的計算機不在子網內,那麼就不能通過廣播來發送數據包,需要通過路由來發送數據包。

看到路由,就想到了路由器了,對了,路由器大家都熟悉吧,自己平時也會去買對吧,比如小米的路由器啥的,家裏上網一般都會弄個路由器對吧,ok。路由器負責將多個子網進行連接,因爲比如你在自己家裏,其實你就只是你自己的一個子網,你要是訪問網站啥的,是跟那個網站機器所在的子網進行通信。

每個電腦都可以搞多個網卡的,不是隻有一個網卡,一般筆記本電腦都有以太網網卡和wifi網卡,發送數據包的時候要決定走哪個網卡。路由器,其實就是配置了多個網卡的一個專用設備,可以通過不同的網卡接入不同的網絡。

網關其實是就是路由器的一種,運作在網絡層,這個概念不多解釋了,大家可以就把路由器上的ip地址認爲是網關,路由器上每個網卡都有mac地址和對應的ip地址。路由器雖然有mac地址,但是不能通過mac地址尋址的,必須通過ip地址尋址,所以路由器其實是工作在網絡層的設備。

網絡交換機,也是一種設備,是工作在數據鏈路層的,路由器是工作在網路層的。

網絡交換機是通過mac地址來尋址和傳輸數據包的;但是路由器是通過ip地址尋址和傳輸數據包的。網絡交換機主要用在局域網的通信,一般你架設一個局域網,裏面的電腦通信是通過數據鏈路層發送數據包,通過mac地址來廣播的,廣播的時候就是通過網絡交換機這個設備來把數據廣播到局域網內的其他機器上去的;路由器一般用來讓你連入英特網。

LAN,就是local area network,就是局域網;WAN,就是wide area network,就是廣域網。WLAN是wireless local area network,就是無線局域網,也就是wifi,在局域網內,直接通過wifi無線聯網。

家裏的路由器是包含了交換機和路由的兩個功能的,如果是連接到局域網內的設備就把線插LAN那兒;如果是連接到英特網,就把線插在WAN那兒。

這兒給大家舉個例子,就是兩個局域網之間,如果要是通過一個路由器進行通信的話,是怎麼弄的。

大概過程就是,路由器配置了兩塊網卡,每個網卡可以連到一個局域網內。

局域網1內的電腦,要發送數據包到局域網2內的電腦,在數據包裏寫上自己的ip地址和對方的ip地址。但是他們倆不在一個局域網內,於是局域網1內的電腦,先通過交換機將數據包發送給路由器,這個過程需要將路由器的一塊網卡的ip地址對應的mac地址寫到數據包的頭部,然後才能通過交換機廣播出去,路由器接收到之後比較自己一塊網卡的mac地址,就知道是來找自己的。

接着路由器接收到數據包之後,就會在局域網2內,將目標機器的ip地址對應的mac地址寫入頭部,接着再次通過交換機發送廣播通知,發送給局域網2內的電腦。

一個局域網內的每臺機器都有自己的ARP cache,這個ARP就是用來在一個局域網內讓各個設備都知道每個設備的ip地址和mac地址的對應關係的,一般就是某個機器發送廣播通知自己的ip地址和mac地址的對應關係,然後每個機器給他一個迴應。以此類推,大家都互相這樣廣播一把,ip地址和mac地址的對應關係,大家不就都知道了嗎?

所以大家在上面可以看到,一個子網內的機器之間通信,就是在數據包裏寫上對方的mac地址,然後交換機廣播出去ok了;但是如果是跨子網的通信,就是寫上對方的ip地址,然後先通過mac地址廣播到路由器,讓路由器再根據另外一個子網的ip地址轉換爲mac地址,通過另外一個子網的交換機廣播過去。就這個意思。
如圖:
在這裏插入圖片描述

2.4、傳輸層

上面我們大概明白了通過網絡層的ip地址怎麼劃分出來一個一個的子網,然後在子網內部怎麼通過mac地址廣播通信;跨子網的時候,怎麼通過ip地址 -> mac地址 -> 交換機 -> 路由器 -> ip地址 -> mac地址 -> 交換機的方式來通過路由器進行通信。

但是這裏還有一個問題,就是一臺機器上,是很多個程序用一個網卡進行網絡通信的,比如說瀏覽器、QQ、視頻直播,這些軟件都用了一個網卡往外面發送數據,然後從網卡接收數據,對吧。

所以還需要一個端口號的概念,就是你得發送數據包到某個機器的一個網卡的某個端口上去,然後那個機器上監聽那個端口的程序,就可以提取發送到這個端口的數據,知道是自己的數據。端口號是065536的範圍內,01023被系統佔用了,別的應用程序就用1024以上的端口就ok了。

電腦1,是在端口48362監聽的,通過網卡發送了一條數據 -> 電腦2的ip地址的20386這個端口 -> 電腦2的上面的某個QQ,監聽着20386的端口 -> 電腦2的網卡接收到一條數據之後,發現人家找的是20386這個端口,就去找誰哪個哥兒們在監聽20386端口,QQ在監聽,我就把這個網卡過來的數據,傳遞給QQ,通過端口知道,哪條數據是給你的

所以其實大家會發現一點,網絡層,是基於ip協議,進行主機和主機間的尋址和通信的,然後傳輸層,其實是建立某個主機的某個端口,到另外一個主機的某個端口的連接和通信的。

這個通信,就是通過socket來實現的,通過socket就可以基於tcp/ip協議完成剛纔上面說的一系列的比如基於ip地址和mac地址轉換和尋址啊,通過路由器通信啊之類的,而且會建立一個端口到另外一個端口的連接。

udp和tcp都是傳輸層的協議,作用就是在數據包里加入端口號,可以通過端口號進行點對點的通信了。udp協議是不可靠的,發出去人家收到沒有就不知道了;tcp協議是可靠的,要求三次握手,而且要求人家接收到數據必須回覆你。

傳輸層的tcp協議,僅僅只是規定了一套基於端口的點對點的通信協議,包括如何建立連接,如何發送和讀取消息,但是實際上如果你要基於tcp協議來開發,你一般是用socket,java socket網絡編程, 如下圖:

在這裏插入圖片描述

2.5、應用層

通過傳輸層的tcp協議可以傳輸數據,但是人家收到數據之後,怎麼來解釋?比如說收到個郵件你怎麼處理?收到個網頁你怎麼處理?類似這個意思,所以針對各種不同的應用,郵件、網頁之類的,都是定義不同的應用層協議的。這個應用層,我們就假設綜合了會話層、表示層和應用層了,3層合成1層。

電腦1走tcp協議發送了一段東西過來,發送到電腦2的20386端口

GET http://localhost:8080/ http/1.1

key:valuel
key:value

電腦2走tcp協議讀取到了屬於自己這個20386端口 的一段數據

GET http://localhost:8080/ http/1.1

key:valuel
key:value

發送了一段響應

200

key;value
key:value

又通過底層的tcp發了出去,電腦1的30987端口,ip

電腦1,網卡,走以太網協議收到一個數據包

200

key;value
key:value

比如最常見的,應用層的協議就是http協議,進行網絡通信。

然後我們看下自己的網絡設置,一般包含了ip地址、子網掩碼、網關地址、DNS地址。前面3個我們其實都知道啥意思了。ip地址和子網掩碼用來劃分子網的,判斷哪些ip地址在一個子網內。同時你的ip地址和mac地址關聯起來的,唯一定位了你的網卡。網關地址,你就認爲是路由器上的那個網卡的ip地址吧,路由器的網卡也有mac地址,mac地址對應了一個ip地址。

DNS地址是啥呢?Domain Name System。因爲我們一般定位是通過ip地址+mac地址+端口號來定位一個通信目標的,但是如果在瀏覽器上輸入一個www.baidu.com,咋整?這個時候是先把www.baidu.com發給DNS服務器,然後DNS服務器告訴你www.baidu.com對應的ip地址的。

3、瀏覽器請求 www.baidu.com 時,背後都幹了些啥

如果你閱讀過昨天發佈文章,就應該知道網絡七層模型大概都是怎麼回事了,然後四層模型其實就是會話層、表示層和應用層,合併爲了一個應用層,同時沒把物理層算在內

並且我們也大概知道每一層的協議和作用,網絡通信的時候都是怎麼回事了,現在我們來看看假設通過瀏覽器發送一個請求,你訪問到那個網站對應的機器,然後人家再給你一個響應的全過程。

現在我們先假設,我們給電腦設置了幾個東西:

ip地址:192.168.31.37
子網掩碼:255.255.255.0
網關地址:192.168.31.1
DNS地址:8.8.8.8

這時,我們打開一個瀏覽器,請求www.baidu.com地址,這個時候找DNS服務器,DNS服務器解析域名之後,返回一個ip地址,比如172.194.26.108。

接着會判斷兩個ip地址是不是一個子網的,用子網掩碼255.255.255.0,對兩個ip地址做與運算,拿到192.168.31.0和172.194.26.0,明顯不是一個子網的。

如圖:
在這裏插入圖片描述
那就得發送一個數據包給網關,其實你就認爲是我們的路由器吧,就是192.168.31.1,而且我們是可以拿到網關ip地址的mac地址的,現在我們從應用層出發,通過瀏覽器訪問一個網站,是走應用層的http協議的,並且要把瀏覽器發出的請求打包成數據包,要把哪些東西給放到數據包中去呢?

http協議分爲幾個部分:
請求方法+URL地址+http版本

比如
GEThttp://172.194.26.108/testHTTP/1.1,類似這種請求頭,類似下面這種:
Host:upload.jiangsu.io
Proxy-Connection:keep-alive
User-Agent:Mozilla/5.0
等等。。。

請求體,比如常見的可以放一個json這就構成了一個http請求報文瀏覽器請求一個地址,先按照應用層的http協議,封裝一個應用層數據包,數據包裏就放了http請求報文,這個時候會將這個http請求報文打包成一個數據包,僅僅只是數據包的數據部分,此時是數據包是沒有頭的。上面根據http協議搞一個http請求報文,然後搞一個數據包出來,就是網絡模型中到的應用層乾的事兒了。

接着就是跑傳輸層來了,這個層是tcp協議,這個tcp協議會讓你設置端口,發送方的端口隨機選一個,接收方的端口一般是默認的80端口。

這個時候,會把應用層數據包給封裝到tcp數據包中去,而且會加一個tcp頭,這個tcp數據包是對應一個tcp頭的,這個tcp頭裏就放了端口號信息。如圖:

在這裏插入圖片描述

接着跑到網絡層來了,走ip協議,這個時候會把tcp頭和tcp數據包,放到ip數據包裏去,然後再搞一個ip頭,ip頭裏本機和目標機器的ip地址。

這裏本機ip地址是192.168.31.37,
目標機器是172.194.26.108。

因爲,通過ip協議,可以判斷說,兩個ip地址不是在一個子網內的,所以此時只能將數據包先通過以太網協議廣播到網關上去,通過網關再給他發送出去,如圖:

在這裏插入圖片描述
接着是數據鏈路層,這塊走以太網協議,這裏是把ip頭和ip數據包封到以太網數據包裏去,然後再加一個以太網數據包的頭,頭裏放了本機網卡mac地址,和網關的mac地址。但是以太網數據包的限制是1500個字節,但是假設這個時候ip數據包都5000個字節了,那麼需要將ip數據包切割一下。

這個時候一個以太網數據包要切割爲4個數據包,每個數據包包含了以太網頭、ip頭和切割後的ip數據包,4個數據包的大小分別是1500,1500,1500,560。ip頭裏包含了每個數據包的序號。
如圖:
在這裏插入圖片描述
這4個以太網數據包都會通過交換機發到你的網關上,然後你的路由器是可以聯通別的子網的,這個是時候你的路由器就會轉發到別的子網的可能也是某個路由器裏去,然後以此類推吧,N多個路由器或者你叫網關也行,N多個網關轉發之後,就會跑到百度的某臺服務器,接收到4個以太網數據包。

百度服務器接收到4個以太網數據包以後,根據ip頭的序號,把4個以太網數據包裏的ip數據包給拼起來,就還原成一個完整的ip數據包了。接着就從ip數據包裏面拿出來tcp數據包,再從tcp數據包裏取出來http數據包,讀取出來http數據包裏的各種協議內容,接着就是做一些處理,然後再把響應結果封裝成htp響應報文,封裝在http數據包裏,再一樣的過程,封裝tcp數據包,封裝ip數據包,封裝以太網數據包,接着通過網關給發回去。

如下圖:
在這裏插入圖片描述
面試 HTTP ,99% 的面試官都愛問這些問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章