兩臺計算機是如何“勾搭”在一起的?
天各一方的兩臺計算機是如何通信的呢?在成千上萬的計算機中,為什么一臺計算機能夠準確著尋找到另外一臺計算機,并且把數(shù)據(jù)發(fā)送給它呢?
可能很多人都聽說過網(wǎng)絡(luò)通信的 5 層模型,但是可能并不是很清楚為什么需要五層模型,五層模型負責的任務(wù)也有可能經(jīng)常混淆。下面是網(wǎng)絡(luò)通信的五層模型

說實話,五層模型的具體內(nèi)容還是極其復雜的,不過今天這篇文章,我將用最簡潔的模式,通過網(wǎng)絡(luò)通信的五層模型來講解一臺計算機是如何找到另外一臺計算機并且把數(shù)據(jù)發(fā)送給另一臺計算機的,就算你沒學過計算機網(wǎng)絡(luò),也能夠聽的懂。
1. 物理層
一臺計算機與另一臺計算機要進行通信,第一件要做的事是什么?當然是要把這臺計算機與另外的其他計算機連起來啊,這樣,我們才能把數(shù)據(jù)傳輸過去。例如可以通過光纖啊,電纜啊,雙絞線啊等介質(zhì)把他們連接起來,然后才能進行通信。

也就是說,物理層負責把兩臺計算機連起來,然后在計算機之間通過高低電頻來傳送0,1這樣的電信號。
2. 數(shù)據(jù)鏈路層
前面說了,物理層它只是單純著負責把計算機連接起來,并且在計算機之間傳輸0,1這樣的電信號。如果這些0,1組合的傳送毫無規(guī)則的話,計算機是解讀不了的。一大堆0,1誰知道是什么鬼啊。

因此,我們需要制定一套規(guī)則來進行0,1的傳送。例如多少個電信號為一組啊,每一組信號應該如何標識才能讓計算機讀懂啊等等。
于是,有了以太網(wǎng)協(xié)議。
1. 以太網(wǎng)協(xié)議
以太網(wǎng)協(xié)議規(guī)定,一組電信號構(gòu)成一個數(shù)據(jù)包,我們把這個數(shù)據(jù)包稱之為幀。每一個楨由標頭(Head)和數(shù)據(jù)(Data)兩部分組成。

幀的大小一般為 64 - 1518 個字節(jié)。假如需要傳送的數(shù)據(jù)很大的話,就分成多個楨來進行傳送。
對于表頭和數(shù)據(jù)這兩個部分,他們存放的都是一些什么數(shù)據(jù)呢?我猜你瞇著眼睛都能想到他們應該放什么數(shù)據(jù)。 毫無疑問,我們至少得知道這個楨是誰發(fā)送,發(fā)送給誰的等這些信息吧?所以標頭部分主要是一些說明數(shù)據(jù),例如發(fā)送者,接收者等信息。而數(shù)據(jù)部分則是這個數(shù)據(jù)包具體的,想給接守者的內(nèi)容。
大家想一個問題,一個楨的長度是 64~1518 個字節(jié),也就是說楨的長度不是固定的,那你覺得標頭部分的字節(jié)長度是固定的嗎?它當然是固定的啊,假如不是固定的,每個楨都是單獨發(fā)的,那計算機怎么知道標頭是幾個字節(jié),數(shù)據(jù)是幾個字節(jié)呢。所以標頭部分的字節(jié)是固定的,并且固定為18個字節(jié)。
把一臺計算的的數(shù)據(jù)通過物理層和鏈路層發(fā)送給另一臺計算機,究竟是誰發(fā)給誰的,計算機與計算機之間如何區(qū)分,,你總得給他們一個唯一的標識吧?
于是,MAC 地址出現(xiàn)了。
2. MAC 地址
連入網(wǎng)絡(luò)的每一個計算機都會有網(wǎng)卡接口,每一個網(wǎng)卡都會有一個唯一的地址,這個地址就叫做 MAC 地址。計算機之間的數(shù)據(jù)傳送,就是通過 MAC 地址來唯一尋找、傳送的。

MAC地址 由 48 個字節(jié)所構(gòu)成,在網(wǎng)卡生產(chǎn)時就被唯一標識了。
3. 廣播與ARP協(xié)議
(1). 廣播

