在實際組網中,有時會出現一種特殊的現象——單向鏈路(即單通)。所謂單向鏈路是指本端設備可以通過鏈路層收到對端設備發送的報文,但對端設備不能收到本端設備的報文。單向鏈路會引起一係列問題,比如生成樹拓撲中存在環路等。
以光纖連接為例,單向鏈路可分為兩種類型:一種是光纖交叉相連,另一種是一條光纖未連接或一條光纖斷路。如圖 1所示,是正確的光纖連接與上述兩種類型單向連接的對比示意。
DLDP(Device Link Detection Protocol,設備鏈路檢測協議)可以監控光纖或銅質雙絞線的鏈路狀態。如果發現單向鏈路存在,DLDP會根據用戶配置,自動關閉或通知用戶手工關閉相關端口,以防止網絡問題的發生。
DLDP是鏈路層協議,它與物理層協議協同工作來監控設備的鏈路狀態。物理層的自動協商機製進行物理信號和故障的檢測;DLDP進行對端設備的識別、單向鏈路的識別和關閉不可達端口等工作。二者協同工作,可以檢測和關閉物理和邏輯的單向連接。如果鏈路兩端在物理層都能獨立正常工作,DLDP會在鏈路層檢測這些鏈路是否正確連接、兩端是否可以正確的交互報文。這種檢測不能通過物理層的自動協商機製實現。
DLDP協議的狀態類型如表 1所示。
表 1 DLDP協議狀態
狀態 | 說明 |
Initial(初始) | DLDP協議未使能時的初始化狀態 |
Inactive(非活動) | DLDP協議已使能,但是鏈路down時所處的狀態 |
Active(活動) | DLDP協議已使能且鏈路up,或者清空鄰居表項後所處的狀態 |
Advertisement(通告) | 所有鄰居雙向連通(two way)或者處於Active狀態超過5秒後進入的狀態,這是一種沒有發現單向鏈路時的比較穩定的狀態 |
Probe(探測) | 收到一個未知鄰居的報文後進入的狀態,此時將發送探測報文檢測鏈路是否為單向鏈路。該狀態啟動Probe發送定時器,為每個需要探測的鄰居啟動一個Echo等待定時器 |
Disable(單通) | DLDP協議檢測到單向鏈路,或在加強模式下鄰居消失時的狀態。此時端口不再接收和發送除DLDPDU以外的報文 |
DelayDown(延遲down) | 當DLDP狀態處於Active狀態、Advertisement狀態或Probe狀態時,如果收到端口down事件,不會立即刪除鄰居、進入Inactive狀態,而是先進入臨時的DelayDown狀態 在該狀態下,DLDP鄰居信息仍然被保留,同時啟動DelayDown定時器 |
DLDP協議工作過程中需要使用到的定時器如表 2所示。
表 2 DLDP協議中的定時器
定時器 | 說明 |
Active發送定時器 | 發送帶有RSY標記的Advertisement報文的時間間隔(缺省為1秒):即在Active狀態下每秒發送1個帶RSY標記的Advertisement報文,最多發送5個 |
Advertisement發送定時器 | 發送普通Advertisement報文的時間間隔(缺省為5秒) |
Probe發送定時器 | Probe發送定時器的時間間隔為1秒:即在Probe狀態下每秒發送2個Probe報文,最多發送10個 |
Echo等待定時器 | 在DLDP切換到Probe狀態或啟動加強探測時啟用Echo等待定時器(超時時間為10秒)。若該定時器超時後仍未收到來自鄰居應答本端的Echo報文,則將本端的狀態置為單通,並將狀態機轉到Disable狀態,發送Disable報文,並根據用戶配置的DLDP Down模式,提示用戶手動或者自動關閉本端口,同時刪除該鄰居表項 |
鄰居老化定時器 | 每個新鄰居加入時都要建立鄰居表項,並啟用相應的鄰居老化定時器,當收到鄰居報文時刷新相應的鄰居表項和鄰居老化定時器: l 在普通模式下,若該定時器超時後仍未收到鄰居發來的報文,則發送帶有RSY標記的Advertisement報文,同時刪除該鄰居表項 l 在加強模式下,若該定時器超時後仍未收到鄰居發來的報文,則啟用加強定時器 鄰居老化定時器的超時時間是Advertisement定時器的3倍 |
加強定時器 | 在加強模式下,若鄰居老化定時器超時後仍未收到鄰居發來的報文,則對該鄰居啟用加強定時器(超時時間為1秒)。在啟用了該定時器之後,每秒向鄰居發送1個Probe報文,連續發送8次 |
DelayDown定時器 | 當DLDP處於Active、Advertisement或Probe狀態時,如果收到端口down事件,不會立即刪除鄰居並進入Inactive狀態,而是先進入DelayDown狀態並啟動DelayDown定時器(此時仍保留DLDP鄰居信息,且隻響應端口up事件): l 若該定時器超時後仍未收到端口up事件,則刪除DLDP鄰居信息並進入Inactive狀態 l 若該定時器超時前收到了端口up事件,則返回到原來的DLDP狀態 |
恢複探測定時器 | 恢複探測定時器的時間間隔為2秒:即處於Disable狀態下的端口每2秒發送1個RecoverProbe報文,用於檢測單向鏈路是否恢複 |
DLDP協議有如下兩種工作模式:
l 普通模式:在該模式下,一旦有鄰居老化定時器超時,隻是在刪除該鄰居表項的同時發送一個帶RSY標記的Advertisement報文。
l 加強模式:在該模式下,一旦有鄰居老化定時器超時,則啟動加強定時器,每1秒發送1個Probe報文(連續發送8個)用於主動探測該鄰居,如果Echo等待定時器超時仍未收到來自鄰居的Echo報文,則進入Disable狀態。
表 3 DLDP協議工作模式與鄰居表項老化
DLDP協議工作模式 | 鄰居老化後是否主動探測該鄰居的存在 | 鄰居老化定時器超時後是否立即刪除該鄰居表項 | 鄰居老化定時器超時後是否啟用加強定時器 |
普通模式 | 否 | 是 | 否 |
加強模式 | 是 | 否 | 是(加強定時器超時後開始發送Probe報文) |
加強模式的目的在於檢測網絡黑洞,防止出現一端up而另一端down的情況。有些設備在端口配置為強製速率和強製全雙工模式時,會出現如圖 2所示的情況,此時Device B的端口雖已down掉,但由於普通的鏈路層協議無法檢測出來,因此Device A的端口還處於up狀態。在加強模式下,Device A的端口在鄰居老化定時器超時後會進行主動探測,如果在Echo等待定時器超時仍未收到Device B的端口返回的Echo報文,Device A的端口就將進入Disable狀態。此時由於Device B的端口的物理狀態為down,因此其DLDP狀態為Inactive。
圖 2 加強模式的應用場景示意圖
l 當DLDP協議工作在普通模式下,係統隻能識別光纖交叉連接這一種類型的單向鏈路。
l 當DLDP協議工作在加強模式下,係統能夠識別光纖交叉連接和一條光纖未連接或斷路這兩種類型的單向鏈路。在探測後一種類型的單向鏈路時,需要將端口配置為強製速率和強製全雙工模式,否則即使啟用了DLDP協議,該協議也不起作用。當出現後一種單向鏈路時,Rx端有信號的端口將處於Disable狀態,而Rx端沒有信號的端口將處於Inactive狀態。
為了防止網絡攻擊和惡意探測,用戶可以在端口上配置DLDP報文認證方式,分為下列三種:
l 不認證方式:發送DLDP報文一方將認證字字段置為全0,認證類型字段置為0;接收DLDP報文一方要將報文中的認證字和認證類型同本端配置進行比較,如果不一致,則丟棄報文。
l 明文認證方式:發送DLDP報文一方將認證字字段置為用戶配置的明文認證密碼,認證類型字段置為1;接收DLDP報文一方要將報文中的認證字和認證類型同本端配置進行比較,如果不一致,則丟棄報文。
l MD5認證方式:發送DLDP報文一方將認證字字段置為用戶配置的密碼采用MD5算法加密後的摘要,認證類型字段置為2;接收DLDP報文一方要將報文中的認證字和認證類型分別和本端配置的密碼用MD5算法加密後的摘要以及本端認證類型進行比較,如果不一致,則丟棄報文。
(1) 如果使能了DLDP的端口鏈路狀態為up,DLDP會向對端發送DLDP報文,同時分析處理對端設備發送過來的DLDP報文。DLDP處在不同的狀態時發送的報文類型不同。
表 4 DLDP發送報文類型
DLDP狀態 | 發送報文類型 |
Active | 帶有RSY標記的Advertisement報文 |
Advertisement | 普通Advertisement報文 |
Probe | Probe報文 |
Disable | 發送一個Disable報文,隨後發送RecoverProbe報文 |
當從其它DLDP狀態(不包括Inactive和Disable)遷移到Initial狀態時,DLDP將發送Flush報文。
(2) DLDP對接收到的報文進行如下分析和處理:
l 在認證方式下,對報文進行認證。如果報文通不過認證,丟棄該報文。
l 報文中的通告時間間隔如果和本設備的不一致,丟棄該報文。
l 對DLDP報文進行處理。
表 5 對接收到的DLDP報文的處理過程
收到報文類型 | 處理過程 | |||
帶RSY標記的Advertisement報文 | 取出鄰居信息 | 如果本機上沒有該鄰居表項,則建立該鄰居表項,啟動此表項的老化定時器,並把DLDP狀態切換到Probe狀態 | ||
如果本機上存在該鄰居表項,則刷新此表項的老化定時器,並把DLDP狀態切換到Probe狀態 | ||||
普通Advertisement報文 | 取出鄰居信息 | 如果本機上沒有該鄰居表項,則建立該鄰居表項,啟動此表項的老化定時器,並把DLDP狀態切換到Probe狀態 | ||
如果本機上存在該鄰居表項,則刷新此表項的老化定時器 | ||||
Flush報文 | 判斷本端口是否為Disable狀態 | 如果是Disable狀態,則不需處理 | ||
如果不是Disable狀態,且鄰居表中有該鄰居信息,則將此鄰居信息刪除 | ||||
Probe報文 | 取出鄰居信息 | 如果本機上沒有該鄰居,則建立該鄰居表項並把自身狀態切換為Probe狀態,向對端回複Echo報文 | ||
如果本機上有該鄰居的表項,則刷新此表項的老化定時器,並向對端回複Echo報文 | ||||
Echo報文 | 取出鄰居信息 | 如果本機上沒有該鄰居表項,則建立該鄰居表項,啟動此表項的老化定時器,並把DLDP狀態切換到Probe狀態 | ||
如果本機上存在該鄰居表項,檢查報文中攜帶的鄰居信息是否和本機相同 | 不同 | 丟棄該Echo報文 | ||
相同 | 將該鄰居標誌位置為雙向連通 如果所有鄰居狀態都為雙向連通,則DLDP狀態由Probe切換為Advertisement,同時將Echo定時器置為無效 | |||
Disable報文 | 判斷本端口是否為Disable狀態 | 如果是Disable狀態,則不需處理 | ||
如果不是Disable狀態,則本端口進入Disable狀態 | ||||
RecoverProbe報文 | 判斷本端口是否為Disable或Advertisement狀態 | 如果不是Disable或Advertisement狀態,則不需處理 | ||
如果是Disable或Advertisement狀態,則回應RecoverEcho報文 | ||||
RecoverEcho報文 | 判斷本端口是否為Disable狀態 | 如果不是Disable狀態,則不需處理 | ||
如果是Disable狀態,檢查該報文中攜帶的鄰居信息是否和本端口信息相同,如果相同,則本端口轉換為Active狀態 | ||||
LinkDown報文 | 判斷本端口是否工作在加強模式下 | 如果不是工作在加強模式下,則不需處理 | ||
如果工作在加強模式下,且本端口不為Disable狀態,則進入Disable狀態 |
(3) 如果DLDP沒有收到鄰居的Echo應答報文,會做如下處理:
表 6 未收到鄰居Echo應答報文時的處理過程
未收到鄰居Echo報文 | 處理過程 |
普通模式下,Echo等待定時器超時還未收到 | 將DLDP狀態轉到Disable,輸出日誌和跟蹤信息,向鄰居發送Disable報文,並根據用戶配置的DLDP Down模式,手動或者自動關閉本端端口。同時刪除該鄰居表項 |
加強模式下,由於加強探測啟動的Echo定時器超時還未收到 |
如果端口的關閉模式被設置為係統自動關閉,當DLDP檢測到單向鏈路時,把端口的狀態設置為DLDP Down,處於此狀態的端口不會轉發業務報文,也不能收發除DLDPDU之外的任何協議報文。
處於DLDP Down狀態端口能在鏈路恢複之時,從DLDP Down狀態中恢複。DLDP Down狀態下的端口仍然會周期性的發送鏈路恢複探測報文(RecoverProbe報文),一旦收到正確的恢複回應報文(RecoverEcho報文),則說明單向鏈路已經變為雙向鏈路,DLDP將此端口重新up。其具體過程如下:
處於DLDP Down狀態的端口向外每2秒發送一次RecoverProbe報文。報文中隻攜帶本端口的信息。對端如果收到該報文,則以RecoverEcho報文作為應答。一旦本端收到RecoverEcho報文,檢查RecoverEcho報文中攜帶的鄰居信息是否和本端口信息相同。如果相同,則認為本端口和該鄰居之間已經恢複雙向連通,則端口從Disable狀態遷移到Active狀態,開始重新建立鄰居關係。
鏈路恢複報文隻在處於DLDP Down狀態的端口上發送和處理。如果端口被用戶使用shutdown命令手工關閉,則自動恢複機製不能生效。
DLDP鄰居的狀態有三種,如表 7所示。
表 7 DLDP鄰居狀態
狀態類型 | 說明 |
未知狀態 | 剛建立這個鄰居,目前正在對鄰居進行探測,還沒有收到鄰居回應時的鄰居狀態。該狀態隻在探測(Probe)過程中存在,探測結束後就轉為雙通或者單通 |
雙通狀態 | 收到鄰居回應後的鄰居狀態,表示目前處於正常的雙向連通狀態,該狀態可以長期穩定存在 |
單通狀態 | 檢測到單通鏈路時的鄰居狀態,此時會將該鄰居刪除 |