IP,ARP,RIP和BGP協議
IP,ARP,RIP和BGP協議
前言
今天還是接著學習計算機網路方面的內容,爭取在開學之前先把計算機網路的內容過一遍,JAVA學過一點,但是不精通,能看懂一些簡單的程式碼,僅此而已,大三就只有三門課,資料庫,網路,JAVA,好好學,別放棄,最近腰疼的厲害,可能是那天找女朋友的原因,爬山去了,累了個半死,回來就腰疼了.唉,身體跟不上了,身體是革命的本錢,保護好自己的身體,說不定將來買蘋果的時候用到了呢...
網路層是實現網際網路的最重要的一層.正是網路層面上,各個區域網根據IP協議相互連線,最終構成覆蓋全球的因特網.更高層的協議,無論是TCP還是UDP,
IP資料包是符合IP協議的資訊(也就是0/1序列),我們後面簡稱IP資料包為IP包.IP包分為頭部(header)和資料(Data)兩部分.資料部分是要傳送的資訊,頭部是為了能夠實現傳輸而附加的資訊(這與乙太網幀的頭部功能型別,如果對幀感到陌生,看前面)
IP包的格式
IP協議可以分為IPV4和IPV6兩種,IPV6是改進版本,用於在未來取代IPV4協議.咱們先以IPV4為例,下面是IPV4的格式:
與幀類似,IP包的頭部也有多個區域.我們將注意力放在紅色的發出地
IP地址是全球地址,它可以識別”社群”(區域網)和”房子”(主機).這是通過將IP地址分類實現的.(這一點前面我說了).
型別 |
起始範圍 |
終止範圍 |
子網掩碼 |
A |
1.0.0.0 |
126.255.255.255 |
255.0.0.0 |
B |
127.0.0.0 |
191.255.255.255 |
255.255.0.0 |
C |
192.0.0.0 |
223.255.255.255 |
255.255.255.0 |
每個IP地址的32位分別為前後兩部分,第一部分用來區分區域網,第二部分用來區分該區域網的主機.子網掩碼(Subnet Mask)告訴我們這兩部分的分界線,比如255.0.0.0(也就是8個1和24個0)表示前八位用於分割槽區域網,後24位用於區分主機.由於A,B,C分類已經規定好,所以當一個IP地址屬於B類範圍時,我們就知道它的前16位和後16位分別表示區域網和主機.
網絡卡與路由器
IP地址是分配給每個房子(計算機)的”郵編”.但這個說法並不精確.IP地址實際上識別的是網絡卡(NIC).網絡卡是計算機的一個硬體,它在接受到網路資訊之後,將資訊交給計算機(處理器/記憶體).當計算機需要傳送資訊的時候,也要通過網絡卡傳送.一臺計算機可以有不止一個網絡卡,比如計算機就有一個乙太網卡和一個WiFi網絡卡.計算機在接受或者傳送資訊的時候,要現決定想要通過哪個網絡卡.
路由器實際上就是一臺配備有多個網絡卡的專用電腦.它讓網絡卡接入到不同的網路中,這樣,就構成了”郵局”的概念.比如下圖中位於中間位置的路由器有兩個網絡卡,地址分別為199.165.145.17和199.165.146.3 . 他們分別接入到兩個網路199.165.145和199.165.146 .
IP包接力
IP包的傳輸要通過路由器的接力.沒一個主機和路由中都存在一個路由表,路由表根據目的地的IP地址,規定了等待發送的IP包所應該走的路線.
比如我們從主機147.17生成傳送到146.21的IP包:鋪開信封,寫好訊號的開頭(剩下的資料部分可以是TCP包,也可以是UDP包,也可以是任意亂寫的字,咱們不關心這個),註明目的地IP地址(199.165.146.21)和發出地IP地址(199.165.145.17).主機145.17隨後參照自己的路由表(routing table),裡面有三行記錄:
145.17 路由表(Genmask為子網掩碼,Iface用於說明使用哪個網絡卡介面,Gateway為閘道器,Destination為目的地址)
Destination |
Gateway |
Genmask |
Iface |
199.165.145.0 |
0.0.0.0 |
255.255.255.0 |
eth0 |
0.0.0.0 |
199.165.145.17 |
0.0.0.0 |
eth0 |
分析:這裡有兩條記錄.
第一條表示,如果IP目的地址是199.165.145.0這個網路的主機,那麼只需要自己在eth0上的網絡卡直接傳送(“本地社群”:直接送達),不用前往router(Gateway 0.0.0.0=”本地送信”).
第二行表示所有不符合第一行的目的IP地址,都應該送往Gateway 199.165.145.17,也就是中間router接入在eth0的網絡卡Ip地址(郵局在eth0的分支).
我們的IP包目的地為199.165.146.21,不符合第一行,所以按照第二行,傳送到中間的router.主機145.17會將IP包放入幀的payload,並在幀的頭部寫上199.165.145.17對應的MAC地址,這樣,就可以按照小喇叭那一講中的方法在區域網中傳送了.
中間的router在收到IP包之後(實際上是收到以太協議的幀,然後從幀中的payload讀取IP包),提取目的地IP地址,然後對照自己的routing table:
Destination |
Gateway |
Genmask |
Iface |
199.165.145.0 |
0.0.0.0 |
255.255.255.0 |
eth0 |
199.165.146.0 |
0.0.0.0 |
255.255.255.0 |
eth1 |
0.0.0.0 |
199.165.146.8 |
0.0.0.0 |
eth1 |
從前兩行我們看到,由於router橫跨eth0和eth1兩個網路,它可以直接通過eth0和eth1上的網絡卡直接傳送IP包.
第三行表示,如果是前面兩行之外的IP地址,則需要通過eth1,送往199.165.146.8(右邊的router).
我們的目的地符合第二行,所以將IP放入一個新的幀中.
在真的頭部下上199.165.146.21的MAC地址,直接傳送到主機146.21.(在linux下,可以使用$route -n來檢視routing table)
IP包可以進一步接力,到達更遠的主機.IP包從主機出發,格局沿途路由器路由表(routing table)指導,在router間接力.IP包最終到達某個router,這個router與目標主機唯一同一區域網中,可以直接建立連結層的通訊.最後,IP包被送到目標主機.這樣一個過程叫做routing(IP包接力,因為路由這個詞包含的含義太多了)
整個過程中,IP包不斷的被主機和路由裝入幀(信封)並拆開,然後藉助連結層,在區域網的各個NIC之間傳送幀.整個過程中,我們的IP包的內容保持完整,沒有發生變化.最終的效果是一個IP包從一個主機傳送到另一個主句.利用IP包,我們不需要去關心底層(比如連結層)發生了什麼.
ARP協議
在上面的過程中,我們實際上假設了,每一臺主機和路由都能瞭解區域網內的IP地址和MAC地址的對應關係,這是實現IP包封裝到幀的基本條件IP地址與MAC地址的對應是通過ARP協議傳播到區域網的每個主機和路由.每一臺主機或路由中都有一個ARP cache,用以儲存區域網內的IP地址和MAC地址如何對應.
ARP協議(ARP介於連結層和網路層之間,ARP包需要包裹在一個幀中)的工作方式如下:主機會發出一個ARP包,該ARP包中包含有自己的IP地址和MAC地址.通過ARP包,主機以廣播的形式詢問區域網上所有的主機和路由:我是IP地址xxxx,我的MAC地址是xxxx,有人知道199.165.146.4的MAC地址嗎?擁有該IP地址的主機會回覆發出請求的主機:哦,我知道,這個IP地址屬於我的一個NIC,它的MAC地址是xxxx.由於傳送ARP請求的主機採取的是廣播形式,並附帶有自己的IP地址和MAC地址,其他的主機和路由會同時檢查自己的ARP cache,如果不符合,則更新自己的ARP cache.
這樣,經過幾輪的ARP請求之後,ARP cache會達到穩定.如果區域網上裝置發生變動,ARP重複上面過程.
(在linux下,可以使用$arp命令來檢視ARP的過程.ARP協議只用與IPV4,IPV6使用Neighbor Discovery Protocol來代替ARP的功能)
Routing Table的生成
我們還有另一個假設,就是每個主機和路由上都已經有了合理的routing table.這個routing table描述了網路的拓撲結構,如果你瞭解自己的網路連線,可以手寫自己主機的routing table.但是,一個路由可能有多個出口,所以routing table可能會很長.更重要的是,周圍連結的其他路由可能發生變動(新增一個路由器或者路由器壞了),我們就需要routing table能及時將交通導向其他的出口.我們需要一種更加智慧的探測周圍的網路拓撲結構,並自動生成routing table.
我以一個案例來說問題.如果北京機場前往朝陽門,那麼可以採取2號航站樓=>三元橋==>東直門==>朝陽門.2號航站樓和朝陽門分別是出發和目的主機.而三元橋和東直門為中間的兩個router.如果三元錢==>東直門這條路維修了,我們就需要更改三元橋的routing table,從而給前往朝陽門的乘客(IP包)指示:請走如下路線三元橋==>芍藥居.然後依照芍藥居的routing table前往朝陽門(芍藥居==>東直門==>朝陽門).
一種用來生成routing table的協議是RIP.它通過距離來決定routing table,所以屬於distance-vector protocol.對於RIP來說,所謂的距離是從出發地到目的地沿途的路由器數目.比如上面從機場到朝陽門,按照2號航站樓==>三元橋==>東直門==>朝陽門路線,途徑兩個路由器,距離就是2.我們最初可以手動生成三元橋的routing table.隨後,根據RIP協議,三元橋向周圍的路由器和主機廣播自己前往各個IP的距離(比如到機場為0).收到RIP包的路由器路由器和主機根據RIP包和自己到傳送RIP包的主機的距離,算出自己前往各個IP的距離.東直門與三元橋的距離為1.東直門收到三元橋的RIP包(到機場的距離為0),那麼東直門途徑三元橋前往機場的距離為1+0=1.如果東直門自己的RIP記錄都比這個遠(比如東直門==>芍藥居==>三元橋==>機場=2).那麼東直門更改自己的routing table:前往機場的交通都發往三元橋而不是芍藥居.如果東直門自身的RIP包和收到的新的RIP包沒有差別,那麼東直門保持routing table不變.上述過程在各個點不斷重複RIP廣播/計算距離/更新routing table的過程,最終所有的主機和路由器都能生成最合理的路徑.
注意:RIP的基本邏輯是:如果A距離B為6,而我距離A為1,那麼我途徑A到B的距離為7.
RIP處於技術的原因,認為距離超過15的IP不可到達.所以RIP更多用於網際網路的一部分(比如整個中國電信的網路).這樣一個網際網路的部分往往屬於同一個ISP或者同一個管理機構,所以叫做自治系統.自治系統內部的主機和路由根據通向外部的邊界路由器來和其他的自治系統通訊.各個邊界路由器之間通過BGP來生成自己前往其他自治系統的路由表,而自治系統內部則參考邊界路由器,使用RIP來決定routing table.BGP的基本工作過程與RIP類似,但是在考慮距離的同事,也權衡比如政策,連線效能等其他因素,再決定交通的走向.
總結
我們一開始講述了IP包根據routing table進行接力的過程.為了順利的實現接力,我們又進一步深入到ARP和RIP/BGP.這三個協議都協助了IP傳輸.ARP讓每臺電腦和路由器知道自己區域網內IP地址和MAC地址的對應關係,從而順利實現IP包到幀的封裝.RIP協議可以生成自治系統內部合理的routing table.BGP協議可以生成自制系統外部的routing table.
在整個過程中,我們都將注意力放在了IP包大的傳輸過程中,而故意忽略了一些細節.而上面的IP接力過程適用於IPV6.