前言
天各一方的兩臺計算機是如何通信的呢?在成千上萬的計算機中娶视,為什么一臺計算機能夠準(zhǔn)確著尋找到另外一臺計算機,并且把數(shù)據(jù)發(fā)送給它呢?
可能很多人都聽說過網(wǎng)絡(luò)通信的 5 層模型哥放,但是可能并不是很清楚為什么需要五層模型歼指,五層模型負責(zé)的任務(wù)也有可能經(jīng)常混淆甥雕。下面是網(wǎng)絡(luò)通信的五層模型
說實話踩身,五層模型的具體內(nèi)容還是極其復(fù)雜的,不過今天這篇文章社露,我將用最簡潔的模式挟阻,通過網(wǎng)絡(luò)通信的五層模型來講解一臺計算機是如何找到另外一臺計算機并且把數(shù)據(jù)發(fā)送給另一臺計算機的,就算你沒學(xué)過計算機網(wǎng)絡(luò)峭弟,也能夠聽的懂附鸽。
1. 物理層
一臺計算機與另一臺計算機要進行通信,第一件要做的事是什么瞒瘸?當(dāng)然是要把這臺計算機與另外的其他計算機連起來啊坷备,這樣,我們才能把數(shù)據(jù)傳輸過去情臭。例如可以通過光纖啊省撑,電纜啊,雙絞線啊等介質(zhì)把他們連接起來俯在,然后才能進行通信竟秫。
也就是說,物理層負責(zé)把兩臺計算機連起來跷乐,然后在計算機之間通過高低電頻來傳送0,1這樣的電信號鸿摇。
2. 數(shù)據(jù)鏈路層
前面說了,物理層它只是單純著負責(zé)把計算機連接起來劈猿,并且在計算機之間傳輸0拙吉,1這樣的電信號。如果這些0揪荣,1組合的傳送毫無規(guī)則的話筷黔,計算機是解讀不了的。一大堆0仗颈,1誰知道是什么鬼啊佛舱。
因此,我們需要制定一套規(guī)則來進行0挨决,1的傳送请祖。例如多少個電信號為一組啊,每一組信號應(yīng)該如何標(biāo)識才能讓計算機讀懂啊等等脖祈。于是肆捕,有了以太網(wǎng)協(xié)議。
-
以太網(wǎng)協(xié)議
以太網(wǎng)協(xié)議規(guī)定盖高,一組電信號構(gòu)成一個數(shù)據(jù)包慎陵,我們把這個數(shù)據(jù)包稱之為幀眼虱。每一個楨由標(biāo)頭(Head)和數(shù)據(jù)(Data)兩部分組成。
image.png
幀的大小一般為 64 - 1518 個字節(jié)席纽。假如需要傳送的數(shù)據(jù)很大的話捏悬,就分成多個楨來進行傳送。
對于表頭和數(shù)據(jù)這兩個部分润梯,他們存放的都是一些什么數(shù)據(jù)呢过牙?我猜你瞇著眼睛都能想到他們應(yīng)該放什么數(shù)據(jù)。 毫無疑問纺铭,我們至少得知道這個楨是誰發(fā)送抒和,發(fā)送給誰的等這些信息吧?所以標(biāo)頭部分主要是一些說明數(shù)據(jù)彤蔽,例如發(fā)送者,接收者等信息庙洼。而數(shù)據(jù)部分則是這個數(shù)據(jù)包具體的顿痪,想給接守者的內(nèi)容。
大家想一個問題油够,一個楨的長度是 64~1518 個字節(jié)蚁袭,也就是說楨的長度不是固定的,那你覺得標(biāo)頭部分的字節(jié)長度是固定的嗎石咬?它當(dāng)然是固定的啊揩悄,假如不是固定的,每個楨都是單獨發(fā)的鬼悠,那計算機怎么知道標(biāo)頭是幾個字節(jié)删性,數(shù)據(jù)是幾個字節(jié)呢。所以標(biāo)頭部分的字節(jié)是固定的焕窝,并且固定為18個字節(jié)蹬挺。
把一臺計算的的數(shù)據(jù)通過物理層和鏈路層發(fā)送給另一臺計算機,究竟是誰發(fā)給誰的它掂,計算機與計算機之間如何區(qū)分巴帮,,你總得給他們一個唯一的標(biāo)識吧虐秋?
于是榕茧,MAC 地址出現(xiàn)了。
-
MAC 地址
連入網(wǎng)絡(luò)的每一個計算機都會有網(wǎng)卡接口客给,每一個網(wǎng)卡都會有一個唯一的地址用押,這個地址就叫做 MAC 地址。計算機之間的數(shù)據(jù)傳送靶剑,就是通過 MAC 地址來唯一尋找只恨、傳送的译仗。
image.png
MAC地址 由 48 個字節(jié)所構(gòu)成,在網(wǎng)卡生產(chǎn)時就被唯一標(biāo)識了官觅。
-
廣播與ARP協(xié)議
(1). 廣播
image.png
如圖移宅,假如計算機 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 地址桶错。當(dāng)發(fā)送時航唆,計算機 A 是通過廣播的方式發(fā)送的,這時同一個子網(wǎng)中的計算機 C, D 也會收到這個數(shù)據(jù)包的院刁,然后收到這個數(shù)據(jù)包的計算機糯钙,會把數(shù)據(jù)包的 MAC 地址取出來,與自身的 MAC 地址對比退腥,如果兩者相同任岸,則接受這個數(shù)據(jù)包,否則就丟棄這個數(shù)據(jù)包狡刘。這種發(fā)送方式我們稱之為廣播,就像我們平時在廣場上通過廣播的形式呼叫某個人一樣演闭,如果這個名字是你,你就理會一下颓帝,如果不是你米碰,你就當(dāng)作聽不見。
(2). ARP 協(xié)議购城。
那么問題來了吕座,計算機 A 是如何知道計算機 B 的 MAC 地址的呢?這個時候就得由 ARP 協(xié)議這個家伙來解決了瘪板,不過 ARP 協(xié)議會涉及到IP地址吴趴,我們下面才會扯到IP地址。因此我們先放著侮攀,就當(dāng)作是有這么一個 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é)議烧栋。
- 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)掩碼嗦锐,相當(dā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)中儿子。
- 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ù)包(當(dāng)然癣漆,這個數(shù)據(jù)包會包含接收方的IP地址)。對方收到這個數(shù)據(jù)包之后剂买,會取出IP地址與自身的對比惠爽,如果相同,則把自己的MAC地址回復(fù)給對方瞬哼,否則就丟棄這個數(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ā)傳送
- DNS服務(wù)器
這里再說一個問題县钥,我們是如何知道對方計算機的IP地址的呢秀姐?這個問題可能有人會覺得很白癡,心想若贮,當(dāng)然是計算機的操作者來進行輸入了省有。這沒錯,當(dāng)我們想要訪問某個網(wǎng)站的時候谴麦,我們可以輸入IP來進行訪問蠢沿,但是我相信絕大多數(shù)人是輸入一個網(wǎng)址域名的,例如訪問百度是輸入 www.baidu.com 這個域名匾效。其實當(dāng)我們輸入這個域名時舷蟀,會有一個叫做DNS服務(wù)器的家伙來幫我們解析這個域名,然后返回這個域名對應(yīng)的IP給我們的。
因此野宜,網(wǎng)絡(luò)層的功能就是讓我們在茫茫人海中扫步,能夠找到另一臺計算機在哪里,是否屬于同一個子網(wǎng)等匈子。
4. 傳輸層
通過物理層河胎、數(shù)據(jù)鏈路層以及網(wǎng)絡(luò)層的互相幫助,我們已經(jīng)把數(shù)據(jù)成功從計算機A傳送到計算機B了虎敦,可是游岳,計算機B里面有各種各樣的應(yīng)用程序,計算機該如何知道這些數(shù)據(jù)是給誰的呢其徙?
這個時候胚迫,端口(Port)這個家伙就上場了,也就是說擂橘,我們在從計算機A傳數(shù)據(jù)給計算表B的時候晌区,還得指定一個端口,以供特定的應(yīng)用程序來接受處理通贞。
也就是說朗若,傳輸層的功能就是建立端口到端口的通信。相比網(wǎng)絡(luò)層的功能是建立主機到主機的通信昌罩。
也就是說哭懈,只有有了IP和端口,我們才能進行準(zhǔn)確著通信茎用。這個時候可能有人會說遣总,我輸入IP地址的時候并沒有指定一個端口啊。其實呢轨功,對于有些傳輸協(xié)議旭斥,已經(jīng)有設(shè)定了一些默認端口了。例如http的傳輸默認端口是80古涧,這些端口信息也會包含在數(shù)據(jù)包里的垂券。
傳輸層最常見的兩大協(xié)議是 TCP 協(xié)議和 UDP 協(xié)議,其中 TCP 協(xié)議與 UDP 最大的不同就是 TCP 提供可靠的傳輸羡滑,而 UDP 提供的是不可靠傳輸菇爪。
5. 應(yīng)用層
終于說到應(yīng)用層了,應(yīng)用層這一層最接近我們用戶了柒昏。
雖然我們收到了傳輸層傳來的數(shù)據(jù)凳宙,可是這些傳過來的數(shù)據(jù)五花八門,有html格式的职祷,有mp4格式的氏涩,各種各樣届囚。你確定你能看的懂?
因此我們需要指定這些數(shù)據(jù)的格式規(guī)則是尖,收到后才好解讀渲染奖亚。例如我們最常見的 Http 數(shù)據(jù)包中,就會指定該數(shù)據(jù)包是 什么格式的文件了析砸。