還在被人一句話「你知道傳輸協議嗎」問道無語嗎?html
天各一方的兩臺計算機是如何通訊的呢?數組
在成千上萬的計算機中,爲何一臺計算機可以準確着尋找到另一臺計算機,而且把數據發送給它呢?服務器
可能不少人都據說過網絡通訊的 5 層模型,可是可能並非很清楚爲何須要五層模型,五層模型負責的任務也有可能常常混淆。下面是網絡通訊的五層模型網絡
說實話,五層模型的具體內容仍是極其複雜的,不過今天這篇文章,我將用最簡潔的模式,經過網絡通訊的五層模型來說解一臺計算機是如何找到另一臺計算機而且把數據發送給另外一臺計算機的,就算你沒學過計算機網絡,也可以聽的懂。網站
一臺計算機與另外一臺計算機要進行通訊,第一件要作的事是什麼?固然是要把這臺計算機與另外的其餘計算機連起來啊,這樣,咱們才能把數據傳輸過去。例如能夠經過光纖啊,電纜啊,雙絞線啊等介質把他們鏈接起來,而後才能進行通訊。計算機網絡
也就是說,物理層負責把兩臺計算機連起來,而後在計算機之間經過高低電頻來傳送0,1這樣的電信號。htm
前面說了,物理層它只是單純着負責把計算機鏈接起來,而且在計算機之間傳輸0,1這樣的電信號。若是這些0,1組合的傳送毫無規則的話,計算機是解讀不了的。一大堆0,1誰知道是什麼鬼啊。blog
所以,咱們須要制定一套規則來進行0,1的傳送。例如多少個電信號爲一組啊,每一組信號應該如何標識才能讓計算機讀懂啊等等。接口
因而,有了以太網協議。域名
1. 以太網協議
以太網協議規定,一組電信號構成一個數據包,咱們把這個數據包稱之爲幀。每個楨由標頭(Head)和數據(Data)兩部分組成。
幀的大小通常爲 64 - 1518 個字節。假如須要傳送的數據很大的話,就分紅多個楨來進行傳送。
對於表頭和數據這兩個部分,他們存放的都是一些什麼數據呢?我猜你眯着眼睛都能想到他們應該放什麼數據。 毫無疑問,咱們至少得知道這個楨是誰發送,發送給誰的等這些信息吧?因此標頭部分主要是一些說明數據,例如發送者,接收者等信息。而數據部分則是這個數據包具體的,想給接守者的內容。
你們想一個問題,一個楨的長度是 64~1518 個字節,也就是說楨的長度不是固定的,那你以爲標頭部分的字節長度是固定的嗎?它固然是固定的啊,假如不是固定的,每一個楨都是單獨發的,那計算機怎麼知道標頭是幾個字節,數據是幾個字節呢。因此標頭部分的字節是固定的,而且固定爲18個字節。
把一臺計算的的數據經過物理層和鏈路層發送給另外一臺計算機,到底是誰發給誰的,計算機與計算機之間如何區分,,你總得給他們一個惟一的標識吧?
因而,MAC 地址出現了。
2. MAC 地址
連入網絡的每個計算機都會有網卡接口,每個網卡都會有一個惟一的地址,這個地址就叫作 MAC 地址。計算機之間的數據傳送,就是經過 MAC 地址來惟一尋找、傳送的。
MAC地址 由 48 個字節所構成,在網卡生產時就被惟一標識了。
3. 廣播與ARP協議
(1). 廣播
如圖,假如計算機 A 知道了計算機 B 的 MAC 地址,而後計算機 A 想要給計算機 B 傳送數據,雖然計算機 A 知道了計算機 B 的 MAC 地址,但是它要怎麼給它傳送數據呢?計算機 A 不只連着計算機 B,並且計算機 A 也還連着其餘的計算機。 雖然計算機 A 知道計算機 B 的 MAC 地址,但是計算機 A 殊不知道知道計算機 B 是分佈在哪邊路線上,爲了解決這個問題,因而,有了廣播的出現。
在同一個子網中,計算機 A 要向計算機 B 發送一個數據包,這個數據包會包含接收者的 MAC 地址。當發送時,計算機 A 是經過廣播的方式發送的,這時同一個子網中的計算機 C, D 也會收到這個數據包的,而後收到這個數據包的計算機,會把數據包的 MAC 地址取出來,與自身的 MAC 地址對比,若是二者相同,則接受這個數據包,不然就丟棄這個數據包。這種發送方式咱們稱之爲廣播,就像咱們平時在廣場上經過廣播的形式呼叫某我的同樣,若是這個名字是你,你就理會一下,若是不是你,你就看成聽不見。
(2). ARP 協議。
那麼問題來了,計算機 A 是如何知道計算機 B 的 MAC 地址的呢?這個時候就得由 ARP 協議這個傢伙來解決了,不過 ARP 協議會涉及到IP地址,咱們下面纔會扯到IP地址。所以咱們先放着,就看成是有這麼一個 ARP 協議,經過它咱們能夠知道子網中其餘計算機的 MAC 地址。
上面咱們有說到子網這個關鍵詞,實際上咱們所處的網絡,是由無數個子網絡構成的。廣播的時候,也只有同一個子網裏面的計算機可以收到。
假如沒有子網這種劃分的話,計算機 A 經過廣播的方式發一個數據包給計算機 B , 其餘全部計算機也都能收到這個數據包,而後進行對比再捨棄。世界上有那麼多它計算機,每一臺計算機都能收到其餘全部計算機的數據包,那就不得了了。那還不得奔潰。 所以產生了子網這麼一個東西。
那麼問題來了,咱們如何區分哪些 MAC 地址是屬於同一個子網的呢?假如是同一個子網,那咱們就用廣播的形式把數據傳送給對方,若是不是同一個子網的,咱們就會把數據發給網關,讓網關進行轉發。
爲了解決這個問題,因而,有了 IP 協議。
1. IP協議
IP協議,它所定義的地址,咱們稱之爲IP地址。IP協議有兩種版本,一種是 IPv4,另外一種是 IPv6。不過咱們目前大多數用的仍是 IPv4,咱們如今也只討論 IPv4 這個版本的協議。
這個 IP 地址由 32 位的二進制數組成,咱們通常把它分紅4段的十進制表示,地址範圍爲0.0.0.0~255.255.255.255。
每一臺想要聯網的計算機都會有一個IP地址。這個IP地址被分爲兩部分,前面一部分表明網絡部分,後面一部分表明主機部分。而且網絡部分和主機部分所佔用的二進制位數是不固定的。
假如兩臺計算機的網絡部分是如出一轍的,咱們就說這兩臺計算機是處於同一個子網中。例如 192.168.43.1 和 192.168.43.2, 假如這兩個 IP 地址的網絡部分爲 24 位,主機部分爲 8 位。那麼他們的網絡部分都爲 192.168.43,因此他們處於同一個子網中。
但是問題來了,你怎麼知道網絡部分是佔幾位,主機部分又是佔幾位呢?也就是說,單單從兩臺計算機的IP地址,咱們是沒法判斷他們的是否處於同一個子網中的。
這就引伸出了另外一個關鍵詞————子網掩碼。子網掩碼和IP地址同樣也是 32 位二進制數,不過它的網絡部分規定所有爲 1,主機部分規定所有爲 0.也就是說,假如上面那兩個IP地址的網絡部分爲 24 位,主機部分爲 8 位的話,那他們的子網掩碼都爲 11111111.11111111.11111111.00000000,即255.255.255.0。
那有了子網掩碼,如何來判端IP地址是否處於同一個子網中呢。顯然,知道了子網掩碼,至關於咱們知道了網絡部分是幾位,主機部分是幾位。咱們只須要把 IP 地址與它的子網掩碼作與(and)運算,而後把各自的結果進行比較就好了,若是比較的結果相同,則表明是同一個子網,不然不是同一個子網。
例如,192.168.43.1和192.168.43.2的子碼掩碼都爲255.255.255.0,把IP與子碼掩碼相與,能夠獲得他們都爲192.168.43.0,進而他們處於同一個子網中。
2. ARP協議
有了上面IP協議的知識,咱們回來說一下ARP協議。
有了兩臺計算機的IP地址與子網掩碼,咱們就能夠判斷出它們是否處於同一個子網之中了。
假如他們處於同一個子網之中,計算機A要給計算機B發送數據時。咱們能夠經過ARP協議來獲得計算機B的MAC地址。
ARP協議也是經過廣播的形式給同一個子網中的每臺電腦發送一個數據包(固然,這個數據包會包含接收方的IP地址)。對方收到這個數據包以後,會取出IP地址與自身的對比,若是相同,則把本身的MAC地址回覆給對方,不然就丟棄這個數據包。這樣,計算機A就能知道計算機B的MAC地址了。
可能有人會問,知道了MAC地址以後,發送數據是經過廣播的形式發送,詢問對方的MAC地址也是經過廣播的形式來發送,那其餘計算機怎麼知道你是要傳送數據仍是要詢問MAC地址呢?其實在詢問MAC地址的數據包中,在對方的MAC地址這一欄中,填的是一個特殊的MAC地址,其餘計算機看到這個特殊的MAC地址以後,就能知道廣播想幹嗎了。
假如兩臺計算機的IP不是處於同一個子網之中,這個時候,咱們就會把數據包發送給網關,而後讓網關讓咱們進行轉發傳送
3. DNS服務器
這裏再說一個問題,咱們是如何知道對方計算機的IP地址的呢?這個問題可能有人會以爲很白癡,心想,固然是計算機的操做者來進行輸入了。這沒錯,當咱們想要訪問某個網站的時候,咱們能夠輸入IP來進行訪問,可是我相信絕大多數人是輸入一個網址域名的,例如訪問百度是輸入 www.baidu.com 這個域名。其實當咱們輸入這個域名時,會有一個叫作DNS服務器的傢伙來幫咱們解析這個域名,而後返回這個域名對應的IP給咱們的。
所以,網絡層的功能就是讓咱們在茫茫人海中,可以找到另外一臺計算機在哪裏,是否屬於同一個子網等。
經過物理層、數據鏈路層以及網絡層的互相幫助,咱們已經把數據成功從計算機A傳送到計算機B了,但是,計算機B裏面有各類各樣的應用程序,計算機該如何知道這些數據是給誰的呢?
這個時候,端口(Port)這個傢伙就上場了,也就是說,咱們在從計算機A傳數據給計算表B的時候,還得指定一個端口,以供特定的應用程序來接受處理。
也就是說,傳輸層的功能就是創建端口到端口的通訊。相比網絡層的功能是創建主機到主機的通訊。
也就是說,只有有了IP和端口,咱們才能進行準確着通訊。這個時候可能有人會說,我輸入IP地址的時候並無指定一個端口啊。其實呢,對於有些傳輸協議,已經有設定了一些默認端口了。例如http的傳輸默認端口是80,這些端口信息也會包含在數據包裏的。
傳輸層最多見的兩大協議是 TCP 協議和 UDP 協議,其中 TCP 協議與 UDP 最大的不一樣就是 TCP 提供可靠的傳輸,而 UDP 提供的是不可靠傳輸。
終於說到應用層了,應用層這一層最接近咱們用戶了。
雖然咱們收到了傳輸層傳來的數據,但是這些傳過來的數據五花八門,有html格式的,有mp4格式的,各類各樣。你肯定你能看的懂?
所以咱們須要指定這些數據的格式規則,收到後纔好解讀渲染。例如咱們最多見的 Http 數據包中,就會指定該數據包是 什麼格式的文件了。