前言
天各一方的兩台計算機是如何通信的呢?在成千上萬的計算機中,為什么一台計算機能夠准確着尋找到另外一台計算機,並且把數據發送給它呢?
可能很多人都聽說過網絡通信的 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 數據包中,就會指定該數據包是 什么格式的文件了。
總結
五層模型至此講到這里。對於有些層講的比較簡潔,就隨便概況了一下。因為如果我說的詳細一點的話,篇幅肯定會特別特別長,我着已經是盡最大的努力以最簡潔的方式來講的了。如果你想詳細去了解,可以去買計算機網絡相應的資料,強烈推薦《計算機網絡:自頂向下》這本書。希望我的講解能讓你對計算機之間數據的傳輸有個大概的了解。
兄dei,如果覺得我寫的不錯,不妨
1、關注我的原創微信公眾號「帥地玩編程」,每天准時推送干貨技術文章,專注於寫算法 + 計算機基礎知識(計算機網絡+ 操作系統+數據庫+Linux),聽說關注了的不優秀也會變得優秀哦。
2、給俺點個贊唄,可以讓更多的人看到這篇文章,順便激勵下我,嘻嘻。