轉帖:http://blog.chinaunix.net/space.php?uid=11654074&do=blog&id=2857384
Contents Page
文件夾
2.3.3 Master路由器(Master state)... 10
- 作者:張蒙 (zmouc)
- 電子郵箱:qdzhangmeng@163.com
- MSN:qdzhangmeng@163.com
- QQ : 407-960-134
- 博客地址:http://zmouc.cublog.cn
- 建立日期:2010年07月23日
- 版 本:1.0
- 版權說明:本文基於創作共用約定,內容歸作者版權全部,歡迎大家轉載,但要保留 作者的完整信息和出處,謝謝!
1. VRRP產生背景及應用環境
1.1為什么要用VRRP
VRRP(Virtual Router Redundancy Protocol)------虛擬路由器冗余協議,其最新技術標准是RFC3768。
為什么要用VRRP呢,主要是為了實現數據鏈路層互通設備的冗余備份功能,我們來看圖一:

圖一(常規網絡架構)
通過上圖能夠看到,常規的局域網一般都是多個終端接到交換機上,然后通過單獨的出口路由器連接到Internet,這時候問題來了,假設這個出口路由器壞掉了,那么整個上行的流量就會所有斷掉,這就是傳說中的單點故障。
所以說我們要避免出現這樣的情況,本着冗余備份的思想,我們對上面的網絡進行物理改造,例如以下圖:

