從物理層到MAC層
第一層(物理層)
網(wǎng)線
第二層(數(shù)據(jù)鏈路層)
Hub 采取的是廣播的模式饵骨,如果每一臺(tái)電腦發(fā)出的包居触,宿舍的每個(gè)電腦都能收到轮洋,那就麻煩了。這就需要解決幾個(gè)問(wèn)題:
- 這個(gè)包是發(fā)給誰(shuí)的祥楣?誰(shuí)應(yīng)該接收误褪?
- 大家都在發(fā)振坚,會(huì)不會(huì)產(chǎn)生混亂斋扰?有沒(méi)有誰(shuí)先發(fā)、誰(shuí)后發(fā)的規(guī)則屎鳍?
- 如果發(fā)送的時(shí)候出現(xiàn)了錯(cuò)誤逮壁,怎么辦窥淆?
這幾個(gè)問(wèn)題巍杈,都是第二層筷畦,數(shù)據(jù)鏈路層,也即 MAC 層要解決的問(wèn)題逆航。MAC 的全稱是 Medium Access Control因俐,即媒體訪問(wèn)控制赖瞒±敢控制什么呢袍嬉?其實(shí)就是控制在往媒體上發(fā)數(shù)據(jù)的時(shí)候灶平,誰(shuí)先發(fā)、誰(shuí)后發(fā)的問(wèn)題罐监。防止發(fā)生混亂弓柱。這解決的是第二個(gè)問(wèn)題矢空。這個(gè)問(wèn)題中的規(guī)則禀横,學(xué)名叫多路訪問(wèn)屁药。
三種方式:
方式一:分多個(gè)車道。每個(gè)車一個(gè)車道柏锄,你走你的酿箭,我走我的。這在計(jì)算機(jī)網(wǎng)絡(luò)里叫作信道劃分趾娃;
方式二:今天單號(hào)出行缭嫡,明天雙號(hào)出行,輪著來(lái)茫舶。這在計(jì)算機(jī)網(wǎng)絡(luò)里叫作輪流協(xié)議;
方式三:不管三七二十一,有事兒先出門讥耗,發(fā)現(xiàn)特堵有勾,就回去。錯(cuò)過(guò)高峰再出古程。我們叫作隨機(jī)接入?yún)f(xié)議蔼卡。著名的以太網(wǎng),用的就是這個(gè)方式挣磨。
接下來(lái)要解決第一個(gè)問(wèn)題:發(fā)給誰(shuí)雇逞,誰(shuí)接收?這里用到一個(gè)物理地址茁裙,叫作鏈路層地址塘砸。但是因?yàn)榈诙又饕鉀Q媒體接入控制的問(wèn)題,所以它常被稱為MAC 地址晤锥。
解決第一個(gè)問(wèn)題就牽扯到第二層的網(wǎng)絡(luò)包格式掉蔬。
對(duì)于以太網(wǎng),第二層的最后面是 CRC矾瘾,也就是循環(huán)冗余檢測(cè)女轿。通過(guò) XOR 異或的算法,來(lái)計(jì)算整個(gè)包是否在發(fā)送的過(guò)程中出現(xiàn)了錯(cuò)誤壕翩,主要解決第三個(gè)問(wèn)題蛉迹。
這里還有一個(gè)沒(méi)有解決的問(wèn)題,當(dāng)源機(jī)器知道目標(biāo)機(jī)器的時(shí)候放妈,可以將目標(biāo)地址放入包里面北救,如果不知道呢?一個(gè)廣播的網(wǎng)絡(luò)里面接入了 N 臺(tái)機(jī)器大猛,我怎么知道每個(gè) MAC 地址是誰(shuí)呢扭倾?這就是ARP 協(xié)議,也就是已知 IP 地址挽绩,求 MAC 地址的協(xié)議膛壹。
ARP 是通過(guò)吼的方式(廣播)來(lái)尋找目標(biāo) MAC 地址的,吼完之后記住一段時(shí)間唉堪,這個(gè)叫作緩存模聋。
誰(shuí)能知道目標(biāo) MAC 地址是否就是連接某個(gè)口的電腦的 MAC 地址呢?這就需要一個(gè)能把 MAC 頭拿下來(lái)唠亚,檢查一下目標(biāo) MAC 地址链方,然后根據(jù)策略轉(zhuǎn)發(fā)的設(shè)備,這個(gè)設(shè)備顯然是個(gè)二層設(shè)備灶搜,我們稱為交換機(jī)祟蚀。
交換機(jī)是有 MAC 地址學(xué)習(xí)能力的工窍,學(xué)完了它就知道誰(shuí)在哪兒了,不用廣播了前酿。(剛開始不知道的時(shí)候患雏,是需要廣播的)
交換機(jī)與VLAN
當(dāng)交換機(jī)的數(shù)目越來(lái)越多的時(shí)候,會(huì)遭遇環(huán)路問(wèn)題罢维,讓網(wǎng)絡(luò)包迷路淹仑,這就需要使用 STP 協(xié)議,通過(guò)華山論劍比武的方式肺孵,將有環(huán)路的圖變成沒(méi)有環(huán)路的樹匀借,從而解決環(huán)路問(wèn)題。
STP協(xié)議
在數(shù)據(jù)結(jié)構(gòu)中平窘,有一個(gè)方法叫做最小生成樹吓肋。有環(huán)的我們常稱為圖。將圖中的環(huán)破了初婆,就生成了樹蓬坡。在計(jì)算機(jī)網(wǎng)絡(luò)中,生成樹的算法叫作 STP磅叛,全稱 Spanning Tree Protocol。
STP 協(xié)議比較復(fù)雜萨赁,一開始很難看懂弊琴,但是其實(shí)這是一場(chǎng)血雨腥風(fēng)的武林比武或者華山論劍,最終決出五岳盟主的方式杖爽。
STP 協(xié)議里面的一些概念:
- Root Bridge敲董,也就是根交換機(jī)。這個(gè)比較容易理解慰安,可以比喻為“掌門”交換機(jī)腋寨,是某棵樹的老大,是掌門化焕,最大的大哥萄窜。
- Designated Bridges,有的翻譯為指定交換機(jī)撒桨。這個(gè)比較難理解查刻,可以想像成一個(gè)“小弟”,對(duì)于樹來(lái)說(shuō)凤类,就是一棵樹的樹枝穗泵。所謂“指定”的意思是,我拜誰(shuí)做大哥谜疤,其他交換機(jī)通過(guò)這個(gè)交換機(jī)到達(dá)根交換機(jī)佃延,也就相當(dāng)于拜他做了大哥现诀。這里注意是樹枝,不是葉子履肃,因?yàn)槿~子往往是主機(jī)仔沿。
- Bridge Protocol Data Units (BPDU) ,網(wǎng)橋協(xié)議數(shù)據(jù)單元榆浓∮谖矗可以比喻為“相互比較實(shí)力”的協(xié)議。行走江湖陡鹃,比的就是武功烘浦,拼的就是實(shí)力。當(dāng)兩個(gè)交換機(jī)碰見的時(shí)候萍鲸,也就是相連的時(shí)候闷叉,就需要互相比一比內(nèi)力了。BPDU 只有掌門能發(fā)脊阴,已經(jīng)隸屬于某個(gè)掌門的交換機(jī)只能傳達(dá)掌門的指示握侧。
- Priority Vector,優(yōu)先級(jí)向量嘿期∑非妫可以比喻為實(shí)力 (值越小越牛)。實(shí)力是啥备徐?就是一組 ID 數(shù)目萄传,[Root Bridge ID, Root Path Cost, Bridge ID, and Port ID]。為什么這樣設(shè)計(jì)呢蜜猾?這是因?yàn)橐丛趺磥?lái)比實(shí)力秀菱。先看 Root Bridge ID。拿出老大的 ID 看看蹭睡,發(fā)現(xiàn)掌門一樣衍菱,那就是師兄弟;再比 Root Path Cost肩豁,也即我距離我的老大的距離脊串,也就是拿和掌門關(guān)系比,看同一個(gè)門派內(nèi)誰(shuí)和老大關(guān)系鐵蓖救;最后比 Bridge ID洪规,比我自己的 ID,拿自己的本事比循捺。
交換機(jī)數(shù)目多會(huì)面臨隔離問(wèn)題斩例,可以通過(guò) VLAN 形成虛擬局域網(wǎng),從而解決廣播問(wèn)題和安全問(wèn)題从橘。
對(duì)于支持 VLAN 的交換機(jī)念赶,有一種口叫作 Trunk 口础钠。它可以轉(zhuǎn)發(fā)屬于任何 VLAN 的口。交換機(jī)之間可以通過(guò)這種口相互連接叉谜。
ICMP與ping
ping 是基于 ICMP 協(xié)議工作的旗吁。
ICMP 全稱 Internet Control Message Protocol,就是互聯(lián)網(wǎng)控制報(bào)文協(xié)議停局。
ICMP 報(bào)文是封裝在 IP 包里面的很钓。因?yàn)閭鬏斨噶畹臅r(shí)候,肯定需要源地址和目標(biāo)地址董栽。它本身非常簡(jiǎn)單码倦。因?yàn)樽鳛閭刹楸p裝上陣锭碳,不能攜帶大量的包袱袁稽。
ICMP 報(bào)文有很多的類型,不同的類型有不同的代碼擒抛。最常用的類型是主動(dòng)請(qǐng)求為 8推汽,主動(dòng)請(qǐng)求的應(yīng)答為 0。
- 查詢報(bào)文類型
常用的 ping 就是查詢報(bào)文歧沪,是一種主動(dòng)請(qǐng)求歹撒,并且獲得主動(dòng)應(yīng)答的 ICMP 協(xié)議。所以诊胞,ping 發(fā)的包也是符合 ICMP 協(xié)議格式的栈妆,只不過(guò)它在后面增加了自己的格式。
對(duì) ping 的主動(dòng)請(qǐng)求厢钧,進(jìn)行網(wǎng)絡(luò)抓包,稱為ICMP ECHO REQUEST嬉橙。同理主動(dòng)請(qǐng)求的回復(fù)早直,稱為ICMP ECHO REPLY。比起原生的 ICMP市框,這里面多了兩個(gè)字段霞扬,一個(gè)是標(biāo)識(shí)符。這個(gè)很好理解枫振,你派出去兩隊(duì)偵查兵喻圃,一隊(duì)是偵查戰(zhàn)況的,一隊(duì)是去查找水源的粪滤,要有個(gè)標(biāo)識(shí)才能區(qū)分斧拍。另一個(gè)是序號(hào),你派出去的偵查兵杖小,都要編個(gè)號(hào)肆汹。如果派出去 10 個(gè)愚墓,回來(lái) 10 個(gè),就說(shuō)明前方戰(zhàn)況不錯(cuò)昂勉;如果派出去 10 個(gè)浪册,回來(lái) 2 個(gè),說(shuō)明情況可能不妙岗照。在選項(xiàng)數(shù)據(jù)中村象,ping 還會(huì)存放發(fā)送請(qǐng)求的時(shí)間值,來(lái)計(jì)算往返時(shí)間攒至,說(shuō)明路程的長(zhǎng)短厚者。 - 差錯(cuò)報(bào)文類型
舉幾個(gè) ICMP 差錯(cuò)報(bào)文的例子:終點(diǎn)不可達(dá)為 3,源抑制為 4嗓袱,超時(shí)為 11籍救,重定向?yàn)?5。
ping:查詢報(bào)文類型的使用
ICMP總結(jié):
ICMP 相當(dāng)于網(wǎng)絡(luò)世界的偵察兵渠抹。我講了兩種類型的 ICMP 報(bào)文蝙昙,一種是主動(dòng)探查的查詢報(bào)文,一種異常報(bào)告的差錯(cuò)報(bào)文梧却;
ping 使用查詢報(bào)文奇颠,Traceroute 使用差錯(cuò)報(bào)文。
世界這么大放航,我想出網(wǎng)關(guān)
在進(jìn)行網(wǎng)卡配置的時(shí)候烈拒,除了 IP 地址,還需要配置一個(gè)Gateway 的東西广鳍,這個(gè)就是網(wǎng)關(guān)荆几。
MAC 頭和 IP 頭
一旦配置了 IP 地址和網(wǎng)關(guān),往往就能夠指定目標(biāo)地址進(jìn)行訪問(wèn)了赊时。由于在跨網(wǎng)關(guān)訪問(wèn)的時(shí)候吨铸,牽扯到 MAC 地址和 IP 地址的變化,這里有必要詳細(xì)描述一下 MAC 頭和 IP 頭的細(xì)節(jié)祖秒。
路由器是一臺(tái)設(shè)備诞吱,它有五個(gè)網(wǎng)口或者網(wǎng)卡,相當(dāng)于有五只手竭缝,分別連著五個(gè)局域網(wǎng)房维。每只手的 IP 地址都和局域網(wǎng)的 IP 地址相同的網(wǎng)段,每只手都是它握住的那個(gè)局域網(wǎng)的網(wǎng)關(guān)抬纸。
IP 頭和 MAC 頭哪些變咙俩、哪些不變?
對(duì)于 IP 頭和 MAC 頭哪些變松却、哪些不變的問(wèn)題暴浦,可以分兩種類型溅话。我把它們稱為“歐洲十國(guó)游”型和“玄奘西行”型。
之前我說(shuō)過(guò)歌焦,MAC 地址是一個(gè)局域網(wǎng)內(nèi)才有效的地址飞几。因而,MAC 地址只要過(guò)網(wǎng)關(guān)独撇,就必定會(huì)改變屑墨,因?yàn)橐呀?jīng)換了局域網(wǎng)。
兩者主要的區(qū)別在于 IP 地址是否改變纷铣。不改變 IP 地址的網(wǎng)關(guān)卵史,我們稱為轉(zhuǎn)發(fā)網(wǎng)關(guān);改變 IP 地址的網(wǎng)關(guān)搜立,我們稱為NAT 網(wǎng)關(guān)以躯。
網(wǎng)關(guān)總結(jié):
- 如果離開本局域網(wǎng),就需要經(jīng)過(guò)網(wǎng)關(guān)啄踊,網(wǎng)關(guān)是路由器的一個(gè)網(wǎng)口忧设;
- 路由器是一個(gè)三層設(shè)備,里面有如何尋找下一跳的規(guī)則颠通;
- 經(jīng)過(guò)路由器(網(wǎng)關(guān))之后 MAC 頭會(huì)變址晕。
如果 IP 不變,轉(zhuǎn)發(fā)網(wǎng)關(guān)顿锰,相當(dāng)于不換護(hù)照的歐洲旅游谨垃;
如果 IP 變,NAT 網(wǎng)關(guān)硼控,相當(dāng)于換護(hù)照的玄奘西行刘陶。
路由協(xié)議
路由分靜態(tài)路由和動(dòng)態(tài)路由,靜態(tài)路由可以配置復(fù)雜的策略路由牢撼,控制轉(zhuǎn)發(fā)策略易核;
動(dòng)態(tài)路由主流算法有兩種,距離矢量算法和鏈路狀態(tài)算法浪默。
路由算法一:距離矢量路由算法
距離矢量路由(distance vector routing)。它是基于 Bellman-Ford 算法的缀匕。
這種算法的基本思路是纳决,每個(gè)路由器都保存一個(gè)路由表,包含多行乡小,每行對(duì)應(yīng)網(wǎng)絡(luò)中的一個(gè)路由器阔加,每一行包含兩部分信息,一個(gè)是要到目標(biāo)路由器满钟,從那條線出去胜榔,另一個(gè)是到目標(biāo)路由器的距離胳喷。
由此可以看出,每個(gè)路由器都是知道全局信息的夭织。那這個(gè)信息如何更新呢吭露?每個(gè)路由器都知道自己和鄰居之間的距離,每過(guò)幾秒尊惰,每個(gè)路由器都將自己所知的到達(dá)所有的路由器的距離告知鄰居讲竿,每個(gè)路由器也能從鄰居那里得到相似的信息。
每個(gè)路由器根據(jù)新收集的信息弄屡,計(jì)算和其他路由器的距離题禀,比如自己的一個(gè)鄰居距離目標(biāo)路由器的距離是 M,而自己距離鄰居是 x膀捷,則自己距離目標(biāo)路由器是 x+M迈嘹。
這種算法存在的問(wèn)題:
第一個(gè)問(wèn)題:好消息傳得快,壞消息傳得慢全庸。
第二個(gè)問(wèn)題:每次發(fā)送的時(shí)候秀仲,要發(fā)送整個(gè)全局路由表。
所以上面的兩個(gè)問(wèn)題糕篇,限制了距離矢量路由的網(wǎng)絡(luò)規(guī)模啄育。
路由算法二:鏈路狀態(tài)路由算法
鏈路狀態(tài)路由(link state routing),基于 Dijkstra 算法拌消。
這種算法的基本思路是:當(dāng)一個(gè)路由器啟動(dòng)的時(shí)候挑豌,首先是發(fā)現(xiàn)鄰居,向鄰居 say hello墩崩,鄰居都回復(fù)氓英。然后計(jì)算和鄰居的距離,發(fā)送一個(gè) echo鹦筹,要求馬上返回铝阐,除以二就是距離。然后將自己和鄰居之間的鏈路狀態(tài)包廣播出去铐拐,發(fā)送到整個(gè)網(wǎng)絡(luò)的每個(gè)路由器徘键。這樣每個(gè)路由器都能夠收到它和鄰居之間的關(guān)系的信息。因而遍蟋,每個(gè)路由器都能在自己本地構(gòu)建一個(gè)完整的圖吹害,然后針對(duì)這個(gè)圖使用 Dijkstra 算法,找到兩點(diǎn)之間的最短路徑虚青。
不像距離距離矢量路由協(xié)議那樣它呀,更新時(shí)發(fā)送整個(gè)路由表。鏈路狀態(tài)路由協(xié)議只廣播更新的或改變的網(wǎng)絡(luò)拓?fù)洌@使得更新信息更小纵穿,節(jié)省了帶寬和 CPU 利用率下隧。而且一旦一個(gè)路由器掛了,它的鄰居都會(huì)廣播這個(gè)消息谓媒,可以使得壞消息迅速收斂淆院。
動(dòng)態(tài)路由協(xié)議
基于兩種算法產(chǎn)生兩種協(xié)議,BGP 協(xié)議和 OSPF 協(xié)議篙耗。
1. 基于鏈路狀態(tài)路由算法的 OSPF
OSPF(Open Shortest Path First迫筑,開放式最短路徑優(yōu)先)就是這樣一個(gè)基于鏈路狀態(tài)路由協(xié)議,廣泛應(yīng)用在數(shù)據(jù)中心中的協(xié)議宗弯。由于主要用在數(shù)據(jù)中心內(nèi)部脯燃,用于路由決策,因而稱為內(nèi)部網(wǎng)關(guān)協(xié)議(Interior Gateway Protocol蒙保,簡(jiǎn)稱 IGP)辕棚。
內(nèi)部網(wǎng)關(guān)協(xié)議的重點(diǎn)就是找到最短的路徑。在一個(gè)組織內(nèi)部邓厕,路徑最短往往最優(yōu)逝嚎。當(dāng)然有時(shí)候 OSPF 可以發(fā)現(xiàn)多個(gè)最短的路徑,可以在這多個(gè)路徑中進(jìn)行負(fù)載均衡详恼,這常常被稱為等價(jià)路由补君。
2. 基于距離矢量路由算法的 BGP
但是外網(wǎng)的路由協(xié)議,也即國(guó)家之間的昧互,又有所不同挽铁。我們稱為外網(wǎng)路由協(xié)議(Border Gateway Protocol,簡(jiǎn)稱 BGP)敞掘。
在網(wǎng)絡(luò)世界叽掘,這一個(gè)個(gè)國(guó)家成為自治系統(tǒng) AS(Autonomous System)。自治系統(tǒng)分幾種類型玖雁。
- Stub AS:對(duì)外只有一個(gè)連接更扁。這類 AS 不會(huì)傳輸其他 AS 的包。例如赫冬,個(gè)人或者小公司的網(wǎng)絡(luò)浓镜。
- Multihomed AS:可能有多個(gè)連接連到其他的 AS,但是大多拒絕幫其他的 AS 傳輸包劲厌。例如一些大公司的網(wǎng)絡(luò)竖哩。
- Transit AS:有多個(gè)連接連到其他的 AS,并且可以幫助其他的 AS 傳輸包脊僚。例如主干網(wǎng)。
每個(gè)自治系統(tǒng)都有邊界路由器,通過(guò)它和外面的世界建立聯(lián)系辽幌。
BGP 又分為兩類增淹,eBGP 和 iBGP。自治系統(tǒng)間乌企,邊界路由器之間使用 eBGP 廣播路由虑润。內(nèi)部網(wǎng)絡(luò)也需要訪問(wèn)其他的自治系統(tǒng)。邊界路由器如何將 BGP 學(xué)習(xí)到的路由導(dǎo)入到內(nèi)部網(wǎng)絡(luò)呢加酵?就是通過(guò)運(yùn)行 iBGP拳喻,使得內(nèi)部的路由器能夠找到到達(dá)外網(wǎng)目的地的最好的邊界路由器。
BGP 協(xié)議使用的算法是路徑矢量路由協(xié)議(path-vector protocol)猪腕。它是距離矢量路由協(xié)議的升級(jí)版冗澈。
前面說(shuō)了距離矢量路由協(xié)議的缺點(diǎn)。其中一個(gè)是收斂慢陋葡。在 BGP 里面亚亲,除了下一跳 hop 之外,還包括了自治系統(tǒng) AS 的路徑腐缤,從而可以避免壞消息傳得慢的問(wèn)題捌归,也即上面所描述的,B 知道 C 原來(lái)能夠到達(dá) A岭粤,是因?yàn)橥ㄟ^(guò)自己惜索,一旦自己都到達(dá)不了 A 了,就不用假設(shè) C 還能到達(dá) A 了剃浇。
另外巾兆,在路徑中將一個(gè)自治系統(tǒng)看成一個(gè)整體,不區(qū)分自治系統(tǒng)內(nèi)部的路由器偿渡,這樣自治系統(tǒng)的數(shù)目是非常有限的臼寄。就像大家都能記住出去玩,從中國(guó)出發(fā)先到韓國(guó)然后到日本溜宽,只要不計(jì)算細(xì)到具體哪一站吉拳,就算是發(fā)送全局信息,也是沒(méi)有問(wèn)題的适揉。
參考:
極客時(shí)間-趣談網(wǎng)絡(luò)協(xié)議
極客時(shí)間-趣談網(wǎng)絡(luò)協(xié)議
極客時(shí)間-趣談網(wǎng)絡(luò)協(xié)議
極客時(shí)間-趣談網(wǎng)絡(luò)協(xié)議-網(wǎng)關(guān)