有沒有想過互聯(lián)網(wǎng)相隔N公里路的兩臺(tái)計(jì)算機(jī)挣轨,是如何進(jìn)行數(shù)據(jù)的傳輸?shù)模吭诔汕先f臺(tái)的計(jì)算機(jī)中芙粱,一臺(tái)計(jì)算機(jī)是如何正確著找到另外一個(gè)計(jì)算機(jī),并把數(shù)據(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é)組裝工作,組裝完后把剩余的工作交給打包裝的人來處理…不撑。
對(duì)于互聯(lián)網(wǎng)數(shù)據(jù)傳送的分層模型文兢,有分成七層的,5層的焕檬,還有分成4層的姆坚。例如分成七層模型的如下:
1.應(yīng)用層-->2.表示層-->3.會(huì)話層-->4.傳輸層-->5.網(wǎng)絡(luò)層-->6.數(shù)據(jù)鏈路層-->7.物理層。
七層中实愚,越往下越靠近計(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)行傳送寺枉。例如多少個(gè)電信號(hào)為一組,每一組信號(hào)應(yīng)該如何標(biāo)識(shí)才能讓計(jì)算機(jī)讀懂等绷落。
數(shù)據(jù)鏈路層工作在物理層之上姥闪,負(fù)責(zé)給這些0,1制定傳送的規(guī)則,然后另一方再按照相應(yīng)的規(guī)則來進(jìn)行解讀砌烁。
以太網(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)行傳送。
對(duì)于表頭和數(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é)長度是固定的嗎番甩?答案是肯定的侵贵,假如不固定,每個(gè)楨都是單獨(dú)發(fā)送缘薛,那計(jì)算機(jī)怎么知道標(biāo)頭是幾個(gè)字節(jié)窍育,數(shù)據(jù)是幾個(gè)字節(jié)。所以標(biāo)頭部分的字節(jié)是固定并且定為18個(gè)字節(jié)宴胧。
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í)了拷肌。
廣播與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地址對(duì)比木张,如果兩者相同众辨,則接受這個(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)行對(duì)比再舍棄。世界上有那么多它計(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ù)傳送給對(duì)方,如果不是同一個(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é)解決的問題。
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地址)。對(duì)方收到這個(gè)數(shù)據(jù)包之后文兑,會(huì)取出IP地址與自身的對(duì)比盒刚,如果相同,則把自己的MAC地址回復(fù)給對(duì)方绿贞,否則就丟棄這個(gè)數(shù)據(jù)包因块。這樣,計(jì)算機(jī)A就能知道計(jì)算機(jī)B的MAC地址了樟蠕。
可能有人會(huì)問贮聂,知道了MAC地址之后,發(fā)送數(shù)據(jù)是通過廣播的形式發(fā)送寨辩,詢問對(duì)方的MAC地址也是通過廣播的形式來發(fā)送吓懈,那其他計(jì)算機(jī)怎么知道你是要傳送數(shù)據(jù)還是要詢問MAC地址呢?其實(shí)在詢問MAC地址的數(shù)據(jù)包中靡狞,在對(duì)方的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è)問題,我們是如何知道對(duì)方計(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è)域名對(duì)應(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è)家伙就上場了槽惫,也就是說,我們?cè)趶挠?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í)呢,對(duì)于有些傳輸協(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)的資料琴锭。