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

帥地發表於2018-07-27

正文

網際網路相隔n公里路的兩臺計算機,是如何進行資料的傳送的呢?在成千上萬臺的計算機中,一臺計算機是如何正確著找到另外一個計算機,並把資料傳給它的呢?

學過計算機網路的同學可能知道,在這網際網路中,計算機與計算機之間的資料傳送,主要是基於各種“協議”串聯起來的。不過今天要講的,並不會詳細去講各種協議,而是通過各種簡化之後,讓你大概知道資料之間傳送的原理。

模型

網際網路中資料的傳送,其實分為好幾層來處理資料的,每一層有它自己明確的功能。例如就像流水線生產一樣,一部分人負責這部分的工作,處理完之後就把剩餘的工作扔給另外一部分人來處理……

對於網際網路資料傳送的分層模型,有分成七層的,有分成5層的,還有分成4層的。例如分成七層模型的如下(從上到下):

  • 應用層
  • 表示層
  • 會話層
  • 傳輸層
  • 網路層
  • 資料鏈路層
  • 物理層

    七層中,越往下越靠近計算機底層,越往上越靠近使用者。

    不過,我們今天要講的,是以分成五層的模型來講。其分層如下圖:

    相當於把應用層、表示層、會話層看成是一層的。接下來我們從下往上來一步一步講,看看如何從一臺計算機準確著傳給另一臺計算機的。

一. 物理層

一臺計算機與另一臺計算機要進行通訊,第一件要做的事是什麼?當然是要把這臺計算機與另外的其他計算機連起來啊,例如可以通過光纖啊,電纜啊,雙絞線啊等物體把他們聯起來。然後才能進行通訊,也就是說,,物理層負責把兩臺計算機連起來,然後在計算機之間傳送0,1這樣的電訊號。

二. 資料鏈路層

前面說了,物理層它只是單純著負責在計算機之間傳輸0,1這樣的電訊號。假如這些0,1組合的傳送毫無規則,計算機是解讀不了的。因此,我們需要制定一套規則來進行0,1的傳送。例如多少個電訊號為一組啊,每一組訊號應該如何標識才能讓計算機讀懂啊等。

資料鏈路層工作在物理層之上,負責給這些0,1制定傳送的規則,然後另一方再按照相應的規則來進行解讀。

1. 乙太網協議

乙太網協議規定,一組電訊號構成一個資料包,把這個資料包稱之為“楨”。每一個楨由標頭(Head)資料(Data)兩部分組成。如下:

這個楨的最大長度是1518個位元組,最小長度為64位元組。假如需要傳送的資料很大的話,就分成多個楨來進行傳送。

對於表頭資料這兩個部分,他們存放的都是一些什麼資料呢?我猜你眯著眼睛都能想到他們應該放什麼資料。 毫無疑問,我們至少得知道這個楨是誰傳送,傳送給誰的等這些資訊吧?所以標頭部分主要是一些說明資料,例如傳送者,接收者等資訊。而資料部分則是這個資料包具體的,想給接受的內容。

大家想一個問題,一個楨的長度是64~1518個位元組,也就是說楨的長度不是固定的,那你覺得標頭部分的位元組長度是固定的嗎?它當然是固定的啊,假如不是固定的,每個楨都是單獨發的,那計算機怎麼知道標頭是幾個位元組,資料是幾個位元組。所以標頭部分的位元組是固定的,並且固定為18個位元組。

2. MAC地址

把一臺計算的的資料通過物理層和鏈路層傳送給另一臺計算機,究竟是誰發給誰的,計算機與計算機之間如何區分,,你總得給他們一個唯一的標識吧?

這就是MAC地址,連入網路的每一個計算機都會有網路卡介面,每一個網路卡都會一個地址,這個地址就叫做MAC地址。計算機之間的資料傳送,就是通過MAC地址來唯一尋找、傳送的。MAC地址在網路卡生產是就被唯一標識了。

廣播與ARP協議

如圖,假如計算機A知道了計算機B的MAC地址,然後計算機A想要給計算機B傳送資料,雖然計算機A知道了計算機B的MAC地址,可是它要怎麼給它傳送資料呢?計算機A不僅連著計算機B,而且計算機A也還連著其他的計算機。 雖然計算機A知道計算機B的MAC地址,可是計算機A是無法知道計算機B是分佈在哪邊路線上的。實際上,計算機A是通過廣播的方式把資料傳送給計算機B。在同一個子網中,計算機A要向計算機B傳送一個資料包,這個資料包包含接收者的MAC地址。這個時候同一個子網中的計算機C,D也會收到這個資料包的,然後收到這個資料包的計算機,會把資料包的MAC地址取出來,與自身的MAC地址對比,如果兩者相同,則接受這個資料包,否則就丟棄這個資料包。這種傳送方式我們稱之為廣播,就像我們平時在廣場上通過廣播的形式呼叫某個人一樣。