圖二(消除了單點故障的常規網絡架構)
如今,這個網絡一共同擁有兩個Internet出口,這樣不論什么一個出口路由器出現問題都不會導致終端用戶的上行流量斷掉。
另外一個問題出現了,我們怎么讓終端PC知道局域網中有兩個出口路由器,並在當中一個出現問題后自己主動選擇另外一個呢?可採用的方案包含讓終端PC執行動態路由協議,比方RIP、OSPF,或者ICMP router Discovery client(DISC),或者指定一條靜態缺省路由。
可是這三種實現方法都有其劣勢及不可行之處,我們來詳細分析一下。首先對於在每個終端PC上執行動態路由協議來講,差點兒是不可能的,這當中牽涉到網管的技術能力和日常維護、安全性問題、以及某些終端平台不支持動態路由協議,比方我們經常使用的XP、Windows7都不支持,而windows Server系列OS支持。
假定我們在終端PC上部署了動態路由協議,那么每個終端用戶都會遇到以下這種情況:
10086:尊敬的用戶您好,申報RIP故障請按1,申報OSPF故障請按2,申報ISIS故障請按3……….
用戶:( ⊙ o ⊙ )啊!我家是OSPF,按2。
10086:您好,您申報的故障是OSPF,請進一步選擇,OSPF鄰居無法建立請按1,OSPF密鑰不正確請按2,鏈路狀態數據庫異常請按3,路由表錯誤請按4…………..
用戶:( ⊙ o ⊙ )啊!……………然后吐血身亡………….
所以說,N多現實問題和困難導致在終端PC上部署動態路由協議具有不可行性。
那么對於在終端PC上部署DISC等鄰居或路由器發現協議呢?也存在種種問題,例如在網絡內存在大量主機,每一台都須要執行DISC,除了添加主機的處理負擔外,也會導致協議收斂緩慢,從而不能及時發現不可用鄰居路由器,產生路由黑洞,這是不可接受的。
如今僅僅剩下在終端PC上配置靜態缺省路由了(其詳細表現形式通常是設置網關),這是差點兒每個IP平台都支持的配置功能,即使是一部IP電話機,依據這個思路,我們在終端上配置多個默認網關就可以實現路由備份了,可是存在下面兩個問題:
1. 對於下行設備是PC來講,配置了多個默認網關之后,當中一個會作為活動默認
網關,其他的作為備份默認網關,其依照下列過程運行流量轉發和失效網關檢測:
當TCP/IP在通過活動默認網關向某個目標IP地址進行TCP通信時,假設失敗的嘗試次數達到TcpMaxDataRetransmissions注冊表值(默覺得5)的一半(即3次)還沒有收到響應,TCP/IP將到達該目標IP地址的通信改為使用列表中的下一默認網關,這一步是通過更改該遠程IP地址的路由緩存項(Route Cache Entry,RCE)來實現的,從而使用列表中的下一個默認網關來作為下一跳地址。當中RCE是路由表中的一個條目,用於存儲目的地的下一跳IP地址。當超過25%的TCP連接轉向下一默認網關時,TCP/IP將活動默認網關改動為這些連接當前使用的默認網關。
假設此時原始默認網關從故障中回復,TCP/IP將繼續使用當前的活動默認網關,而不會轉移到原始默認網關,除非重新啟動計算機。假設當前的活動默認網關也出現故障,那么TCP/IP就會繼續嘗試使用列表中的下一個默認網關,在嘗試完整個列表后將返回到列表的開始,又從第一個默認網關開始進行嘗試。
死網關檢測僅監視TCP流量,假設其它類型的流量連接失敗,不會切換默認網關。另外TCP是端到端的協議,因此即使當前默認網關全然正常,本地計算機的TCP通信失敗也可能會導致切換默認網關。
當不同網絡接口所連接的網絡之間沒有連接性時(如一個網絡接口連接到Internet,而一個網絡接口連接到內部網絡),假設在多個網絡接口上同一時候配置默認網關,在活動默認網關出現故障導致切換默認網關時,就可能會引起連接性故障。比如活動默認網關為Internet連接,當它出現故障時,此時默認網關切換為內部連接,此時,本地計算機將無法再訪問位於Internet連接上的主機。對於這樣的情況,微軟建議使用 route add 來加入相應目的網絡的匹配路由,而不是設置多個默認網關,這其實就是最長匹配原則,精確路由優先於缺省路由。
2.對於下行設備是路由器的情況,其不會切換默認路由,僅僅會依照配置好的缺省
路由優先級進行流量轉發,從而導致路由黑洞。
結合上面兩個原因,在網絡出口路由器的下行設備上配置缺省路由的方法也不可行。
綜上所述,要想消除單點故障,又同一時候實現下行設備在故障發生時的流量無障礙
轉發,以上的三個方法均不可行,所以人們開發出了一種全新的協議:VRRP,這
種協議無需下行設備與出口路由器進行交互性操作,卻全然實現了網絡出口的冗
余備份,下一節,我們就來具體討論下VRRP的基本原理及實現過程。
2.VRRP基本原理及實現過程
2.1 VRRP基本概念
VRRP路由器:執行VRRP協議一個或多個實例的路由器
虛擬路由器:由一個Master路由器和多個Backup路由器組成。當中,不管Master路由器還是Backup路由器都是一台VRRP路由器,下行設備將虛擬路由器當做默認網關。
VRID:虛擬路由器標識,在同一個VRRP組內的路由器必須有相同的VRID,事實上VRID就相當於一個公司的名稱,每一個員工介紹自己時都要包括公司名稱,表明自己是公司的一員,相同的道理,VRID表明了這個路由器屬於這個VRRP組。
Master路由器:虛擬路由器中承擔流量轉發任務的路由器
Backup路由器:當一個虛擬路由器中的Master路由器出現問題時,可以取代Master路由器工作的路由器
虛擬IP地址:虛擬路由器的IP地址,一個虛擬路由器能夠擁有一個或多個虛擬IP地址。
IP地址擁有者:接口IP和虛擬路由器IP地址同樣的路由器就叫做IP地址擁有者。
主IP地址:從物理接口設置的IP地址中選擇,一個選擇規則是總是選用第一個IP地址,VRRP通告報文總是用主IP地址作為該報文IP包頭的源IP。
虛擬MAC地址:組成方式是00-00-5E-00-01-{VRID},前三個字節00-00-5E是IANA組織分配的,接下來的兩個字節00-01是為VRRP協議指定的,最后的VRID是虛擬路由器標識,取值范圍[1,255]
2.2 VRRP報文組成
以下我們來看VRRP報文的詳細組成:

圖三(VRRP報文格式,取自RFC3768)
詳細字段含義:
Version:VRRP協議版本號號,RFC3768定義了版本號2.
Type:該字段指明了VRRP報文的類型,RFC3768僅僅定義了一種VRRP報文,那就是
VRRP通告報文,所以該字段總是置為1,若收到的VRRP通告報文擁有非1的類型
值,那么會被丟棄。
Virtual Rtr ID:也就是我們上面介紹過的VRID,一個VRID唯一地標識了一個虛擬
路由器,取值范圍是[1,255],所以一台路由器的接口能夠同一時候執行最多255個VRRP
實例,此字段沒有缺省值,必須人為設定。
Priority:優先級,在一個虛擬路由器中用來選取Master路由器和Backup路由器,值越大表明優先級越高,此字段共同擁有8個bit,取值范圍[1,254],若沒有人為指定,缺省值是100。當中,VRRP協議會將IP地址擁有者路由器的該字段永遠設置為255,若人為指定為其他值,也不會影響VRRP協議的默認行為,即IP地址擁有者路由器的該字段總是255。另外,此字段設置為0會出如今以下這樣的情形中,當Master路由器出現故障后,它會立馬發送一個Priority置0的VRRP通告報文,當Backup路由器收到此通告報文后,會等待Skew time時間,然后將自己切換為Master路由器,當中Skew time=(256-Backup路由器的優先級)/256,單位為秒,比如若Backup路由器的優先級為100,那么Skew time=156/256=0.609秒,對於主路由器來說,Skew time並沒有實際意義,盡管cisco的路由器也會計算並顯示出來。
Count IP Addrs:VRRP通告報文中包括的IP地址數量,這個字段事實上就是為一個VRRP虛擬路由器所分配的IP地址的數量,我們來看一個cisco的實際樣例:
配置例如以下:
interface Ethernet1/0
ip address 192.168.10.102 255.255.255.0
duplex half
vrrp 1 ip 192.168.10.52
vrrp 1 ip 192.168.10.51 secondary
vrrp 1 ip 192.168.10.53 secondary
end
我們來看一下上面的配置在封裝成VRRP通告報文的時候,是怎樣進行的,例如以下
圖:

