網(wǎng)關(guān),路由,其實我們每個人上網(wǎng)都是需要的,但是具體的原理是不是得安排下。 重學網(wǎng)絡(luò)系列之(HTTP的前世今生) 重學網(wǎng)絡(luò)系列之(我的名字叫IP) 人生一世,如鏡花水月,今朝姹紫嫣紅,明日已成夢幻泡影。與其追憶故園芳菲,莫不如放下繁華,重覓一片竹海。一支瘦笛,一曲笑傲江湖。一彎冷月,一肩千古情仇。 ICMP和Ping 基本上我們都碰到過網(wǎng)絡(luò)連不上的問題,那臺機器明明就在那里,你甚至都可以通過機器的終端連上去看。它看著好好的,可是就是連不上去,究竟是哪里出了問題呢 一般來說我們都會想到用Ping,那你知道Ping是如何工作的嗎? ping是基于ICMP協(xié)議工作的。ICMP全稱InternetControlMessageProtocol,就是互聯(lián)網(wǎng)控制報文協(xié)議。這里面的關(guān)鍵詞是“控制”,那具體是怎么控制的呢? ICMP協(xié)議是一個網(wǎng)絡(luò)層協(xié)議。 一個新搭建好的網(wǎng)絡(luò),往往需要先進行一個簡單的測試,來驗證網(wǎng)絡(luò)是否暢通;但是IP協(xié)議并不提供可靠傳輸。如果丟包了,IP協(xié)議并不能通知傳輸層是否丟包以及丟包的原因。所以我們就需要一種協(xié)議來完成這樣的功能–ICMP協(xié)議。 ICMP協(xié)議的功能 確認IP包是否成功到達目標地址 通知在發(fā)送過程中IP包被丟棄的原因 我們需要注意幾點: ICMP是基于IP協(xié)議工作的,但是它并不是傳輸層的功能,因此仍然把它歸結(jié)為網(wǎng)絡(luò)層協(xié)議 ICMP只能搭配IPv4使用,如果是IPv6的情況下,需要是用ICMPv6 ICMP協(xié)議的格式 ICMP報文包含在IP數(shù)據(jù)報中,IP報頭在ICMP報文的最前面。一個ICMP報文包括IP報頭(至少20字節(jié))、ICMP報頭(至少八字節(jié))和ICMP報文(屬于ICMP報文的數(shù)據(jù)部分)。當IP報頭中的協(xié)議字段值為1時,就說明這是一個ICMP報文。ICMP報頭如下圖所示。 ![]() 點擊加載圖片 ping的發(fā)送和接收過程。 ![]() 點擊加載圖片 假定主機A的IP地址是192.168.1.1,主機B的IP地址是192.168.1.2,它們都在同一個子網(wǎng)。那當你在主機A上運行“ping192.168.1.2”后,會發(fā)生什么呢? ping命令執(zhí)行的時候,源主機首先會構(gòu)建一個ICMP請求數(shù)據(jù)包,ICMP數(shù)據(jù)包內(nèi)包含多個字段。最重要的是兩個,第一個是類型字段,對于請求數(shù)據(jù)包而言該字段為8;另外一個是順序號,主要用于區(qū)分連續(xù)ping的時候發(fā)出的多個數(shù)據(jù)包。每發(fā)出一個請求數(shù)據(jù)包,順序號會自動加1。為了能夠計算往返時間RTT,它會在報文的數(shù)據(jù)部分插入發(fā)送時間。 然后,由ICMP協(xié)議將這個數(shù)據(jù)包連同地址192.168.1.2一起交給IP層。IP層將以192.168.1.2作為目的地址,本機IP地址作為源地址,加上一些其他控制信息,構(gòu)建一個IP數(shù)據(jù)包。 接下來,需要加入MAC頭。如果在本節(jié)ARP映射表中查找出IP地址192.168.1.2所對應(yīng)的MAC地址,則可以直接使用;如果沒有,則需要發(fā)送ARP協(xié)議查詢MAC地址,獲得MAC地址后,由數(shù)據(jù)鏈路層構(gòu)建一個數(shù)據(jù)幀,目的地址是IP層傳過來的MAC地址,源地址則是本機的MAC地址;還要附加上一些控制信息,依據(jù)以太網(wǎng)的介質(zhì)訪問規(guī)則,將它們傳送出去。 主機B收到這個數(shù)據(jù)幀后,先檢查它的目的MAC地址,并和本機的MAC地址對比,如符合,則接收,否則就丟棄。接收后檢查該數(shù)據(jù)幀,將IP數(shù)據(jù)包從幀中提取出來,交給本機的IP層。同樣,IP層檢查后,將有用的信息提取后交給ICMP協(xié)議。 主機B會構(gòu)建一個ICMP應(yīng)答包,應(yīng)答數(shù)據(jù)包的類型字段為0,順序號為接收到的請求數(shù)據(jù)包中的順序號,然后再發(fā)送出去給主機A。在規(guī)定的時候間內(nèi),源主機如果沒有接到ICMP的應(yīng)答包,則說明目標主機不可達;如果接收到了ICMP應(yīng)答包,則說明目標主機可達。 MAC頭和IP頭的細節(jié) 一旦配置了IP地址和網(wǎng)關(guān),往往就能夠指定目標地址進行訪問了。由于在跨網(wǎng)關(guān)訪問的時候,牽扯到MAC地址和IP地址的變化,這里有必要詳細描述一下MAC頭和IP頭的細節(jié)。 ![]() 點擊加載圖片 在MAC頭里面,先是目標MAC地址,然后是源MAC地址,然后有一個協(xié)議類型,用來說明里面是IP協(xié)議。IP頭里面的版本號,目前主流的還是IPv4,這里到了下一層的協(xié)議,也就是,是TCP還是UDP。最重要的就是源IP和目標IP。先是源IP地址,然后是目標IP地址。 在任何一臺機器上,當要訪問另一個IP地址的時候,都會先判斷,這個目標IP地址,和當前機器的IP地址,是否在同一個網(wǎng)段。怎么判斷同一個網(wǎng)段呢?需要CIDR和子網(wǎng)掩碼。 如果是同一個網(wǎng)段,例如,你訪問你旁邊的兄弟的電腦,那就沒網(wǎng)關(guān)什么事情,直接將源地址和目標地址放入IP頭中,然后通過ARP獲得MAC地址,將源MAC和目的MAC放入MAC頭中,發(fā)出去就可以了。 如果不是同一網(wǎng)段,例如,你要訪問你們校園網(wǎng)里面的BBS,該怎么辦?這就需要發(fā)往默認網(wǎng)關(guān)Gateway。Gateway的地址一定是和源IP地址是一個網(wǎng)段的。往往不是第一個,就是第二個。例如192.168.1.0/24這個網(wǎng)段,Gateway往往會是192.168.1.1/24或者192.168.1.2/24。 如何發(fā)往默認網(wǎng)關(guān)呢?網(wǎng)關(guān)不是和源IP地址是一個網(wǎng)段的么?這個過程就和發(fā)往同一個網(wǎng)段的其他機器是一樣的:將源地址和目標IP地址放入IP頭中,通過ARP獲得網(wǎng)關(guān)的MAC地址,將源MAC和網(wǎng)關(guān)的MAC放入MAC頭中,發(fā)送出去。網(wǎng)關(guān)所在的端口,例如192.168.1.1/24將網(wǎng)絡(luò)包收進來,然后接下來怎么做,就完全看網(wǎng)關(guān)的了。 網(wǎng)關(guān)往往是一個路由器,是一個三層轉(zhuǎn)發(fā)的設(shè)備。啥叫三層設(shè)備?前面也說過了,就是把MAC頭和IP頭都取下來,然后根據(jù)里面的內(nèi)容,看看接下來把包往哪里轉(zhuǎn)發(fā)的設(shè)備。 很多情況下,人們把網(wǎng)關(guān)就叫作路由器。其實不完全準確,而另一種比喻更加恰當:路由器是一臺設(shè)備,它有五個網(wǎng)口或者網(wǎng)卡,相當于有五只手,分別連著五個局域網(wǎng)。每只手的IP地址都和局域網(wǎng)的IP地址相同的網(wǎng)段,每只手都是它握住的那個局域網(wǎng)的網(wǎng)關(guān)。 任何一個想發(fā)往其他局域網(wǎng)的包,都會到達其中一只手,被拿進來,拿下MAC頭和IP頭,看看,根據(jù)自己的路由算法,選擇另一只手,加上IP頭和MAC頭,然后扔出去。 IP頭和MAC頭哪些變、哪些不變? MAC地址是一個局域網(wǎng)內(nèi)才有效的地址。因而,MAC地址只要過網(wǎng)關(guā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)。 結(jié)合下面的圖 ![]() 點擊加載圖片 服務(wù)器A要訪問服務(wù)器B。首先,服務(wù)器A會思考,192.168.4.101和我不是一個網(wǎng)段的,因而需要先發(fā)給網(wǎng)關(guān)。那網(wǎng)關(guān)是誰呢?已經(jīng)靜態(tài)配置好了,網(wǎng)關(guān)是192.168.1.1。網(wǎng)關(guān)的MAC地址是多少呢?發(fā)送ARP獲取網(wǎng)關(guān)的MAC地址,然后發(fā)送包。包的內(nèi)容是這樣的: 源MAC:服務(wù)器A的MAC 目標MAC:192.168.1.1這個網(wǎng)口的MAC 源IP:192.168.1.101 目標IP:192.168.4.101 包到達192.168.1.1這個網(wǎng)口,發(fā)現(xiàn)MAC一致,將包收進來,開始思考往哪里轉(zhuǎn)發(fā)。 在路由器A中配置了靜態(tài)路由之后,要想訪問192.168.4.0/24,要從192.168.56.1這個口出去,下一跳為192.168.56.2。 于是,路由器A思考的時候,匹配上了這條路由,要從192.168.56.1這個口發(fā)出去,發(fā)給192.168.56.2,那192.168.56.2的MAC地址是多少呢?路由器A發(fā)送ARP獲取192.168.56.2的MAC地址,然后發(fā)送包。包的內(nèi)容是這樣的: 源MAC:192.168.56.1的MAC地址 目標MAC:192.168.56.2的MAC地址 源IP:192.168.1.101 目標IP:192.168.4.101 包到達192.168.56.2這個網(wǎng)口,發(fā)現(xiàn)MAC一致,將包收進來,開始思考往哪里轉(zhuǎn)發(fā)。在路由器B中配置了靜態(tài)路由,要想訪問192.168.4.0/24,要從192.168.4.1這個口出去,沒有下一跳了。因為我右手這個網(wǎng)卡,就是這個網(wǎng)段的,我是最后一跳了。 于是,路由器B思考的時候,匹配上了這條路由,要從192.168.4.1這個口發(fā)出去,發(fā)給192.168.4.101。那192.168.4.101的MAC地址是多少呢?路由器B發(fā)送ARP獲取192.168.4.101的MAC地址,然后發(fā)送包。包的內(nèi)容是這樣的: 源MAC:192.168.4.1的MAC地址 目標MAC:192.168.4.101的MAC地址 源IP:192.168.1.101 目標IP:192.168.4.101 包到達服務(wù)器B,MAC地址匹配,將包收進來。 通過這個過程可以看出,每到一個新的局域網(wǎng),MAC都是要變的,但是IP地址都不變。在IP頭里面,不會保存任何網(wǎng)關(guān)的IP地址。所謂的下一跳是,某個IP要將這個IP地址轉(zhuǎn)換為MAC放入MAC頭。 上面的過程遇到的問題 大家想想看哈,局域網(wǎng)之間沒有商量過,各定各的網(wǎng)段,因而IP段沖突了,如下圖 ![]() 點擊加載圖片 最左面的地址是192.168.1.101,最右面的地址也是192.168.1.101,如果單從IP地址上看,簡直是自己訪問自己,其實是192.168.1.101要訪問192.168.1.101 怎么解決這個問題呢?既然局域網(wǎng)之間沒有商量過,你們各管各的,那到國際上,也即中間的局域網(wǎng)里面,就需要使用另外的地址。就像出國,不能用咱們自己的身份證,而要改用護照一樣,而不能用自己國家的身份證。 首先,目標服務(wù)器B在國際上要有一個國際的身份,我們給它一個192.168.56.2。在網(wǎng)關(guān)B上,我們記下來,國際身份192.168.56.2對應(yīng)國內(nèi)身份192.168.1.101。凡是要訪問192.168.56.2,都轉(zhuǎn)成192.168.1.101。 于是,源服務(wù)器A要訪問目標服務(wù)器B,要指定的目標地址為192.168.56.2。這是它的國際身份。服務(wù)器A想,192.168.56.2和我不是一個網(wǎng)段的,因而需要發(fā)給網(wǎng)關(guān),網(wǎng)關(guān)是誰?已經(jīng)靜態(tài)配置好了,網(wǎng)關(guān)是192.168.1.1,網(wǎng)關(guān)的MAC地址是多少?發(fā)送ARP獲取網(wǎng)關(guān)的MAC地址,然后發(fā)送包。包的內(nèi)容是這樣的: 源MAC:服務(wù)器A的MAC 目標MAC:192.168.1.1這個網(wǎng)口的MAC 源IP:192.168.1.101 目標IP:192.168.56.2 包到達192.168.1.1這個網(wǎng)口,發(fā)現(xiàn)MAC一致,將包收進來,開始思考往哪里轉(zhuǎn)發(fā)。 在路由器A中配置了靜態(tài)路由:要想訪問192.168.56.2/24,要從192.168.56.1這個口出去,沒有下一跳了,因為我右手這個網(wǎng)卡,就是這個網(wǎng)段的,我是最后一跳了。 于是,路由器A思考的時候,匹配上了這條路由,要從192.168.56.1這個口發(fā)出去,發(fā)給192.168.56.2。那192.168.56.2的MAC地址是多少呢?路由器A發(fā)送ARP獲取192.168.56.2的MAC地址。 當網(wǎng)絡(luò)包發(fā)送到中間的局域網(wǎng)的時候,服務(wù)器A也需要有個國際身份,因而在國際上,源IP地址也不能用192.168.1.101,需要改成192.168.56.1。發(fā)送包的內(nèi)容是這樣的: MAC:192.168.56.1的MAC地址 標MAC:192.168.56.2的MAC地址 IP:192.168.56.1 標IP:192.168.56.2 包到達192.168.56.2這個網(wǎng)口,發(fā)現(xiàn)MAC一致,將包收進來,開始思考往哪里轉(zhuǎn)發(fā)。路由器B是一個NAT網(wǎng)關(guān),它上面配置了,要訪問國際身份192.168.56.2對應(yīng)國內(nèi)身份192.168.1.101,于是改為訪問192.168.1.101。 在路由器B中配置了靜態(tài)路由:要想訪問192.168.1.0/24,要從192.168.1.1這個口出去,沒有下一跳了,因為我右手這個網(wǎng)卡,就是這個網(wǎng)段的,我是最后一跳了。 于是,路由器B思考的時候,匹配上了這條路由,要從192.168.1.1這個口發(fā)出去,發(fā)給192.168.1.101。 那192.168.1.101的MAC地址是多少呢?路由器B發(fā)送ARP獲取192.168.1.101的MAC地址,然后發(fā)送包。內(nèi)容是這樣的: 源MAC:192.168.1.1的MAC地址 目標MAC:192.168.1.101的MAC地址 源IP:192.168.56.1 目標IP:192.168.1.101 從服務(wù)器B接收的包可以看出,源IP為服務(wù)器A的國際身份,因而發(fā)送返回包的時候,也發(fā)給這個國際身份,由路由器A做NAT,轉(zhuǎn)換為國內(nèi)身份。 從這個過程可以看出,IP地址也會變。這個過程用英文說就是NetworkAddressTranslation,簡稱NAT。 其實這第二種方式我們經(jīng)常見,現(xiàn)在大家每家都有家用路由器,家里的網(wǎng)段都是192.168.1.x,所以你肯定訪問不了你鄰居家的這個私網(wǎng)的IP地址的。所以,當我們家里的包發(fā)出去的時候,都被家用路由器NAT成為了運營商的地址了。 如何配置路由? 路由器就是一臺網(wǎng)絡(luò)設(shè)備,它有多張網(wǎng)卡。當一個入口的網(wǎng)絡(luò)包送到路由器時,它會根據(jù)一個本地的轉(zhuǎn)發(fā)信息庫,來決定如何正確地轉(zhuǎn)發(fā)流量。這個轉(zhuǎn)發(fā)信息庫通常被稱為路由表。一張路由表中會有多條路由規(guī)則。每一條規(guī)則至少包含這三項信息。 目的網(wǎng)絡(luò):這個包想去哪兒? 出口設(shè)備:將包從哪個口扔出去? 下一跳網(wǎng)關(guān):下一個路由器的地址。 例如,我們設(shè)置iprouteadd10.176.48.0/20via10.173.32.1deveth0,就說明要去10.176.48.0/20這個目標網(wǎng)絡(luò),要從eth0端口出去,經(jīng)過10.173.32.1。 動態(tài)路由算法 在大學里面學習計算機網(wǎng)絡(luò)與數(shù)據(jù)結(jié)構(gòu)的時候,知道求最短路徑常用的有兩種方法,一種是Bellman-Ford算法,一種是Dijkstra算法。在計算機網(wǎng)絡(luò)中基本也是用這兩種方法計算的。 距離矢量路由算法 鏈路狀態(tài)路由算法 結(jié)尾 問大家?guī)讉€問題 當你訪問www.taobao.com的時候,你發(fā)送的包需要通過NAT轉(zhuǎn)換成公網(wǎng)ip,然后淘寶返回的數(shù)據(jù)又要從公網(wǎng)IP變成你的局域網(wǎng)IP,假設(shè)我局域網(wǎng)很多IP,他怎么知道哪個對應(yīng)的是哪個 NAT在進行地址替換時不僅僅包含IP地址,還有端口號。具體說來就是,我們在進行連接外網(wǎng)服務(wù)器請求的數(shù)據(jù)包中,除了源、目的IP地址外,還有源、目的端口號。其中目的端口號是固定的,比如21或80等等。但源端口號是隨機生成的。當數(shù)據(jù)包到達進行NAT的設(shè)備時,除了私有IP地址會被替換成公網(wǎng)IP地址外,端口號也會被替換成NAT隨機生成的端口號。NAT的端口號和局域網(wǎng)中的主機一一對應(yīng),同時NAT設(shè)備維護一張端口號和主機對應(yīng)的表。當外網(wǎng)服務(wù)器返回數(shù)據(jù)到NAT設(shè)備時,NAT設(shè)備通過返回數(shù)據(jù)包中的端口號找到局域網(wǎng)中的主機并將數(shù)據(jù)轉(zhuǎn)發(fā)。 這樣就完整的實現(xiàn)了局域網(wǎng)主機上外網(wǎng)的功能。 當我們網(wǎng)絡(luò)中的包在網(wǎng)絡(luò)中傳輸?shù)臅r候,目標mac地址和源mac地址的變化,目標ip和源Ip的變化。 這個答案在文章中。 參考 趣談網(wǎng)絡(luò) ICMP作原理。 |
|