如圖,假如計算機 A 知道了計算機 B 的 MAC 地址,然后計算機 A 想要給計算機 B 傳送數(shù)據(jù),雖然計算機 A 知道了計算機 B 的 MAC 地址,可是它要怎么給它傳送數(shù)據(jù)呢?計算機 A 不僅連著計算機 B,而且計算機 A 也還連著其他的計算機。 雖然計算機 A 知道計算機 B 的 MAC 地址,可是計算機 A 卻不知道知道計算機 B 是分布在哪邊路線上,為了解決這個問題,于是,有了廣播的出現(xiàn)。
在同一個子網(wǎng)中,計算機 A 要向計算機 B 發(fā)送一個數(shù)據(jù)包,這個數(shù)據(jù)包會包含接收者的 MAC 地址。當發(fā)送時,計算機 A 是通過廣播的方式發(fā)送的,這時同一個子網(wǎng)中的計算機 C, D 也會收到這個數(shù)據(jù)包的,然后收到這個數(shù)據(jù)包的計算機,會把數(shù)據(jù)包的 MAC 地址取出來,與自身的 MAC 地址對比,如果兩者相同,則接受這個數(shù)據(jù)包,否則就丟棄這個數(shù)據(jù)包。這種發(fā)送方式我們稱之為廣播,就像我們平時在廣場上通過廣播的形式呼叫某個人一樣,如果這個名字是你,你就理會一下,如果不是你,你就當作聽不見。
(2). ARP 協(xié)議。
那么問題來了,計算機 A 是如何知道計算機 B 的 MAC 地址的呢?這個時候就得由 ARP 協(xié)議這個家伙來解決了,不過 ARP 協(xié)議會涉及到IP地址,我們下面才會扯到IP地址。因此我們先放著,就當作是有這么一個 ARP 協(xié)議,通過它我們可以知道子網(wǎng)中其他計算機的 MAC 地址。
3. 網(wǎng)絡(luò)層
上面我們有說到子網(wǎng)這個關(guān)鍵詞,實際上我們所處的網(wǎng)絡(luò),是由無數(shù)個子網(wǎng)絡(luò)構(gòu)成的。廣播的時候,也只有同一個子網(wǎng)里面的計算機能夠收到。
假如沒有子網(wǎng)這種劃分的話,計算機 A 通過廣播的方式發(fā)一個數(shù)據(jù)包給計算機 B , 其他所有計算機也都能收到這個數(shù)據(jù)包,然后進行對比再舍棄。世界上有那么多它計算機,每一臺計算機都能收到其他所有計算機的數(shù)據(jù)包,那就不得了了。那還不得奔潰。 因此產(chǎn)生了子網(wǎng)這么一個東西。
那么問題來了,我們?nèi)绾螀^(qū)分哪些 MAC 地址是屬于同一個子網(wǎng)的呢?假如是同一個子網(wǎng),那我們就用廣播的形式把數(shù)據(jù)傳送給對方,如果不是同一個子網(wǎng)的,我們就會把數(shù)據(jù)發(fā)給網(wǎng)關(guān),讓網(wǎng)關(guān)進行轉(zhuǎn)發(fā)。
為了解決這個問題,于是,有了 IP 協(xié)議。
1. IP協(xié)議
IP協(xié)議,它所定義的地址,我們稱之為IP地址。IP協(xié)議有兩種版本,一種是 IPv4,另一種是 IPv6。不過我們目前大多數(shù)用的還是 IPv4,我們現(xiàn)在也只討論 IPv4 這個版本的協(xié)議。
這個 IP 地址由 32 位的二進制數(shù)組成,我們一般把它分成4段的十進制表示,地址范圍為0.0.0.0~255.255.255.255。
每一臺想要聯(lián)網(wǎng)的計算機都會有一個IP地址。這個IP地址被分為兩部分,前面一部分代表網(wǎng)絡(luò)部分,后面一部分代表主機部分。并且網(wǎng)絡(luò)部分和主機部分所占用的二進制位數(shù)是不固定的。
假如兩臺計算機的網(wǎng)絡(luò)部分是一模一樣的,我們就說這兩臺計算機是處于同一個子網(wǎng)中。例如 192.168.43.1 和 192.168.43.2, 假如這兩個 IP 地址的網(wǎng)絡(luò)部分為 24 位,主機部分為 8 位。那么他們的網(wǎng)絡(luò)部分都為 192.168.43,所以他們處于同一個子網(wǎng)中。
可是問題來了,你怎么知道網(wǎng)絡(luò)部分是占幾位,主機部分又是占幾位呢?也就是說,單單從兩臺計算機的IP地址,我們是無法判斷他們的是否處于同一個子網(wǎng)中的。
這就引申出了另一個關(guān)鍵詞————子網(wǎng)掩碼。子網(wǎng)掩碼和IP地址一樣也是 32 位二進制數(shù),不過它的網(wǎng)絡(luò)部分規(guī)定全部為 1,主機部分規(guī)定全部為 0.也就是說,假如上面那兩個IP地址的網(wǎng)絡(luò)部分為 24 位,主機部分為 8 位的話,那他們的子網(wǎng)掩碼都為 11111111.11111111.11111111.00000000,即255.255.255.0。

