原文地址:https://blog.csdn.net/goodluckwhh/article/details/10948065
Table of Contents
隨着網絡技術的發展,接入網路的裝置的種類越來越多,設定越來越複雜,來自不同裝置廠商的裝置也往往會增加自己特有的功能,這就導致在一個網路中往往會有很多具有不同特性的、來自不同廠商的裝置,爲了方便對這樣的網路進行管理,就需要使得不同廠商的裝置能夠在網路中相互發現並互動各自的系統及設定資訊。
LLDP(Link Layer Discovery Protocol,鏈路層發現協定)就是用於這個目的的協定。LLDP定義在802.1ab中,它是一個二層協定,它提供了一種標準的鏈路層發現方式。LLDP協定使得接入網路的一臺裝置可以將其主要的能力,管理地址,裝置標識,介面標識等資訊發送給接入同一個區域網絡的其它裝置。當一個裝置從網路中接收到其它裝置的這些資訊時,它就將這些資訊以MIB的形式儲存起來。
這些MIB資訊可用於發現裝置的物理拓撲結構以及管理設定資訊。需要注意的是LLDP僅僅被設計用於進行資訊通告,它被用於通告一個裝置的資訊並可以獲得其它裝置的資訊,進而得到相關的MIB資訊。它不是一個設定、控制協定,無法通過該協定對遠端裝置進行設定,它只是提供了關於網路拓撲以及管理設定的資訊,這些資訊可以被用於管理、設定的目的,如何用取決於資訊的使用者。
LLDP的框架結構如圖所示:
此圖也表明LLDP就是一個資訊發現與通告協定,LLDP的實體主要維護了兩個MIB庫,一個 local system MIB,一個remote system MIB。從其名字也可以看出,一個用於維護本地相關的裝置MIB資訊,一個用於維護遠端裝置MIB資訊。
LLDP通過與上圖中右側的幾個MIB庫互動來初始化並維護 local system MIB,並將原生的相關資訊通告出去;同時當接收到來自其它裝置的資訊時就將其更新到remote system MIB中。通過這種工作方式,一個裝置就可以將自己的資訊通告出去並獲得網路中其它裝置的相關資訊,最終獲得反應網路拓撲以及其它設定資訊的兩個MIB庫。這兩個庫可以被其使用者用來完成各種功能。
需要說明的是LLDP資訊的通告以及接收處理不受埠的STP狀態的影響。
封裝有 LLDPDU 的報文稱爲 LLDP 幀,其封裝格式有兩種:Ethernet II 和 SNAP(Subnetwork Access Protocol,子網存取協定)。
上圖是以Ethernet II格式封裝的LLDP幀,其中各欄位的含義如下:
上圖是以SNAP格式封裝的LLDP幀,其中各欄位的含義如下:
目地地址實際上包括三個,分別爲01-80-C2-00-00-0E,01-80-C2-00-00-03,01-80-C2-00-00-00。這三個地址分別用於不同的目地,它們可以跨越不同的網路。
TPMR以及S-VLAN,C-VLAN都是802.1Q中的概念,包括這三者的網路以及各個地址的作用範圍如下圖所示:
LLDPPDU是LLDP的有效負載,用於承載要發送的訊息。LLPDU的格式如下圖所示:
LLDPDU採用了TLV的格式,即type+lenght+value的格式,type表示TLV的型別,length是以位元組爲單位的TLV的長度,value是該TLV的值。其中Chassis ID TLV,Port ID TLV Time To Live TLV以及End Of LLDPDU TLV是強制的,必須包含的部分,除此之外在TLV Time To Live TLV和End Of LLDPDU TLV之間可以包含0個到多個可選的其它TLV。
TLV是組成 LLDPDU的單元,每個 TLV都代表一個資訊。LLDPDU的TLV可以分爲兩大類:
TLV的基本格式如圖所示:
TLV的型別域的定義及分配如下圖所示:
其中type0-8屬於基本的TLV集合。對於其中的Mandatory的TLV,它是必須包含在LLDP中的。
組織定義TLV集合的格式如下圖所示:
其中:
幾個強制的必須包含的TLV的定義如下。非強制的可以參考IEEE802.1AB。
該TLV用於標識LLDPDU的結束。其格式如下:
由於length=0,因此它不包含value域。
該TLV用於通告該LLDPDU發送者的chassis ID。由於有很多方式可用來標識一個chassis,因此在該類TLV中包含一個子型別域用於告訴接收者,發送者的chassis ID採用的是哪一種標識方式。其格式如圖所示:
每個LLDPDU必須包含且僅包含一個該型別的TLV。由於chassis ID實際上是用於標識裝置的,因此在連線可用時它應該保持不變。
chassis子型別所可能的取值如圖所示:
它用於標識發送該LLDPDU的裝置的埠。類似於chassis ID,有很多方式可以標識一個Port,因此該TLV也包含一個子型別域。其格式如下圖所示:
每個LLDPDU必須包含一個且只能包含一個該型別的TLV。同時,當埠可用時,從該埠發送出去的LLDPDU的該TLV應該保持不變。
其子型別的可能取值如下圖所示:
該TLV用於告訴接收端,它接收到的這些資訊的有效期有多長。其格式如圖所示:
TTL的時間單位是秒,由於只有2個位元組長,因而最大有效時間是65536秒。如果在這個時間到期了還沒有新的LLDPDU被收到,則該TLV所屬的那個LLDPDU攜帶的資訊會被從MIB中刪除。如果收到了新的LLDPDU,則:
每一個LLDPDU必須包含且只能包含一個該型別的TLV。
LLDP是一個用於資訊通告和獲取的協定,但是需要注意的一點是,LLDP發送的資訊通告不需要確認,不能發送一個請求來請求獲取某些資訊,也就是說LLDP是一個單向的協定,只有主動通告一種工作方式,無需確認,不能查詢、請求(比如像ARP協定那樣請求某個IP的MAC地址)。
LLDP主要完成如下工作:
LLDPDU的發送可以被如下事件觸發:
LLDP的常規發送時間是建立在系統的tick之上的,間隔爲1秒一個,爲了防止在共用媒介的LAN(shared media LAN)中同時出現大量的LLDPDU(因爲接入同一個LAN的多個系統的時間是同步的,因而多個系統上的基於tick的1秒定時器可能同時到期),發送定時器引入了一個隨機的抖動,這就使得常規的LLDP幀的發送間隔時間的平均值仍是1秒,但是具體到某一次到期時間可能並不是準確的1秒。
同時爲了防止在有多個埠需要發送LLDPDU的系統中,所有的埠的定時器都在同一時間到期,因而標準建議將採用某種機制 機製將多個發送範例的定時器到期時間給錯開,以避免一個系統在同一時刻發送大量的LLDPDU。
LLDPDU的發送狀態機如圖所示
對於該狀態機:
LLDP發送定時器狀態機如圖所示:
localChange表示本地資訊是否發生改變;txTTR表示下一次定時器到期的時間;newNeighbor表示是否發現了新的鄰居,並由接收狀態設定,由該狀態機清除;txTick表示基於系統時間的1秒定時器是否到期。
對於該狀態機:
這裏有取值範圍的幾個變數都是可設定的變數。
從上述兩個狀態機的工作狀態可以看出,發送定時器狀態機用於維護信用量以及是否允許發送LLDPDU幀,而發送狀態機根據這兩個資訊來決定是否發送。
另外需要注意的是LLDP所使用的所有定時器操作都是基於「基於系統時間的1秒定時器的」,每當這個定時器到期時它除了會將txTick設定爲TRUE外,還會處理其它的定時功能。
LLDP幀的接收由3個階段組成:幀的識別、幀的校驗以及LLDP遠端MIB資訊庫更新。
2.1.1 幀的識別
幀識別由在LLDP/LSAP(鏈路服務存取點)進行,檢查的內容是幀的目的地是否是LLDP的組播MAC地址,幀的型別是否是LLDP。
2.1.2 幀的驗證
該過程會首先根據TLV的格式定義依次校驗Chassis ID TLV,Port ID TLV, Time To Live TLV,如果這三個TLV都存在且有效,纔會進一步的解碼可選的TLV直到遇到End Of LLDPDU TLV,然後根據獲得的資訊更新遠端MIB資訊庫。
2.1.3 遠端MIB資訊庫更新
在前兩步都通過之後,LLDPDU的接收者就需要根據解析出來的資訊更新遠端MIB資訊庫。在MIB資訊庫中,LLDP使用chassis ID + Port ID來標識、儲存來自不同源的資訊。
更新時,如果需要新增新的chassis ID + Port ID的表項,或者爲某個chassis ID + Port ID新增新的TLV,則可能遇到沒有記憶體的問題,標準沒有規定必須如何處理,只是給出了一些建議:
LLDPDU 攜帶的TTL(Time To Live)值會影響接收端的處理方式,如果它不爲0,則更新相應資訊的老化時間,如果接收到的LLDPDU 中的TTL 等於0,則將立刻老化掉相應的資訊(即與該LLDPDU的發送者相關的MIB資訊)。
如果一個chassis ID + Port ID標識的資訊的TTL超時,則相應的MIB資訊會被刪除。
LLDPDU的接收狀態機如圖所示:
LLDP可以工作在多種模式下:
由於LLDP可以單獨工作在發送或接收模式下,因此LLDP協定的實現需要支援單獨初始化發送或者接收功能。當工作模式發生變化時,需要根據老的/新的工作模式來關閉/打開發送或者接收的功能。