你的問題
在這個(gè)寧肯不吃一頓飯,不可斷一小時(shí)網(wǎng)的時(shí)代里,我們對網(wǎng)絡(luò)的依賴已經(jīng)達(dá)到了無以復(fù)加的地步,雖然我們每天在使用網(wǎng)絡(luò),卻并不清楚網(wǎng)絡(luò)通訊到底是如何進(jìn)行的?
比如,你在微信里給苦追了好久的姑娘發(fā)送了一條約會(huì)消息,她收到了,并且在微信上回復(fù)給你“不好意思,我今晚有約了”,但是這可能是個(gè)誤會(huì),你發(fā)送的消息為什么可以成功到達(dá)她的手機(jī)上,而不是被遠(yuǎn)在大洋彼岸的川普收到呢?她在手機(jī)上看到這條消息后,回復(fù)給你一條拒絕的消息,這條消息也準(zhǔn)確無誤的被你所接收,本來打算和姑娘一塊看電影的計(jì)劃泡湯了,雖然你這時(shí)候心情很糟,但你也無事可做,所以打算研究研究這該死的網(wǎng)絡(luò)通訊協(xié)議。看看為什么你發(fā)給妹子的消息沒有發(fā)到川普的手機(jī)上。
簡單分析
我們先來看看你給姑娘發(fā)送消息這一過程,它的背后到底發(fā)生了什么。首先,你編輯了一條消息,點(diǎn)擊了發(fā)送按鈕,這時(shí)這條消息會(huì)被經(jīng)過包裝,然后發(fā)送至騰訊的服務(wù)器上,包裝的過程中,會(huì)把發(fā)送人、接收人、消息內(nèi)容等等信息整合在一起,騰訊的服務(wù)器接收的這條信息之后,對應(yīng)的程序就會(huì)對這條消息進(jìn)行處理計(jì)算,從而得知要把什么內(nèi)容發(fā)送給什么人,然后服務(wù)器也將這一信息進(jìn)行包裝處理,發(fā)送出去,之后姑娘收到消息。這只是一個(gè)簡單的消息傳遞流程,要想真正搞清楚消息是怎么發(fā)送的,還需要了解互聯(lián)網(wǎng)通訊的原理。
協(xié)議
首先我們要知道協(xié)議是什么?其實(shí)很簡單,協(xié)議其實(shí)就是一種規(guī)則。比如在社會(huì)中,我們有法律來約束每個(gè)人的行為,法律就可以看做是一種面向公民的“協(xié)議”。在互聯(lián)網(wǎng)上我們同樣需要一些規(guī)則來約束各個(gè)主機(jī)設(shè)備或程序的行為,那么這個(gè)規(guī)則就是互聯(lián)網(wǎng)協(xié)議。接下來我們會(huì)介紹互聯(lián)網(wǎng)分層模型,互聯(lián)網(wǎng)的每一層都有其特定的功能,要實(shí)現(xiàn)這特定的功能就要有對應(yīng)的協(xié)議。
互聯(lián)網(wǎng)分層模型
為了便于理解,我們一般可以將互聯(lián)網(wǎng)通訊模型分為五層,每個(gè)層都有它自己的功能。物理層是最底層,應(yīng)用層是最高層,中間分別是鏈路層、網(wǎng)絡(luò)層和傳輸層,其每一層都是建立在上一層的基礎(chǔ)上的。
(一)物理層
你想給姑娘發(fā)送一條消息,首先你得有個(gè)手機(jī)(這TM不是廢話),其次,你的手機(jī)得連上網(wǎng)(這TM也是廢話),或許你這條消息是用電腦版的微信發(fā)送的,那無論你是插網(wǎng)線還是連WIFI,都需要你成功接入互聯(lián)網(wǎng)。
這些連接線路就是互聯(lián)網(wǎng)的物理層,物理層主要功能是提供了數(shù)據(jù)傳輸?shù)慕橘|(zhì),使得電信號可以在設(shè)備之間傳播,這里的電信號也可以簡單的理解為0或1。
(二)鏈路層
物理層為我們提供了在兩臺設(shè)備之間傳輸0和1的可能,但是只是單純的傳輸0和1是沒有意義的。鏈路層的作用是將這些01信號序列化,轉(zhuǎn)化為有意義的數(shù)據(jù)幀。
那么鏈路層是怎么工作的呢?它工作過程大概可以理解為三個(gè)部分,發(fā)送什么數(shù)據(jù)?發(fā)送給誰?怎么發(fā)送?
首先需要有一個(gè)規(guī)則來定義這些01電信號,使得這些電信號變得有意義,這個(gè)規(guī)則就是以太網(wǎng)協(xié)議(Ethernet),它規(guī)定了一組電信號為一個(gè)數(shù)據(jù)包,每個(gè)數(shù)據(jù)包都分標(biāo)頭(head)和數(shù)據(jù)(data)。標(biāo)頭用來存儲(chǔ)發(fā)送人、接收人、數(shù)據(jù)類型等等,數(shù)據(jù)部分就是消息內(nèi)容。這就解決了發(fā)送什么消息的問題。
定義好了數(shù)據(jù),我們就該考慮發(fā)送給誰的問題了,每臺設(shè)備都有自己的一個(gè)地址,叫做MAC地址。MAC地址在設(shè)備出廠時(shí)就已經(jīng)固定了,這個(gè)地址在全世界是獨(dú)一無二的,這樣我們就可以通過這個(gè)地址去向目標(biāo)設(shè)備發(fā)送數(shù)據(jù)。
雖然我們知道了目標(biāo)設(shè)備的MAC地址,但是怎么才能把把消息準(zhǔn)確的發(fā)送給目標(biāo)設(shè)備呢?其實(shí)解決方法很簡單,發(fā)送數(shù)據(jù)時(shí),將向網(wǎng)絡(luò)中所有設(shè)備都發(fā)送這個(gè)消息,然后每一臺設(shè)備自己來判斷數(shù)據(jù)標(biāo)頭中包含的MAC地址是否和自己的MAC地址一致,如果一致就接收這個(gè)消息,如果不一致就不接收。這種發(fā)送數(shù)據(jù)的方式叫做“廣播”。通過“廣播”的方式就可以把一條數(shù)據(jù)發(fā)送到指定設(shè)備上了。
好了,讓我們再來看看發(fā)送數(shù)據(jù)這個(gè)過程,如我們上面所說,你想給姑娘發(fā)送一條消息,得通過通訊線纜傳輸0或1這種信號,然后有一種叫以太網(wǎng)協(xié)議的東西可以幫你把01信號轉(zhuǎn)化為有意義的數(shù)據(jù),之后你的手機(jī)向網(wǎng)絡(luò)中所有設(shè)備發(fā)出這條消息,姑娘的手機(jī)發(fā)現(xiàn)這條數(shù)據(jù)是發(fā)給她的,便接受了這條數(shù)據(jù),其他人的設(shè)備發(fā)現(xiàn)數(shù)據(jù)中包含的MAC地址和自己的MAC地址不符合,說明這條數(shù)據(jù)是發(fā)送給其他人的,便不接收這條數(shù)據(jù)。這樣便達(dá)到了發(fā)送給姑娘消息的效果。
(三)網(wǎng)絡(luò)層
我們知道全球的可聯(lián)網(wǎng)設(shè)備都在一個(gè)巨型網(wǎng)絡(luò)下,按我們上面所說,你的消息會(huì)發(fā)送給網(wǎng)絡(luò)內(nèi)所有設(shè)備,這么說來你的這條消息還是發(fā)給川普了嘛,只是人家沒有接收而已。其實(shí),并非如此,如果每發(fā)送一條消息都會(huì)發(fā)送給互聯(lián)網(wǎng)上的所有人,那以互聯(lián)網(wǎng)這么大的體量,早就癱瘓了。
實(shí)際上,“廣播”的方式只能在同一子網(wǎng)絡(luò)內(nèi)發(fā)送數(shù)據(jù),互聯(lián)網(wǎng)是由非常多的子網(wǎng)絡(luò)組成的巨型網(wǎng)絡(luò),所以你發(fā)給姑娘的消息川普是絕對收不到的。
看到這里你肯定已經(jīng)明白了,網(wǎng)絡(luò)層的作用是可以讓數(shù)據(jù)在不同子網(wǎng)絡(luò)之間也可以傳遞。最常見的網(wǎng)路層通訊協(xié)議就是IP協(xié)議。
3.1 IP地址
雖然每臺設(shè)備都有自己獨(dú)有的MAC地址,但是通過MAC地址我們是無法判斷該設(shè)備是屬于那個(gè)子網(wǎng)絡(luò)的,所以我們引入了一種其他的地址,叫做IP地址,也稱為“網(wǎng)址”。目前最常使用的是IPv4,是IP協(xié)議的第四版。IPv4規(guī)定網(wǎng)址是由32位二進(jìn)制數(shù)組成,通常以四段10進(jìn)制數(shù)表示,從0.0.0.0到255.255.255.255,例如:192.168.1.1就是一個(gè)IPv4地址。
3.2 子網(wǎng)掩碼
有了兩臺設(shè)備的IP地址,我們該如何判斷兩臺設(shè)備是不是處在同一子網(wǎng)絡(luò)下呢?這時(shí)候就需要另外一種叫做“子網(wǎng)掩碼”的參數(shù)了,“子網(wǎng)掩碼”同IP地址十分類似,也是由32位二進(jìn)制數(shù)組成,不過它的網(wǎng)絡(luò)部分全部為1,主機(jī)部分全部為0,那么什么是網(wǎng)絡(luò)部分?什么是主機(jī)部分呢?
舉例來說,IP地址為192.168.1.1,子網(wǎng)掩碼為“255.255.255.0”,就表示此IP的前24位為網(wǎng)絡(luò)部分,后8位為主機(jī)部分。也就是說通過“子網(wǎng)掩碼”可以確定一個(gè)IP地址的網(wǎng)絡(luò)部分和主機(jī)部分。那么問題就變得簡單了,如果兩臺設(shè)備的IP地址網(wǎng)絡(luò)部分是相同的,那么他們就處在同一子網(wǎng)絡(luò)。
例如:A設(shè)備的IP地址為172.12.214.3,子網(wǎng)掩碼為255.255.0.0,B設(shè)備的IP地址為172.12.213.1,子網(wǎng)掩碼同為255.255.0.0,則可以判斷出A設(shè)備與B設(shè)備處在同一子網(wǎng)絡(luò)下。
3.3 相同子網(wǎng)絡(luò)間的數(shù)據(jù)傳輸
好了,看起來費(fèi)了好大的勁來判斷兩臺設(shè)備是不是處于同一網(wǎng)絡(luò)下,但是相信我,費(fèi)這么大功夫是絕對值得的。我們馬上就可以在互聯(lián)網(wǎng)上任意兩臺設(shè)備間發(fā)送數(shù)據(jù)了。首先我們要了解,我們想要發(fā)送數(shù)據(jù),就必須知道目標(biāo)設(shè)備的IP地址和MAC地址。
通過IP協(xié)議,我們可以判斷出要傳輸數(shù)據(jù)的兩臺設(shè)備是否是在同一子網(wǎng)絡(luò),那現(xiàn)在就會(huì)有兩種情況,第一種情況是,兩臺設(shè)備處在同一子網(wǎng)絡(luò)下,那我們就可以利用“廣播”方式去發(fā)送數(shù)據(jù)了,但是問題來了,知道目標(biāo)設(shè)備的IP地址,如何獲得目標(biāo)的MAC地址呢?這時(shí)候ARP協(xié)議就登場了。
ARP協(xié)議的作用可以簡單的認(rèn)為是通過IP地址來獲取同一子網(wǎng)絡(luò)中設(shè)備的MAC地址,那它是如何工作的,其實(shí)也很簡單,它也是通過“廣播”的方式向子網(wǎng)絡(luò)內(nèi)所有設(shè)備發(fā)送一條數(shù)據(jù)包,數(shù)據(jù)包中的MAC地址填寫為:FF:FF:FF:FF:FF:FF,這樣當(dāng)其他設(shè)備收到這條數(shù)據(jù)的時(shí)候,就會(huì)對比自身的IP與數(shù)據(jù)包中的IP是否一致,若不一致就丟棄這條數(shù)據(jù),若一致就接收這一條數(shù)據(jù),并匯報(bào)自己的MAC地址,這樣就可以通過IP地址獲取到MAC地址了。
現(xiàn)在我們就可以在兩臺設(shè)備(同一子網(wǎng)絡(luò))間通訊了。
3.4 不同子網(wǎng)絡(luò)間的數(shù)據(jù)傳輸
第二種情況是,要傳輸數(shù)據(jù)的兩臺設(shè)備,不在同一子網(wǎng)絡(luò)下,我們知道,要想把數(shù)據(jù)準(zhǔn)確發(fā)送到目標(biāo)設(shè)備中,就必須知道兩個(gè)地址
- 目標(biāo)設(shè)備的IP地址
- 目標(biāo)設(shè)備的MAC地址
但是,不同子網(wǎng)絡(luò)間的兩臺設(shè)備,是無法獲取到對方的MAC地址的,這時(shí)候只能將數(shù)據(jù)包發(fā)送給網(wǎng)關(guān),網(wǎng)關(guān)通過路由協(xié)議再將數(shù)據(jù)發(fā)送到目標(biāo)設(shè)備上。所以這時(shí)候需要知道的地址就變成了
- 目標(biāo)設(shè)備的IP地址
- 網(wǎng)關(guān)的MAC地址
如圖,主機(jī)2想向主機(jī)4發(fā)送一條數(shù)據(jù),必須先將數(shù)據(jù)發(fā)送至網(wǎng)關(guān)A,由網(wǎng)關(guān)A通過路由協(xié)議查詢到主機(jī)4處于子網(wǎng)絡(luò)B,網(wǎng)關(guān)A會(huì)將數(shù)據(jù)發(fā)送給網(wǎng)關(guān)B,網(wǎng)關(guān)B再將數(shù)據(jù)發(fā)送給主機(jī)4,這樣便完成了主機(jī)2到主機(jī)4之間的通訊。
至此,我們應(yīng)該清楚了,在兩臺設(shè)備間通訊所必須的條件,首先我們需要判斷兩臺設(shè)備是否處在同一子網(wǎng)絡(luò)中,若在同一子網(wǎng)絡(luò),就可以利用ARP協(xié)議來獲取MAC地址,得到目標(biāo)IP和MAC地址,就可以發(fā)送數(shù)據(jù)。若不在同一子網(wǎng)絡(luò),則需要獲取網(wǎng)關(guān)的MAC地址,將數(shù)據(jù)發(fā)送到網(wǎng)關(guān),讓網(wǎng)關(guān)來轉(zhuǎn)發(fā)。現(xiàn)在我們就可以在互聯(lián)網(wǎng)上任意兩臺設(shè)備間通訊了。
(四)傳輸層
通過上面的介紹,我們已經(jīng)知道了兩臺設(shè)備之間是如何通訊的了,但是,當(dāng)你收到姑娘回給你微信消息的同時(shí),你的手機(jī)還在線播放著久石讓的《summer》,那么問題又來了,你的手機(jī)同時(shí)接收著兩種數(shù)據(jù),那系統(tǒng)為什么不會(huì)把微信的數(shù)據(jù)和網(wǎng)易云音樂的數(shù)據(jù)搞混呢?
不同的應(yīng)用程序在主機(jī)上發(fā)送或接收數(shù)據(jù),都要通過不同的端口(port),以此來確定數(shù)據(jù)包是歸那個(gè)應(yīng)用程序所有。
傳輸層的作用就是定義了端口到端口之間的通訊,最常用的協(xié)議是TCP協(xié)議。這個(gè)協(xié)議比較復(fù)雜,它可以保證數(shù)據(jù)不會(huì)丟失。常說的“三次握手”和“四次揮手”就是指TCP協(xié)議的建立和斷開,有時(shí)間的朋友可以更加深入的了解了解TCP協(xié)議。
(五)應(yīng)用層
雖然各個(gè)應(yīng)用程序都能拿到自己對應(yīng)的數(shù)據(jù),但是如果不對這些數(shù)據(jù)進(jìn)行規(guī)范,應(yīng)用程序也無法解讀。所以在應(yīng)用層出現(xiàn)很多協(xié)議,用來為應(yīng)用程序提供特定的數(shù)據(jù)服務(wù)接口,這些服務(wù)包括文件傳輸、文件管理以及電子郵件的信息處理等。例如瀏覽網(wǎng)頁需要HTTP協(xié)議、下載文件需要FTP協(xié)議,讀取郵件需要POP3協(xié)議等等。
最后,我們在來看一張圖,想一下互聯(lián)網(wǎng)每一層都主要做了什么
數(shù)據(jù)形式
在這個(gè)五層模型中,每一層都有其對應(yīng)的數(shù)據(jù),物理層的數(shù)據(jù)就是0和1,鏈路層將0和1序列化定義為“幀”,“幀”分為標(biāo)頭和數(shù)據(jù)兩部分。網(wǎng)絡(luò)層的數(shù)據(jù)為IP數(shù)據(jù)包,它也有頭部和數(shù)據(jù)兩部分,IP數(shù)據(jù)包是放在幀的數(shù)據(jù)部分中的。傳輸層中的TCP數(shù)據(jù)包也分為頭部和數(shù)據(jù)兩部分,它放在IP數(shù)據(jù)包的數(shù)據(jù)部分。應(yīng)用層的數(shù)據(jù)直接放在TCP數(shù)據(jù)包的數(shù)據(jù)部分。所以最終的數(shù)據(jù)形式就變成了以下形式
分層來看的話如下
總結(jié)
這片文章只是從基礎(chǔ)的角度簡單的介紹了互聯(lián)網(wǎng)通訊的大概原理,其中簡化了很多部分,實(shí)際通訊過程要比文章所寫復(fù)雜的多,要想弄清楚詳細(xì)的互聯(lián)網(wǎng)通訊過程,還需要對各個(gè)協(xié)議做更加深入的學(xué)習(xí)。文章參考了阮一峰老師的互聯(lián)網(wǎng)協(xié)議入門,阮老師這兩篇文章寫的都是通俗易懂,是互聯(lián)網(wǎng)協(xié)議入門的不二之選,本文若有描述不清楚的地方,大家可去閱讀阮老師的互聯(lián)網(wǎng)協(xié)議入門。本文是在初步學(xué)習(xí)了互聯(lián)網(wǎng)協(xié)議之后,自己做的一些總結(jié),文中若有不對之處,歡迎指正。