那有了子網(wǎng)掩碼,如何來判端IP地址是否處于同一個子網(wǎng)中呢。顯然,知道了子網(wǎng)掩碼,相當于我們知道了網(wǎng)絡(luò)部分是幾位,主機部分是幾位。我們只需要把 IP 地址與它的子網(wǎng)掩碼做與(and)運算,然后把各自的結(jié)果進行比較就行了,如果比較的結(jié)果相同,則代表是同一個子網(wǎng),否則不是同一個子網(wǎng)。
例如,192.168.43.1和192.168.43.2的子碼掩碼都為255.255.255.0,把IP與子碼掩碼相與,可以得到他們都為192.168.43.0,進而他們處于同一個子網(wǎng)中。
2. ARP協(xié)議
有了上面IP協(xié)議的知識,我們回來講一下ARP協(xié)議。
有了兩臺計算機的IP地址與子網(wǎng)掩碼,我們就可以判斷出它們是否處于同一個子網(wǎng)之中了。
假如他們處于同一個子網(wǎng)之中,計算機A要給計算機B發(fā)送數(shù)據(jù)時。我們可以通過ARP協(xié)議來得到計算機B的MAC地址。
ARP協(xié)議也是通過廣播的形式給同一個子網(wǎng)中的每臺電腦發(fā)送一個數(shù)據(jù)包(當然,這個數(shù)據(jù)包會包含接收方的IP地址)。對方收到這個數(shù)據(jù)包之后,會取出IP地址與自身的對比,如果相同,則把自己的MAC地址回復給對方,否則就丟棄這個數(shù)據(jù)包。這樣,計算機A就能知道計算機B的MAC地址了。

可能有人會問,知道了MAC地址之后,發(fā)送數(shù)據(jù)是通過廣播的形式發(fā)送,詢問對方的MAC地址也是通過廣播的形式來發(fā)送,那其他計算機怎么知道你是要傳送數(shù)據(jù)還是要詢問MAC地址呢?其實在詢問MAC地址的數(shù)據(jù)包中,在對方的MAC地址這一欄中,填的是一個特殊的MAC地址,其他計算機看到這個特殊的MAC地址之后,就能知道廣播想干嘛了。
假如兩臺計算機的IP不是處于同一個子網(wǎng)之中,這個時候,我們就會把數(shù)據(jù)包發(fā)送給網(wǎng)關(guān),然后讓網(wǎng)關(guān)讓我們進行轉(zhuǎn)發(fā)傳送
3. DNS服務(wù)器
這里再說一個問題,我們是如何知道對方計算機的IP地址的呢?這個問題可能有人會覺得很白癡,心想,當然是計算機的操作者來進行輸入了。這沒錯,當我們想要訪問某個網(wǎng)站的時候,我們可以輸入IP來進行訪問,但是我相信絕大多數(shù)人是輸入一個網(wǎng)址域名的,例如訪問百度是輸入 www.baidu.com 這個域名。其實當我們輸入這個域名時,會有一個叫做DNS服務(wù)器的家伙來幫我們解析這個域名,然后返回這個域名對應的IP給我們的。
因此,網(wǎng)絡(luò)層的功能就是讓我們在茫茫人海中,能夠找到另一臺計算機在哪里,是否屬于同一個子網(wǎng)等。
4. 傳輸層
通過物理層、數(shù)據(jù)鏈路層以及網(wǎng)絡(luò)層的互相幫助,我們已經(jīng)把數(shù)據(jù)成功從計算機A傳送到計算機B了,可是,計算機B里面有各種各樣的應用程序,計算機該如何知道這些數(shù)據(jù)是給誰的呢?
這個時候,端口(Port)這個家伙就上場了,也就是說,我們在從計算機A傳數(shù)據(jù)給計算表B的時候,還得指定一個端口,以供特定的應用程序來接受處理。
也就是說,傳輸層的功能就是建立端口到端口的通信。相比網(wǎng)絡(luò)層的功能是建立主機到主機的通信。
也就是說,只有有了IP和端口,我們才能進行準確著通信。這個時候可能有人會說,我輸入IP地址的時候并沒有指定一個端口啊。其實呢,對于有些傳輸協(xié)議,已經(jīng)有設(shè)定了一些默認端口了。例如http的傳輸默認端口是80,這些端口信息也會包含在數(shù)據(jù)包里的。
傳輸層最常見的兩大協(xié)議是 TCP 協(xié)議和 UDP 協(xié)議,其中 TCP 協(xié)議與 UDP 最大的不同就是 TCP 提供可靠的傳輸,而 UDP 提供的是不可靠傳輸。
5. 應用層
終于說到應用層了,應用層這一層最接近我們用戶了。
雖然我們收到了傳輸層傳來的數(shù)據(jù),可是這些傳過來的數(shù)據(jù)五花八門,有html格式的,有mp4格式的,各種各樣。你確定你能看的懂?
因此我們需要指定這些數(shù)據(jù)的格式規(guī)則,收到后才好解讀渲染。例如我們最常見的 Http 數(shù)據(jù)包中,就會指定該數(shù)據(jù)包是 什么格式的文件了。
總結(jié)
五層模型至此講到這里。對于有些層講的比較簡潔,就隨便概況了一下。因為如果我說的詳細一點的話,篇幅肯定會特別特別長,我著已經(jīng)是盡最大的努力以最簡潔的方式來講的了。如果你想詳細去了解,可以去買計算機網(wǎng)絡(luò)相應的資料,強烈推薦《計算機網(wǎng)絡(luò):自頂向下》這本書。希望我的講解能讓你對計算機之間數(shù)據(jù)的傳輸有個大概的了解。
完
個人微信:掃一掃加我領(lǐng)取計算機經(jīng)典電子書上百本

24張圖7000字詳解計算機中的高速緩存

讀取文件時,程序經(jīng)歷了什么?