圖四(VRRP報文的抓包分析)
大家能夠看到,VRRP通告報文中的Count IP Addrs字段的值為3,這是由於我們配置了3個虛擬IP地址,另外,以下的IP Address字段也依照我們配置虛擬IP的順序進行了封裝。
Auth Type:認證類型字段,是一個8位的無符號整數,一個虛擬路由器僅僅能使用一種認證類型,假設Backup路由器收到的通告報文中認證類型字段是未知的或和本地配置的不匹配,那么它將丟棄該數據包。
值得注意的是,在RFC2338中為VRRP定義了3種認證類型:無認證、明文認證、MD5認證,可是在興許的實踐中發現,這些手段無法提供行之有效的安全性,而且還會導致多個Master路由器的問題,所以在最新的VRRP標准:RFC3768中已經去掉了全部的認證類型。
眼下認證類型字段的定義例如以下:
0 – 無認證,此時以下的Authentication Data字段將會被置為全0,接收到的路由器也會忽略此字段。
1 – 保留,是為了向前一個版本號的RFC2338提供兼容性
2 – 保留,是為了向前一個版本號的RFC2338提供兼容性
Adver Int::此字段規定了Mater路由器向外發送VRRP通告報文的時間間隔,以秒為單位,取值范圍是[1,255],若沒有人工配置,缺省為1秒。
Checksum:整個VRRP報文的校驗和,計算過程中,將Checksum字段置為0,計算完畢后將結果填入此字段。若希望進一步了解Checksum的計算,能夠查看RFC1071(CKSM)。
IP Address:此字段存放3個VRRP虛擬路由器的虛擬IP地址,配置了幾個就封裝幾個,在上面的cisco實例中我們配置了三個,那么VRRP通告報文就會封裝3個。
Authentication Data:RFC3768中規定,此字段僅僅是為了向RFC2338兼容,在實際的封裝時,全置為0.,接收方也會忽略此字段。
2.3 VRRP協議狀態機
對一個VRRP虛擬路由器來講,,參與它的每一台VRRP路由器,都僅僅有3種VRRP狀態:Initialize,Master,Backup,在講述這三種狀態時會碰到一些新的概念,我們會在第一次遇到時做詳解。
2.3.1初始狀態(Initialize)
這是配置好VRRP后,VRRP等待一個開始事件時的狀態,當本地VRRP進程切換到此狀態后,會依次運行下列操作:
2.3.1.1假設本地優先級為255,也就是說自己是IP擁有者路由器,那么接下來它會:
1.發送VRRP通告報文
2.廣播免費ARP請求報文,內部封裝是虛擬MAC和虛擬IP的相應,有幾個虛擬IP地址,那么就發送幾個免費ARP請求報文。
3.啟動一個Adver_Timer計時器,初始值為Advertisement_Interval(缺省是1秒),當該計時器超時后,會發送下一個VRRP通告報文
4.本地VRRP進程將自己切換為Master路由器
2.3.1.2假設,本地優先級不是255,,那么接下來它會:
1.設置Master_Down_Timer計時器等於Master_Down_Interval,也就是主路由器死亡時
間間隔,假設此計時器超時,那么Backup路由器就會宣布主路由器死亡。
當中Master_Down_Interval = (3*Advertisement_Interval)+ Skew_time舉例來說,一個VRRP實例(也就是一個VRRP虛擬器)的優先級是100,報文發送
間隔是1秒,那么Master_Down_Interval = 3*1s + (256-100)/256s = 3.609秒。
2.本地VRRP進程將自己切換為Backup路由器
2.3.2備份路由器狀態(Backup)
2.3.2.1
備份路由器是為了監控Master路由器的狀態,假設一個VRRP路由器處於此狀態,那么它會:
1. 不響應對虛擬IP地址的ARP請求報文
2. 丟棄幀頭目的MAC地址是虛擬MAC的幀
3. 丟棄IP頭中目的IP地址是虛擬IP的IP包
2.3.2.2
假設此時該VRRP路由器收到了一個shutdown事件,那么它會:
1. 取消Master_Down_Timer
2. 轉換為初始狀態(Initialize state)
2.3.2.3
假設Master_Down_Timer超時,那么該VRRP路由器會運行:
1.發送一個VRRP通告報文,
2.廣播免費ARP請求報文,內部封裝是虛擬MAC和虛擬IP的相應,有幾個虛擬IP
地址,那么就發送幾個免費ARP請求報文。
3.設置Adver_Timer計時器為Advertisement_Interval(缺省為1秒)
4.切換到Master狀態
2.3.2.4
假設該Backup狀態的VRRP路由器收到了一個VRRP通告報文;
當該VRRP通告報文的優先級字段為0時,那么路由器會將當前的
Master_Down_Timer 設置為Skew_Time;
假設優先級不為0,而且大於或等於本地優先級,那么本地路由器會重置Master_Down_Timer計時器並保持Backup狀態;
假設優先級不為0,而且小於本地優先級,假設開啟了搶占模式(Preempt mode),
那么該Backup路由器等待指定的搶占延遲時間后將自己切換為Master路由器;並執
行Master路由器的全部動作;比如:vrrp 1 preempt delay minimum 10,表示等待10秒
后切換自己為Master;
假設優先級不為0,而且小於本地優先級,假設沒有開啟搶占模式(Preempt mode),那么本地路由器保持Backup狀態。
2.3.3 Master路由器(Master state)
處於Master狀態的路由器會運行目的MAC為虛擬MAC數據幀的轉發,這里要清楚的是對於下行設備的arp表里,該虛擬MAC是和虛擬IP地址相相應的。
2.3.3.1
當路由器處於Master狀態時,會進行以下的動作:
1. 響應對虛擬IP地址的ARP請求
2. 轉發目的MAC地址是虛擬MAC的數據幀
3. 拒絕目的IP地址是虛擬IP的數據包,除非它是IP地址擁有者(也就是優先級是
255的那個路由器)。
2.3.3.2
假設處於Master狀態的VRRP進程收到了一個shutdown事件,那么它會:
1. 取消Adver_Timer計時器
2. 發送一個優先級字段置零的VRRP通告報文
3. 切換為初始狀態(Intialize state)
2.3.3.3
假設Adver_Timer計時器超時,那么:
1. 發送一個VRRP通告報文
2. 重置Adver_Timer計時器
2.3.3.4
假設收到了一個VRRP報文且其優先級為0,那么:
1. 發送一個VRRP通告報文
2. 重置Adver_Timer計時器
2.3.3.5
假設收到了一個VRRP報文且其優先級高於本地優先級,或者收到的VRRP報文優先級等於本地優先級可是主IP地址高於本地的主IP地址,那么:
1. 取消Adver_Timer計時器
2. 設置Master_Down_Timer計時器為Master_Down_Interval
3. 切換為Backup狀態