正文
上面說了一些題外話,哈哈瞻想。下面我們開始今天的知識(shí)點(diǎn)胞枕。
互聯(lián)網(wǎng)相隔n公里路的兩臺(tái)計(jì)算機(jī)杆煞,是如何進(jìn)行數(shù)據(jù)的傳送的呢?在成千上萬臺(tái)的計(jì)算機(jī)中腐泻,一臺(tái)計(jì)算機(jī)是如何正確著找到另外一個(gè)計(jì)算機(jī)决乎,并把數(shù)據(jù)傳給它的呢?
學(xué)過計(jì)算機(jī)網(wǎng)絡(luò)的同學(xué)可能知道派桩,在這互聯(lián)網(wǎng)中构诚,計(jì)算機(jī)與計(jì)算機(jī)之間的數(shù)據(jù)傳送,主要是基于各種“協(xié)議”串聯(lián)起來的铆惑。不過今天要講的范嘱,并不會(huì)詳細(xì)去講各種協(xié)議,而是通過各種簡化之后员魏,讓你大概知道數(shù)據(jù)之間傳送的原理丑蛤。
模型
互聯(lián)網(wǎng)中數(shù)據(jù)的傳送,其實(shí)分為好幾層來處理數(shù)據(jù)的逆趋,每一層有它自己明確的功能盏阶。例如就像流水線生產(chǎn)一樣,一部分人負(fù)責(zé)這部分的工作闻书,處理完之后就把剩余的工作扔給另外一部分人來處理......
對于互聯(lián)網(wǎng)數(shù)據(jù)傳送的分層模型名斟,有分成七層的,有分成5層的魄眉,還有分成4層的砰盐。例如分成七層模型的如下(從上到下):
- 應(yīng)用層
- 表示層
- 會(huì)話層
- 傳輸層
- 網(wǎng)絡(luò)層
- 數(shù)據(jù)鏈路層
- 物理層
七層中,越往下越靠近計(jì)算機(jī)底層坑律,越往上越靠近用戶岩梳。
不過,我們今天要講的,是以分成五層的模型來講冀值。其分層如下圖:
相當(dāng)于把應(yīng)用層也物、表示層、會(huì)話層看成是一層的列疗。接下來我們從下往上來一步一步講滑蚯,看看如何從一臺(tái)計(jì)算機(jī)準(zhǔn)確著傳給另一臺(tái)計(jì)算機(jī)的。
一. 物理層
一臺(tái)計(jì)算機(jī)與另一臺(tái)計(jì)算機(jī)要進(jìn)行通信抵栈,第一件要做的事是什么告材?當(dāng)然是要把這臺(tái)計(jì)算機(jī)與另外的其他計(jì)算機(jī)連起來啊,例如可以通過光纖啊古劲,電纜啊斥赋,雙絞線啊等物體把他們聯(lián)起來。然后才能進(jìn)行通信产艾,也就是說疤剑,,物理層負(fù)責(zé)把兩臺(tái)計(jì)算機(jī)連起來胰舆,然后在計(jì)算機(jī)之間傳送0,1這樣的電信號(hào)骚露。
二. 數(shù)據(jù)鏈路層
前面說了,物理層它只是單純著負(fù)責(zé)在計(jì)算機(jī)之間傳輸0缚窿,1這樣的電信號(hào)棘幸。假如這些0,1組合的傳送毫無規(guī)則倦零,計(jì)算機(jī)是解讀不了的误续。因此,我們需要制定一套規(guī)則來進(jìn)行0扫茅,1的傳送蹋嵌。例如多少個(gè)電信號(hào)為一組啊,每一組信號(hào)應(yīng)該如何標(biāo)識(shí)才能讓計(jì)算機(jī)讀懂啊等葫隙。
數(shù)據(jù)鏈路層工作在物理層之上栽烂,負(fù)責(zé)給這些0,1制定傳送的規(guī)則恋脚,然后另一方再按照相應(yīng)的規(guī)則來進(jìn)行解讀腺办。
1. 以太網(wǎng)協(xié)議
以太網(wǎng)協(xié)議規(guī)定,一組電信號(hào)構(gòu)成一個(gè)數(shù)據(jù)包糟描,把這個(gè)數(shù)據(jù)包稱之為“楨”怀喉。每一個(gè)楨由標(biāo)頭(Head)和數(shù)據(jù)(Data)兩部分組成。如下:
這個(gè)楨的最大長度是1518個(gè)字節(jié)船响,最小長度為64字節(jié)躬拢。假如需要傳送的數(shù)據(jù)很大的話躲履,就分成多個(gè)楨來進(jìn)行傳送。
對于表頭和數(shù)據(jù)這兩個(gè)部分聊闯,他們存放的都是一些什么數(shù)據(jù)呢工猜?我猜你瞇著眼睛都能想到他們應(yīng)該放什么數(shù)據(jù)。 毫無疑問菱蔬,我們至少得知道這個(gè)楨是誰發(fā)送域慷,發(fā)送給誰的等這些信息吧?所以標(biāo)頭部分主要是一些說明數(shù)據(jù)汗销,例如發(fā)送者,接收者等信息抵窒。而數(shù)據(jù)部分則是這個(gè)數(shù)據(jù)包具體的弛针,想給接受的內(nèi)容。
大家想一個(gè)問題李皇,一個(gè)楨的長度是64~1518個(gè)字節(jié)削茁,也就是說楨的長度不是固定的,那你覺得標(biāo)頭部分的字節(jié)長度是固定的嗎掉房?它當(dāng)然是固定的啊茧跋,假如不是固定的,每個(gè)楨都是單獨(dú)發(fā)的卓囚,那計(jì)算機(jī)怎么知道標(biāo)頭是幾個(gè)字節(jié)瘾杭,數(shù)據(jù)是幾個(gè)字節(jié)。所以標(biāo)頭部分的字節(jié)是固定的哪亿,并且固定為18個(gè)字節(jié)粥烁。
2. MAC地址
把一臺(tái)計(jì)算的的數(shù)據(jù)通過物理層和鏈路層發(fā)送給另一臺(tái)計(jì)算機(jī),究竟是誰發(fā)給誰的蝇棉,計(jì)算機(jī)與計(jì)算機(jī)之間如何區(qū)分讨阻,,你總得給他們一個(gè)唯一的標(biāo)識(shí)吧篡殷?
這就是MAC地址钝吮,連入網(wǎng)絡(luò)的每一個(gè)計(jì)算機(jī)都會(huì)有網(wǎng)卡接口,每一個(gè)網(wǎng)卡都會(huì)一個(gè)地址板辽,這個(gè)地址就叫做MAC地址奇瘦。計(jì)算機(jī)之間的數(shù)據(jù)傳送,就是通過MAC地址來唯一尋找戳气、傳送的链患。MAC地址在網(wǎng)卡生產(chǎn)是就被唯一標(biāo)識(shí)了。
3. 廣播與ARP協(xié)議
如圖瓶您,假如計(jì)算機(jī)A知道了計(jì)算機(jī)B的MAC地址麻捻,然后計(jì)算機(jī)A想要給計(jì)算機(jī)B傳送數(shù)據(jù)纲仍,雖然計(jì)算機(jī)A知道了計(jì)算機(jī)B的MAC地址,可是它要怎么給它傳送數(shù)據(jù)呢贸毕?計(jì)算機(jī)A不僅連著計(jì)算機(jī)B郑叠,而且計(jì)算機(jī)A也還連著其他的計(jì)算機(jī)。 雖然計(jì)算機(jī)A知道計(jì)算機(jī)B的MAC地址明棍,可是計(jì)算機(jī)A是無法知道計(jì)算機(jī)B是分布在哪邊路線上的乡革。實(shí)際上,計(jì)算機(jī)A是通過廣播的方式把數(shù)據(jù)發(fā)送給計(jì)算機(jī)B摊腋。在同一個(gè)子網(wǎng)中沸版,計(jì)算機(jī)A要向計(jì)算機(jī)B發(fā)送一個(gè)數(shù)據(jù)包,這個(gè)數(shù)據(jù)包包含接收者的MAC地址兴蒸。這個(gè)時(shí)候同一個(gè)子網(wǎng)中的計(jì)算機(jī)C,D也會(huì)收到這個(gè)數(shù)據(jù)包的视粮,然后收到這個(gè)數(shù)據(jù)包的計(jì)算機(jī),會(huì)把數(shù)據(jù)包的MAC地址取出來橙凳,與自身的MAC地址對比蕾殴,如果兩者相同,則接受這個(gè)數(shù)據(jù)包岛啸,否則就丟棄這個(gè)數(shù)據(jù)包钓觉。這種發(fā)送方式我們稱之為廣播,就像我們平時(shí)在廣場上通過廣播的形式呼叫某個(gè)人一樣。
那么問題來了坚踩,計(jì)算機(jī)A是如何知道計(jì)算機(jī)B的MAC地址的呢荡灾?這個(gè)時(shí)候就得由ARP協(xié)議這個(gè)家伙來解決了,不過ARP協(xié)議會(huì)涉及到IP地址堕虹,不過我們下面才會(huì)扯到IP地址卧晓。因此我們先放著,就當(dāng)作是有這么一個(gè)ARP協(xié)議赴捞,通過它我們可以知道子網(wǎng)中其他計(jì)算機(jī)的MAC地址逼裆。
三. 網(wǎng)絡(luò)層
上面我們有說到子網(wǎng)這個(gè)關(guān)鍵詞,實(shí)際上我們所處的網(wǎng)絡(luò)赦政,是由無數(shù)個(gè)子網(wǎng)絡(luò)構(gòu)成的胜宇。廣播的時(shí)候,也只有同一個(gè)子網(wǎng)里面的計(jì)算機(jī)能夠收到恢着。 假如沒有子網(wǎng)這種劃分的話桐愉,計(jì)算機(jī)A發(fā)一個(gè)數(shù)據(jù)包給計(jì)算機(jī)B,其他所有計(jì)算機(jī)也都能收到這個(gè)數(shù)據(jù)包,然后進(jìn)行對比再舍棄掰派。世界上有那么多它計(jì)算機(jī)从诲,每一臺(tái)計(jì)算機(jī)都能收到其他所有計(jì)算機(jī)的數(shù)據(jù)包,那就不得了了靡羡。那還不得奔潰系洛。 因此產(chǎn)生了子網(wǎng)這么一個(gè)東西俊性。
那么問題來了,我們?nèi)绾螀^(qū)分哪些MAC地址是屬于同一個(gè)子網(wǎng)的呢描扯?假如是同一個(gè)子網(wǎng)定页,那我們就用廣播的形式把數(shù)據(jù)傳送給對方,如果不是同一個(gè)子網(wǎng)的绽诚,我們就會(huì)把數(shù)據(jù)發(fā)給網(wǎng)關(guān)典徊,讓網(wǎng)關(guān)進(jìn)行轉(zhuǎn)發(fā)。
為了解決這個(gè)問題我們引入了一套新的地址協(xié)議恩够,這個(gè)地址協(xié)議能夠幫助我們區(qū)分MAC地址是否處于同一個(gè)子網(wǎng)中卒落。這也是網(wǎng)絡(luò)層負(fù)責(zé)解決的問題。
1. IP協(xié)議
這個(gè)協(xié)議就是IP協(xié)議蜂桶,它所定義的地址导绷,我們稱之為IP地址。IP協(xié)議有兩種版本屎飘,一種是IPv4,另一種是IPv6。不過我們目前大多數(shù)用的還是IPv4贾费,我們現(xiàn)在也只討論IPv4這個(gè)版本的協(xié)議钦购。
這個(gè)IP地址由32為的二進(jìn)制數(shù)組成,我們一般把它分成4段的十進(jìn)制表示褂萧,地址范圍為0.0.0.0~255.255.255.255
每一臺(tái)想要聯(lián)網(wǎng)的計(jì)算機(jī)都會(huì)有一個(gè)IP地址押桃。這個(gè)IP地址被分為兩部分,前面一部分代表網(wǎng)絡(luò)部分导犹,后面一部分代表主機(jī)部分唱凯。并且網(wǎng)絡(luò)部分和主機(jī)部分的二進(jìn)制位數(shù)是不固定的。
假如兩臺(tái)計(jì)算機(jī)的網(wǎng)絡(luò)部分是一模一樣的谎痢,我們就說這兩臺(tái)計(jì)算機(jī)是處于同一個(gè)子網(wǎng)中磕昼。例如192.168.43.1和192.168.43.2,假如這兩個(gè)IP地址的網(wǎng)絡(luò)部分為24為,主機(jī)部分為8位节猿。那么他們的網(wǎng)絡(luò)部分都為192.168.43票从,所以他們處于同一個(gè)子網(wǎng)中。
可是問題來了滨嘱,你怎么知道網(wǎng)絡(luò)部分是占幾位峰鄙。也就是說,單單從兩臺(tái)計(jì)算機(jī)的IP地址太雨,我們是無法判斷他們的是否處于同一個(gè)子網(wǎng)中的吟榴。
這就引申出了另一個(gè)關(guān)鍵詞————子碼掩碼。子碼掩碼和IP地址一樣也是32位二進(jìn)制數(shù)囊扳,不過它的網(wǎng)絡(luò)部分規(guī)定全部為1吩翻,主機(jī)部分規(guī)定全部為0.也就是說兜看,假如上面那兩個(gè)IP地址的網(wǎng)絡(luò)部分為24為,主機(jī)部分為8為的話仿野,那他們的子碼掩碼都為11111111.11111111.11111111.00000000铣减,即255.255.255.0。
那有了子字碼掩碼脚作,如何來判端IP地址是否處于同一個(gè)子網(wǎng)中呢葫哗。顯然,知道了子碼掩碼球涛,相當(dāng)于我們知道了網(wǎng)絡(luò)部分是幾位劣针,主機(jī)部分是幾位。我們只需要把IP地址與它的子碼掩碼做與(and)運(yùn)算亿扁,然后把各自的結(jié)果進(jìn)行比較就行了捺典,如果比較的結(jié)果相同,則代表是同一個(gè)子網(wǎng)从祝,否則不是同一個(gè)子網(wǎng)襟己。
例如,192.168.43.1和192.168.43.2的子碼掩碼都為255.255.255.0牍陌,把IP與子碼掩碼相與擎浴,可以得到他們都為192.168.43.0,進(jìn)而他們處于同一個(gè)子網(wǎng)中毒涧。
ARP協(xié)議
有了上面IP協(xié)議的知識(shí)贮预,我們回來講一下ARP協(xié)議。
有了兩臺(tái)計(jì)算機(jī)的IP地址契讲,我們就可以判斷出它們是否處于同一個(gè)子網(wǎng)之中仿吞。 假如他們處于同一個(gè)子網(wǎng)之中,計(jì)算機(jī)A要給計(jì)算機(jī)B發(fā)送數(shù)據(jù)時(shí)捡偏。我們可以通過ARP協(xié)議來得到計(jì)算機(jī)B的MAC地址唤冈。ARP協(xié)議也是通過廣播的形式給同一個(gè)子網(wǎng)中的每臺(tái)電腦發(fā)送一個(gè)數(shù)據(jù)包(當(dāng)然,這個(gè)數(shù)據(jù)包會(huì)包含接收方的IP地址)银伟。對方收到這個(gè)數(shù)據(jù)包之后务傲,會(huì)取出IP地址與自身的對比,如果相同枣申,則把自己的MAC地址回復(fù)給對方售葡,否則就丟棄這個(gè)數(shù)據(jù)包。這樣忠藤,計(jì)算機(jī)A就能知道計(jì)算機(jī)B的MAC地址了挟伙。
可能有人會(huì)問,知道了MAC地址之后,發(fā)送數(shù)據(jù)是通過廣播的形式發(fā)送尖阔,詢問對方的MAC地址也是通過廣播的形式來發(fā)送贮缅,那其他計(jì)算機(jī)怎么知道你是要傳送數(shù)據(jù)還是要詢問MAC地址呢?其實(shí)在詢問MAC地址的數(shù)據(jù)包中介却,在對方的MAC地址這一欄中谴供,填的是一個(gè)特殊的MAC地址,其他計(jì)算機(jī)看到這個(gè)特殊的MAC地址之后齿坷,就能知道廣播想干嘛了桂肌。
假如兩臺(tái)計(jì)算機(jī)的IP不是處于同一個(gè)子網(wǎng)之中,這個(gè)時(shí)候永淌,我們就會(huì)把數(shù)據(jù)包發(fā)送給網(wǎng)關(guān)崎场,然后讓網(wǎng)關(guān)讓我們進(jìn)行轉(zhuǎn)發(fā)傳送
DNS服務(wù)器
這里再說一個(gè)問題,我們是如何知道對方計(jì)算機(jī)的IP地址的呢遂蛀?這個(gè)問題可能有人會(huì)覺得很白癡谭跨,心想,當(dāng)然是計(jì)算機(jī)的操作者來進(jìn)行輸入了李滴。這沒錯(cuò)螃宙,當(dāng)我們想要訪問某個(gè)網(wǎng)站的時(shí)候,我們可以輸入IP來進(jìn)行訪問所坯,但是我相信絕大多數(shù)人是輸入一個(gè)網(wǎng)址域名的污呼,例如訪問百度是輸入www.baidu.com這個(gè)域名。其實(shí)當(dāng)我們輸入這個(gè)域名時(shí)包竹,會(huì)有一個(gè)叫做DNS服務(wù)器的家伙來幫我們解析這個(gè)域名,然后返回這個(gè)域名對應(yīng)的IP給我們的籍凝。
四. 傳輸層
雖然我們已經(jīng)把數(shù)據(jù)成功從計(jì)算機(jī)A傳送到計(jì)算機(jī)B了周瞎,可是,計(jì)算機(jī)B里面有各種各樣的應(yīng)用程序饵蒂,計(jì)算機(jī)該如何知道這些數(shù)據(jù)是給誰的呢声诸?
這個(gè)時(shí)候,端口(Port)這個(gè)家伙就上場了退盯,也就是說彼乌,我們在從計(jì)算機(jī)A傳數(shù)據(jù)給計(jì)算表B的時(shí)候,還得指定一個(gè)端口渊迁,以供特定的應(yīng)用程序來接受處理慰照。
也就是說,傳輸層的功能就是建立端口到端口的通信琉朽。相比網(wǎng)絡(luò)層的功能是建立主機(jī)到主機(jī)的通信毒租。
也就是說,有了IP和端口箱叁,我們就可以進(jìn)行通信了墅垮。這個(gè)時(shí)候可能有人會(huì)說惕医,我輸入IP地址的時(shí)候并沒有指定一個(gè)端口啊。其實(shí)呢算色,對于有些傳輸協(xié)議抬伺,已經(jīng)有設(shè)定了一些默認(rèn)端口了。例如http的傳輸默認(rèn)端口是80灾梦,這些端口信息也會(huì)包含在數(shù)據(jù)包里的峡钓。
應(yīng)用層
終于說到應(yīng)用層了,應(yīng)用層這一層最接近我們用戶了。
雖然我們收到了傳輸層傳來的數(shù)據(jù)大磺,可是這些傳過來的數(shù)據(jù)五花八門恢总,有html格式的,有mp4格式的捧灰,各種各樣。你確定你能看的懂统锤?
因此我們需要指定這些數(shù)據(jù)的格式規(guī)則毛俏,收到后才好解讀渲染。而應(yīng)用層的功能饲窿,就是用來規(guī)定應(yīng)用程序的數(shù)據(jù)格式的煌寇。
五層模型至此講到這里。對于有些層講的比較簡潔逾雄,就隨便概況了一下阀溶。如果你想詳細(xì)去了解,可以去買計(jì)算機(jī)網(wǎng)絡(luò)相應(yīng)的資料鸦泳。希望我的講解能讓你對計(jì)算機(jī)之間數(shù)據(jù)的傳輸有個(gè)大概的了解银锻。