靜態路由與動態路由
IP 地址與路由控制
簡單來說,互聯網就是通過路由器連接的網絡組合而成,為了讓數據包正確到達目標主機,路由器必須在途中進行正確的轉發。這種向正確的方向轉發數據所進行的處理就叫做路由控制或者簡稱路由。
路由器根據路由控制表(可以簡稱為路由表)轉發數據包,它根據所收到的數據包中目標主機的 IP 地址與路由控制表的對比得出下一個應該接收的路由器,因此,這個過程中路由控制表的記錄必須准確無誤。
那么,這個路由控制表是如何生成的呢?主要分兩種方式:靜態路由和動態路由。
靜態路由與動態路由
靜態路由是指事先設置好路由器和主機並將路由信息固定的一種方法。而動態路由是指讓路由協議在運行過程中自動設置路由控制信息的一種方法。
靜態路由需要手工完成,每增加一個新的網絡,就要將這個新加的網絡信息設置到所有路由器上,給管理者帶來很大的負擔,一旦某個路由器出現故障,無法自動繞過故障節點,需要管理員手工設置才能恢復。
顯然,在配置復雜網絡的時候,靜態路由給網絡管理者帶來了巨大的運維負擔,所以我們更多使用的是動態路由。
使用動態路由的話,管理員必須設置好路由協議,如果有新的網絡追加到現有網絡,只需在新增加網絡的路由器上進行動態路由的配置即可。
對於路由器較多的復雜網絡,采用動態路由顯然是一個更合適的方法。況且網絡一旦出現故障,只要有一個可繞的其它路徑,數據包就會自動選擇這個路徑,路由器的設置也會被自動重置。
當然,要實現這種機制,網絡中的路由器之間需要與相鄰的路由器之間互發消息,以便定期相互交換必要的路由控制信息,這種消息的互換會給網絡帶來一定的負荷,但是相較於靜態路由需要人工設置路由來說,利遠大於弊。
動態路由會給相鄰路由器發送自己已知的網絡連接信息,而這些信息又像接力一樣,依次傳遞給其他路由器,直至整個網絡都了解時,路由控制表就制作完成了。此時就可以正確轉發 IP 數據包了。
動態路由相關算法
現實網絡中,基本使用的都是動態路由,使用動態路由路由器,可以根據動態路由協議算法生成動態路由表,並且路由表隨網絡運行狀況的變化而變化,這就極大降低了 IT 運維人員的管理和維護成本。
動態路由離不開相關的動態路由協議,而這些路由協議算法又可以轉化為從圖中找到最短路徑的問題(計算機網絡拓撲可以看作是圖結構),我們在數據結構與算法中介紹最短路徑的時候,提到了兩種算法:弗洛伊德算法(Floyd)和迪傑斯特拉算法(Dijkstra)。
動態路由協議中兩個典型的算法 —— 距離向量算法和鏈路狀態算法,正是基於以上最短路徑算法實現。下面我們來詳細介紹這兩種算法的實現思路。
距離向量算法
基於弗洛伊德算法,是一種根據距離和方向(向量)決定目標網絡或目標主機位置的算法。這種算法的基本思路是,每個路由器都保存一個路由表,包含多行,每行對應網絡中的一個路由器,每一行包含兩部分信息,一個是要到目標路由器,從那條線出去,另一個是到目標路由器的距離。
由此可以看出,每個路由器都是知道全局信息的。那這個信息如何更新呢?路由器之間可以互換目標網絡的方向及其距離的相關信息,並以這些信息為基礎制作路由控制表,每個路由器都知道自己和鄰居之間的距離,每過幾秒,每個路由器都將自己所知的到達所有的路由器的距離告知鄰居,每個路由器也能從鄰居那里得到相似的信息。每個路由器根據新收集的信息,計算和其他路由器的距離,比如自己的一個鄰居距離目標路由器的距離是 M,而自己距離鄰居是 x,則自己距離目標路由器是 x+M。
這種方法在處理上比較簡單,不過由於只有距離和方向信息,所以當網絡構造變得異常復雜時,在獲得穩定的路由信息之前需要消耗一定時間,也極易發生路由循環問題。
鏈路狀態算法
基於迪傑斯特拉算法,是一種路由器在了解網絡整體連接狀態的基礎上生成路由控制表的算法。這種算法的基本思路是:當一個路由器啟動的時候,首先是發現鄰居,向鄰居發送消息,鄰居都回復。然后計算和鄰居的距離,發送一個 echo,要求馬上返回,除以二就是距離。然后將自己和鄰居之間的鏈路狀態包廣播出去,發送到整個網絡的每個路由器。這樣每個路由器都能夠收到它和鄰居之間的關系的信息。因而,每個路由器都能在自己本地構建一個完整的圖,然后針對這個圖使用迪傑斯特拉算法,找到兩點之間的最短路徑。
不像距離向量路由協議那樣,更新時發送整個路由表,鏈路狀態路由協議只廣播更新的或改變的網絡拓撲,這使得更新信息更小,節省了帶寬和 CPU 利用率。而且一旦一個路由器掛了,它的鄰居都會廣播這個消息,可以使得壞消息迅速收斂。
常見路由協議
了解了動態路由協議算法,下一篇我們就來介紹基於這些算法實現的路由協議,常見的路由協議如下:
目前廣泛應用的是 OSPF 和 BGP 兩個路由協議,具體細節學院君將在下一篇與大家分享。
動態路由相關協議
自治系統
開始之前,我們先介紹下自治系統的概念。
互聯網連接着世界各地的組織結構,不僅包括語言不相通的,甚至包括宗教信仰完全不同的組織,這里面沒有管理者,也沒有被管理者,每個組織之間保持着平等的關系。制定自己的路由策略,並以此為准在一個或多個網絡群體中采用的較小單位叫做自治系統(AS:Autonomous System)。
說到自治系統,區域網絡、ISP(網絡服務提供商,如電信、聯通、移動) 都是典型的例子。在區域網絡或及 ISP 內部,由構造、管理和運維網絡的管理員、運營者制定出路由控制相關方針,然后根據此方針進行具體路由控制的設定。而接入到區域網絡或 ISP 的組織機構,則必須根據管理員的指示進行路由控制設定,否則會給自己或其他使用者帶來負面影響,甚至無法通信。
每個自治系統都有邊界路由器,通過它和外面的世界建立聯系。
自治系統內部動態路由采用的協議是內部網關協議(Interior Gateway Protocol),簡稱 IGP。而自治系統之間的路由控制采用的是外部網關協議(Exterior Gateway Protocol),簡稱 EGP。
IP 地址分為網絡地址和主機地址,它們有各自的分工,EGP 和 IGP 的關系和 IP 地址的兩部分類似。就像 IP 地址的網絡部分用於在網絡之間進行路由選擇、主機部分用於鏈路內主機識別一樣,可以根據 EGP 在自治系統之間進行路由選擇,根據 IGP 在自治系統內部進行主機識別。
由此,路由協議分為 EGP 和 IGP 兩個層次,沒有 EGP 就不可能有世界上不同組織機構之間的通信,沒有 IGP 機構內部也就不能通信。
IGP 中可以使用 RIP、OSPF 等眾多協議。與之相對的,EGP 使用的是 BGP 協議。
下面我們就來詳細介紹上面三個常見的路由協議。
RIP
RIP(Routing Information Protocol,路由信息協議)基於距離向量算法,是距離向量型的一種路由協議,廣泛用於局域網。
RIP 將路由控制信息定期(30秒)向全網廣播。如果沒有收到路由控制信息,連接就會被斷開,不過這有可能是丟包導致的,所以 RIP 規定等待 5 次。
RIP 基於距離向量算法決定路徑。距離的單位為跳數(Metrics),跳數是指所經過路由器的個數。RIP希望盡可能少經過路由器將數據包轉發到目標 IP 地址。
OSPF
OSPF(Open Shortest Path First,開放式最短路徑優先)基於鏈路狀態算法,是一種鏈路狀態型路由協議,主要用在自治系統內部進行路由決策。由於采用鏈路狀態類型,所以即使網絡中有環路,也能夠進行穩定的路由控制。
OSPF 支持子網掩碼,為了減少網絡流量,還引入了「區域」這一概念,將一個自治網絡划分為若干個更小的范圍。
在 OSPF 中,路由器之間交換鏈路狀態生成網絡拓撲信息,然后再根據這個拓撲信息生成路由控制表。
RIP 的路由選擇,要求途中所經過的路由器個數越少越好,但路由器個數最少不一定是最優路徑,與之相比,OSPF 可以給每條鏈路賦予一個權重,並始終選擇一個權重最小的路徑作為最終路由。
BGP
BGP(Border Gateway Protocol,邊界網關協議)是連接不同自治系統的協議,屬於外部網關協議。主要用於 ISP(網絡服務提供商) 之間相連接的部分。
只有 BGP、RIP 和 OSPF 共同進行路由控制,才能進行整個互聯網的路由控制。
在 RIP 和 OSPF 中根據 IP 地址的網絡地址部分進行路由控制,然而 BGP 則需要放眼整個互聯網進行路由控制。BGP 的路由控制表最終由網絡地址和下一站的路由器組來表示,不過它會根據所要經過的 AS 個數進行路由控制。
ISP、區域網絡會將每個網絡區域編配成一個個自治系統進行管理,它們為每個自治系統分配一個 16 比特的 AS 編號。BGP 就是根據這個編號進行相應的路由控制。
BGP 協議使用的算法是路徑向量算法,它是距離向量算法的升級版,解決了壞消息傳遞慢(某個路由器故障系統感知慢)的問題,將單個自治系統看作一個整體,不區分自治系統內部的路由器,因此規模有限。
小結
從某種角度來說,路由控制是跨越整個互聯網的分布式系統。
互聯網中的路由控制,以網絡中所有路由器都持有正確的路由信息為基礎,使這些路由器的信息保持正確的協議就是路由協議,沒有路由協議的協同工作,就無法實現互聯網上正確的路由控制。路由協議散布於互聯網的各個角落,是支撐互聯網運行的巨大的分布式系統。
ifconfig 與 ip addr 命令詳解
如何查看機器的 IP 地址
我們在 Linux 系統查看 IP 地址通常有以下兩種方式:
1)ifconfig
2)ip addr
注:如果在 Windows 系統上,查看 IP 地址的命令是 ipconfig。
這兩個命令返回的都是機器的網卡信息,其中包含了網卡的 IP 地址,有了 IP 地址才能進行網絡通信。
ifconfig 與 ip addr 源起
要了解這兩個命令的區別,需要先看看它們的歷史起源:
ifconfig 命令歸屬於 net-tools 工具集。net-tools 起源於 BSD,自 2001 年起,Linux 社區已經停止對其進行維護。而 ip 命令歸屬於 iproute2 工具集,iproute2 旨在取代 net-tools,並提供了一些新功能。
一些 Linux 發行版已經停止支持 net-tools,只支持 iproute2,在這些 Linux 版本中,只能使用 ip addr 命令查看 IP 地址,使用 ifconfig 會提示命名不存在。
net-tools 通過 procfs(/proc) 和 ioctl 系統調用去訪問和改變內核網絡配置,而 iproute2 則通過 netlink 套接字接口與內核通訊。
net-tools 中工具的名字比較雜亂,而 iproute2 則相對整齊和直觀,基本是 ip 命令加后面的子命令:
網卡信息詳解
了解了兩個命令的區別之后,下面我們以 ip addr 命令輸出為例對每個字段的含義進行解釋。
網卡名稱
我們先看最外層,eth0 和 eth1 都是網卡的名稱,其中 eth 是以太網英文名 Ethernet 的縮寫,表示數據鏈路是以太網,之所以有兩張網卡是因為一張網卡用於內網通信,一張網卡用於外網通信。
lo 全稱是 loopback,又稱環回接口,往往會被分配到 127.0.0.1 這個地址。這個地址用於本機通信,經過內核處理后直接返回,不會在任何網絡中出現。
一般來說,任何主機都至少有上述三個網卡。
然后我們依次看每一行的信息。
網絡設備狀態標識
首先看第一行信息:
<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
<BROADCAST,MULTICAST,UP,LOWER_UP>
叫作 net_device flags
,即網絡設備的狀態標識。
UP
表示網卡處於啟動的狀態;BROADCAST
表示這個網卡有廣播地址,可以發送廣播包;MULTICAST
表示網卡可以發送多播包;LOWER_UP
表示 L1
是啟動的,也就是網線是插着的。
mtu 1500
學院君前面介紹數據鏈路的時候提到過,表示以太網最大傳輸單元 MTU
為 1500
,這是以太網的默認值。
qdisc
全稱是 queueing discipline
,中文叫排隊規則。內核如果需要通過某個網絡接口發送數據包,它都需要按照為這個接口配置的 qdisc
(排隊規則)把數據包加入隊列。這里 lo
網卡配置的值是 noqueue
不使用隊列,其它兩個網卡配置的值是 fq_codel
,對應的英文全名是 Fair Queueing with Controlled Delay
,即具有受控延遲的公平隊列,這種情況下每個網絡流都有一個隊列。
state UP
表示該網卡已啟用,group default
表示網卡分組,qlen 1000
表示傳輸隊列長度。
MAC 地址
接下來的每個網卡的第二行顯示的是該網卡的 MAC 地址:
link/ether 08:00:27:b9:64:24 brd ff:ff:ff:ff:ff:ff
本地環回接口不需要,所以為空。
MAC 地址是一個網卡的物理地址,具體概念我們在鏈路層已經詳細介紹過,使用十六進制表示,用冒號分隔,總共是六個字節。MAC 地址只能再同一個網段內通信,跨網段通信需要借助 IP 地址,所以接下來就是網卡的 IP 地址。
IPv4 地址
首先是 IPv4 地址:
inet 192.168.10.10/24 brd 192.168.10.255 scope global eth1
valid_lft forever preferred_lft forever
192.168.10.10/24
表示子網掩碼,192.168.10.255
表示真正的 IP 地址。在 IP 地址的后面有個 scope,對於 eth1 這張網卡來講,是 global
,說明這張網卡是可以對外通信的,可以接收來自各個地方的包(如果還有 dynamic
表示該 IP 地址是動態分配的)。對於 lo
來講,是 host
,說明這張網卡僅僅可以供本機相互通信。
valid_lft
表示該 IP(IPv4) 地址的有效使用期限,這里配置為 forever
表示永久有效;preferred_lft
表示該 IP 地址的首選生存期,也是配置為 forever
表示永久有效。
IPv6 地址
最后是 IPv6 地址:
inet6 fe80::a00:27ff:feb9:6424/64 scope link
valid_lft forever preferred_lft forever
IPv6 地址表示的地址區間非常之大,所以不需要區分網絡號和主機號,也就不需要子網掩碼了,IPv6 地址也是通過十六進制表示,需要注意的是這里 scope
配置為 link
表示只在此設備生效。其它配置和 IPv4 地址一樣,不再贅述。