那麼問題來了,計算機A是如何知道計算機B的MAC地址的呢?這個時候就得由ARP協議這個傢伙來解決了,不過ARP協議會涉及到IP地址,不過我們下面才會扯到IP地址。因此我們先放著,就當作是有這麼一個ARP協議,通過它我們可以知道子網中其他計算機的MAC地址。

三. 網路層

上面我們有說到子網這個關鍵詞,實際上我們所處的網路,是由無數個子網路構成的。廣播的時候,也只有同一個子網裡面的計算機能夠收到。 假如沒有子網這種劃分的話,計算機A發一個資料包給計算機B,其他所有計算機也都能收到這個資料包,然後進行對比再捨棄。世界上有那麼多它計算機,每一臺計算機都能收到其他所有計算機的資料包,那就不得了了。那還不得奔潰。 因此產生了子網這麼一個東西。

那麼問題來了,我們如何區分哪些MAC地址是屬於同一個子網的呢?假如是同一個子網,那我們就用廣播的形式把資料傳送給對方,如果不是同一個子網的,我們就會把資料發給閘道器,讓閘道器進行轉發。

為了解決這個問題我們引入了一套新的地址協議,這個地址協議能夠幫助我們區分MAC地址是否處於同一個子網中。這也是網路層負責解決的問題。

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,進而他們處於同一個子網中。

ARP協議

有了上面IP協議的知識,我們回來講一下ARP協議。
有了兩臺計算機的IP地址,我們就可以判斷出它們是否處於同一個子網之中。 假如他們處於同一個子網之中,計算機A要給計算機B傳送資料時。我們可以通過ARP協議來得到計算機B的MAC地址。ARP協議也是通過廣播的形式給同一個子網中的每臺電腦傳送一個資料包(當然,這個資料包會包含接收方的IP地址)。對方收到這個資料包之後,會取出IP地址與自身的對比,如果相同,則把自己的MAC地址回覆給對方,否則就丟棄這個資料包。這樣,計算機A就能知道計算機B的MAC地址了。

可能有人會問,知道了MAC地址之後,傳送資料是通過廣播的形式傳送,詢問對方的MAC地址也是通過廣播的形式來傳送,那其他計算機怎麼知道你是要傳送資料還是要詢問MAC地址呢?其實在詢問MAC地址的資料包中,在對方的MAC地址這一欄中,填的是一個特殊的MAC地址,其他計算機看到這個特殊的MAC地址之後,就能知道廣播想幹嘛了。

假如兩臺計算機的IP不是處於同一個子網之中,這個時候,我們就會把資料包傳送給閘道器,然後讓閘道器讓我們進行轉發傳送

DNS伺服器

這裡再說一個問題,我們是如何知道對方計算機的IP地址的呢?這個問題可能有人會覺得很白痴,心想,當然是計算機的操作者來進行輸入了。這沒錯,當我們想要訪問某個網站的時候,我們可以輸入IP來進行訪問,但是我相信絕大多數人是輸入一個網址域名的,例如訪問百度是輸入www.baidu.com這個域名。其實當我們輸入這個域名時,會有一個叫做DNS伺服器的傢伙來幫我們解析這個域名,然後返回這個域名對應的IP給我們的。

四. 傳輸層

雖然我們已經把資料成功從計算機A傳送到計算機B了,可是,計算機B裡面有各種各樣的應用程式,計算機該如何知道這些資料是給誰的呢?

這個時候,埠(Port)這個傢伙就上場了,也就是說,我們在從計算機A傳資料給計算表B的時候,還得指定一個埠,以供特定的應用程式來接受處理。
也就是說,傳輸層的功能就是建立埠到埠的通訊。相比網路層的功能是建立主機到主機的通訊。

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

應用層

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

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

因此我們需要指定這些資料的格式規則,收到後才好解讀渲染。而應用層的功能,就是用來規定應用程式的資料格式的。

五層模型至此講到這裡。對於有些層講的比較簡潔,就隨便概況了一下。如果你想詳細去了解,可以去買計算機網路相應的資料。希望我的講解能讓你對計算機之間資料的傳輸有個大概的瞭解。



​推薦閱讀:

https://juejin.im/post/5b5e97d8e51d451988562178(一文看懂https是如何保證資料傳輸的安全性的)


相關文章