一文讀懂一臺計算機是如何把資料傳送給另一臺計算機的

帥地發表於2019-03-05

前言

天各一方的兩臺計算機是如何通訊的呢?在成千上萬的計算機中,為什麼一臺計算機能夠準確著尋找到另外一臺計算機,並且把資料傳送給它呢?

可能很多人都聽說過網路通訊的 5 層模型,但是可能並不是很清楚為什麼需要五層模型,五層模型負責的任務也有可能經常混淆。下面是網路通訊的五層模型

一文讀懂一臺計算機是如何把資料傳送給另一臺計算機的

說實話,五層模型的具體內容還是極其複雜的,不過今天這篇文章,我將用最簡潔的模式,通過網路通訊的五層模型來講解一臺計算機是如何找到另外一臺計算機並且把資料傳送給另一臺計算機的,就算你沒學過計算機網路,也能夠聽的懂。

1. 物理層

一臺計算機與另一臺計算機要進行通訊,第一件要做的事是什麼?當然是要把這臺計算機與另外的其他計算機連起來啊,這樣,我們才能把資料傳輸過去。例如可以通過光纖啊,電纜啊,雙絞線啊等介質把他們連線起來,然後才能進行通訊。

一文讀懂一臺計算機是如何把資料傳送給另一臺計算機的

也就是說,物理層負責把兩臺計算機連起來,然後在計算機之間通過高低電頻來傳送0,1這樣的電訊號。

2. 資料鏈路層

前面說了,物理層它只是單純著負責把計算機連線起來,並且在計算機之間傳輸0,1這樣的電訊號。如果這些0,1組合的傳送毫無規則的話,計算機是解讀不了的。一大堆0,1誰知道是什麼鬼啊。

一文讀懂一臺計算機是如何把資料傳送給另一臺計算機的

因此,我們需要制定一套規則來進行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 地址。

3. 網路層

上面我們有說到子網這個關鍵詞,實際上我們所處的網路,是由無數個子網路構成的。廣播的時候,也只有同一個子網裡面的計算機能夠收到。

假如沒有子網這種劃分的話,計算機 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給我們的。

因此,網路層的功能就是讓我們在茫茫人海中,能夠找到另一臺計算機在哪裡,是否屬於同一個子網等。

4. 傳輸層

通過物理層、資料鏈路層以及網路層的互相幫助,我們已經把資料成功從計算機A傳送到計算機B了,可是,計算機B裡面有各種各樣的應用程式,計算機該如何知道這些資料是給誰的呢?

這個時候,埠(Port)這個傢伙就上場了,也就是說,我們在從計算機A傳資料給計算表B的時候,還得指定一個埠,以供特定的應用程式來接受處理。

也就是說,傳輸層的功能就是建立埠到埠的通訊。相比網路層的功能是建立主機到主機的通訊。

也就是說,只有有了IP和埠,我們才能進行準確著通訊。這個時候可能有人會說,我輸入IP地址的時候並沒有指定一個埠啊。其實呢,對於有些傳輸協議,已經有設定了一些預設埠了。例如http的傳輸預設埠是80,這些埠資訊也會包含在資料包裡的。

傳輸層最常見的兩大協議是 TCP 協議和 UDP 協議,其中 TCP 協議與 UDP 最大的不同就是 TCP 提供可靠的傳輸,而 UDP 提供的是不可靠傳輸。

5. 應用層

終於說到應用層了,應用層這一層最接近我們使用者了。

雖然我們收到了傳輸層傳來的資料,可是這些傳過來的資料五花八門,有html格式的,有mp4格式的,各種各樣。你確定你能看的懂?

因此我們需要指定這些資料的格式規則,收到後才好解讀渲染。例如我們最常見的 Http 資料包中,就會指定該資料包是 什麼格式的檔案了。

總結

五層模型至此講到這裡。對於有些層講的比較簡潔,就隨便概況了一下。因為如果我說的詳細一點的話,篇幅肯定會特別特別長,我著已經是盡最大的努力以最簡潔的方式來講的了。如果你想詳細去了解,可以去買計算機網路相應的資料,強烈推薦《計算機網路:自頂向下》這本書。希望我的講解能讓你對計算機之間資料的傳輸有個大概的瞭解。

最後推廣下我的公眾號:苦逼的碼農,文章都會首發於我的公眾號,期待各路英雄的關注交流。

相關文章