以太網(wǎng)協(xié)議,依靠MAC地址發(fā)送數(shù)據(jù)。理論上,單單依靠MAC地址,上海的網(wǎng)卡就可以找到洛杉磯的網(wǎng)卡了,技術(shù)上是可以實(shí)現(xiàn)的。
但是,這樣做有一個(gè)重大的缺點(diǎn)。以太網(wǎng)采用廣播方式發(fā)送數(shù)據(jù)包,所有成員人手一"包",不僅效率低,而且局限在發(fā)送者所在的子網(wǎng)絡(luò)。也就是說(shuō),如果兩臺(tái)計(jì)算機(jī)不在同一個(gè)子網(wǎng)絡(luò),廣播是傳不過(guò)去的。這種設(shè)計(jì)是合理的,否則互聯(lián)網(wǎng)上每一臺(tái)計(jì)算機(jī)都會(huì)收到所有包,那會(huì)引起災(zāi)難。
互聯(lián)網(wǎng)是無(wú)數(shù)子網(wǎng)絡(luò)共同組成的一個(gè)巨型網(wǎng)絡(luò),很像想象上海和洛杉磯的電腦會(huì)在同一個(gè)子網(wǎng)絡(luò),這幾乎是不可能的。
因此,必須找到一種方法,能夠區(qū)分哪些MAC地址屬于同一個(gè)子網(wǎng)絡(luò),哪些不是。如果是同一個(gè)子網(wǎng)絡(luò),就采用廣播方式發(fā)送,否則就采用"路由"方式發(fā)送。("路由"的意思,就是指如何向不同的子網(wǎng)絡(luò)分發(fā)數(shù)據(jù)包,這是一個(gè)很大的主題,本文不涉及。)遺憾的是,MAC地址本身無(wú)法做到這一點(diǎn)。它只與廠商有關(guān),與所處網(wǎng)絡(luò)無(wú)關(guān)。
這就導(dǎo)致了"網(wǎng)絡(luò)層"的誕生。它的作用是引進(jìn)一套新的地址,使得我們能夠區(qū)分不同的計(jì)算機(jī)是否屬于同一個(gè)子網(wǎng)絡(luò)。這套地址就叫做"網(wǎng)絡(luò)地址",簡(jiǎn)稱"網(wǎng)址"。
于是,"網(wǎng)絡(luò)層"出現(xiàn)以后,每臺(tái)計(jì)算機(jī)有了兩種地址,一種是MAC地址,另一種是網(wǎng)絡(luò)地址。兩種地址之間沒(méi)有任何聯(lián)系,MAC地址是綁定在網(wǎng)卡上的,網(wǎng)絡(luò)地址則是管理員分配的,它們只是隨機(jī)組合在一起。
網(wǎng)絡(luò)地址幫助我們確定計(jì)算機(jī)所在的子網(wǎng)絡(luò),MAC地址則將數(shù)據(jù)包送到該子網(wǎng)絡(luò)中的目標(biāo)網(wǎng)卡。因此,從邏輯上可以推斷,必定是先處理網(wǎng)絡(luò)地址,然后再處理MAC地址。
規(guī)定網(wǎng)絡(luò)地址的協(xié)議,叫做IP協(xié)議。它所定義的地址,就被稱為IP地址。
目前,廣泛采用的是IP協(xié)議第四版,簡(jiǎn)稱IPv4。這個(gè)版本規(guī)定,網(wǎng)絡(luò)地址由32個(gè)二進(jìn)制位組成。
習(xí)慣上,我們用分成四段的十進(jìn)制數(shù)表示IP地址,從0.0.0.0一直到255.255.255.255。
互聯(lián)網(wǎng)上的每一臺(tái)計(jì)算機(jī),都會(huì)分配到一個(gè)IP地址。這個(gè)地址分成兩個(gè)部分,前一部分代表網(wǎng)絡(luò),后一部分代表主機(jī)。比如,IP地址172.16.254.1,這是一個(gè)32位的地址,假定它的網(wǎng)絡(luò)部分是前24位(172.16.254),那么主機(jī)部分就是后8位(最后的那個(gè)1)。處于同一個(gè)子網(wǎng)絡(luò)的電腦,它們IP地址的網(wǎng)絡(luò)部分必定是相同的,也就是說(shuō)172.16.254.2應(yīng)該與172.16.254.1處在同一個(gè)子網(wǎng)絡(luò)。
但是,問(wèn)題在于單單從IP地址,我們無(wú)法判斷網(wǎng)絡(luò)部分。還是以172.16.254.1為例,它的網(wǎng)絡(luò)部分,到底是前24位,還是前16位,甚至前28位,從IP地址上是看不出來(lái)的。
那么,怎樣才能從IP地址,判斷兩臺(tái)計(jì)算機(jī)是否屬于同一個(gè)子網(wǎng)絡(luò)呢?這就要用到另一個(gè)參數(shù)"子網(wǎng)掩碼"(subnet mask)。
所謂"子網(wǎng)掩碼",就是表示子網(wǎng)絡(luò)特征的一個(gè)參數(shù)。它在形式上等同于IP地址,也是一個(gè)32位二進(jìn)制數(shù)字,它的網(wǎng)絡(luò)部分全部為1,主機(jī)部分全部為0。比如,IP地址172.16.254.1,如果已知網(wǎng)絡(luò)部分是前24位,主機(jī)部分是后8位,那么子網(wǎng)絡(luò)掩碼就是11111111.11111111.11111111.00000000,寫(xiě)成十進(jìn)制就是255.255.255.0。
知道"子網(wǎng)掩碼",我們就能判斷,任意兩個(gè)IP地址是否處在同一個(gè)子網(wǎng)絡(luò)。方法是將兩個(gè)IP地址與子網(wǎng)掩碼分別進(jìn)行AND運(yùn)算(兩個(gè)數(shù)位都為1,運(yùn)算結(jié)果為1,否則為0),然后比較結(jié)果是否相同,如果是的話,就表明它們?cè)谕粋€(gè)子網(wǎng)絡(luò)中,否則就不是。
比如,已知IP地址172.16.254.1和172.16.254.233的子網(wǎng)掩碼都是255.255.255.0,請(qǐng)問(wèn)它們是否在同一個(gè)子網(wǎng)絡(luò)??jī)烧吲c子網(wǎng)掩碼分別進(jìn)行AND運(yùn)算,結(jié)果都是172.16.254.0,因此它們?cè)谕粋€(gè)子網(wǎng)絡(luò)。
總結(jié)一下,IP協(xié)議的作用主要有兩個(gè),一個(gè)是為每一臺(tái)計(jì)算機(jī)分配IP地址,另一個(gè)是確定哪些地址在同一個(gè)子網(wǎng)絡(luò)。
根據(jù)IP協(xié)議發(fā)送的數(shù)據(jù),就叫做IP數(shù)據(jù)包。不難想象,其中必定包括IP地址信息。
但是前面說(shuō)過(guò),以太網(wǎng)數(shù)據(jù)包只包含MAC地址,并沒(méi)有IP地址的欄位。那么是否需要修改數(shù)據(jù)定義,再添加一個(gè)欄位呢?
回答是不需要,我們可以把IP數(shù)據(jù)包直接放進(jìn)以太網(wǎng)數(shù)據(jù)包的"數(shù)據(jù)"部分,因此完全不用修改以太網(wǎng)的規(guī)格。這就是互聯(lián)網(wǎng)分層結(jié)構(gòu)的好處:上層的變動(dòng)完全不涉及下層的結(jié)構(gòu)。
具體來(lái)說(shuō),IP數(shù)據(jù)包也分為"標(biāo)頭"和"數(shù)據(jù)"兩個(gè)部分。
"標(biāo)頭"部分主要包括版本、長(zhǎng)度、IP地址等信息,"數(shù)據(jù)"部分則是IP數(shù)據(jù)包的具體內(nèi)容。它放進(jìn)以太網(wǎng)數(shù)據(jù)包后,以太網(wǎng)數(shù)據(jù)包就變成了下面這樣。
IP數(shù)據(jù)包的"標(biāo)頭"部分的長(zhǎng)度為20到60字節(jié),整個(gè)數(shù)據(jù)包的總長(zhǎng)度最大為65,535字節(jié)。因此,理論上,一個(gè)IP數(shù)據(jù)包的"數(shù)據(jù)"部分,最長(zhǎng)為65,515字節(jié)。前面說(shuō)過(guò),以太網(wǎng)數(shù)據(jù)包的"數(shù)據(jù)"部分,最長(zhǎng)只有1500字節(jié)。因此,如果IP數(shù)據(jù)包超過(guò)了1500字節(jié),它就需要分割成幾個(gè)以太網(wǎng)數(shù)據(jù)包,分開(kāi)發(fā)送了。
關(guān)于"網(wǎng)絡(luò)層",還有最后一點(diǎn)需要說(shuō)明。
因?yàn)镮P數(shù)據(jù)包是放在以太網(wǎng)數(shù)據(jù)包里發(fā)送的,所以我們必須同時(shí)知道兩個(gè)地址,一個(gè)是對(duì)方的MAC地址,另一個(gè)是對(duì)方的IP地址。通常情況下,對(duì)方的IP地址是已知的(后文會(huì)解釋),但是我們不知道它的MAC地址。
所以,我們需要一種機(jī)制,能夠從IP地址得到MAC地址。
這里又可以分成兩種情況。第一種情況,如果兩臺(tái)主機(jī)不在同一個(gè)子網(wǎng)絡(luò),那么事實(shí)上沒(méi)有辦法得到對(duì)方的MAC地址,只能把數(shù)據(jù)包傳送到兩個(gè)子網(wǎng)絡(luò)連接處的"網(wǎng)關(guān)"(gateway),讓網(wǎng)關(guān)去處理。
第二種情況,如果兩臺(tái)主機(jī)在同一個(gè)子網(wǎng)絡(luò),那么我們可以用ARP協(xié)議,得到對(duì)方的MAC地址。ARP協(xié)議也是發(fā)出一個(gè)數(shù)據(jù)包(包含在以太網(wǎng)數(shù)據(jù)包中),其中包含它所要查詢主機(jī)的IP地址,在對(duì)方的MAC地址這一欄,填的是FF:FF:FF:FF:FF:FF,表示這是一個(gè)"廣播"地址。它所在子網(wǎng)絡(luò)的每一臺(tái)主機(jī),都會(huì)收到這個(gè)數(shù)據(jù)包,從中取出IP地址,與自身的IP地址進(jìn)行比較。如果兩者相同,都做出回復(fù),向?qū)Ψ綀?bào)告自己的MAC地址,否則就丟棄這個(gè)包。
總之,有了ARP協(xié)議之后,我們就可以得到同一個(gè)子網(wǎng)絡(luò)內(nèi)的主機(jī)MAC地址,可以把數(shù)據(jù)包發(fā)送到任意一臺(tái)主機(jī)之上了。
更多建議: