lldp协议代码阅读_LLDP链路层发现协议详解

lldp协议代码阅读_LLDP链路层发现协议详解LLDP(链路层发现协议)是定义在802.1ab中的一个二层协议,接入网络的设备可以通过其,将管理地址、设备标识、接口标识等信息发送给同一个局域网络的其它设备。LLDP帧格式封装有LLDPDU的报文称为LLDP帧,其封装格式有两种:EthernetII和SNAP(SubnetworkAccessProtocol,子网访问协议)。EthernetII格式封装的LLDP帧…

大家好,又见面了,我是你们的朋友全栈君。

LLDP(链路层发现协议)是定义在802.1ab中的一个二层协议,接入网络的设备可以通过其,将管理地址、设备标识、接口标识等信息发送给同一个局域网络的其它设备。

LLDP 帧格式

封装有 LLDP DU 的报文称为 LLDP 帧,其封装格式有两种:Ethernet II 和 SNAP(Subnetwork Access Protocol,子网访问协议)。

Ethernet II 格式封装的 LLDP 帧

其中各字段的含义如下:DA:目的 MAC地址,为固定的组播 MAC地址 0x0180-C200-000E。

SA:源 MAC地址,为端口 MAC 地址或设备 MAC 地址(如有端口地址则用端口 MAC 地址,否则用设备 MAC 地址)。

Type:帧类型,为 0x88CC。

Data:数据,为 LLDPDU。

FCS:帧检验序列。

SNAP 格式封装的 LLDP 帧

各字段的含义如下:DA:目的 MAC 地址,为固定的组播 MAC 地址 01-80-C2-00-00-0E。

SA:源 MAC 地址,为端口 MAC 地址或设备 MAC 地址(如果有端口地址则用端口 MAC 地址,否则用设备 MAC 地址)。

Type:帧类型,为 0xAAAA-0300-0000-88CC。

Data:数据,为 LLDPDU。

FCS:帧检验序列。

LLDP 工作机制

LLDP 是一个用于信息通告和获取的协议,但是需要注意的一点是,LLDP 发送的信息通告不需要确认,不能发送一个请求来请求获取某些信息,也就是说 LLDP 是一个单向的协议,只有主动通告一种工作方式,无需确认,不能查询、请求(比如像 ARP 协议那样请求某个 IP 的MAC 地址)。

LLDP 主要完成如下工作:1.初始化并维护本地MIB 库中的信息。

2.从本地 MIB 库中提取信息,并将信息封装到 LLDP 帧中。LLDP 帧的发送有两种触发方式,一是定时器到期触发,一是设备状态发生了变化触发。

3.识别并处理接收到的 LLDP DU 帧

4.维护远端设备 LLDP MIB 信息库。

5.当本地或远端设备 MIB 信息库中有信息发生变化时,发出通告事件。

LLDP DU 发送机制

LLDP DU 的发送可以被如下事件触发:与本地 MIB 信息库相关联的定时器 tx TTR 到期时,这将确保远端接收系统中的相关信息不会因为 TTL 到期而过期。

本地 MIB 信息库中的信息发生了改变时,会立即发送 LLDP DU,这将保证改变能及时被更新。

如果一个“新邻居”被识别,将会启用快速发送机制,在很短的时间内连续发送指定数量(txFastInit,默认值为4)的 LLDP DU,以确保“新邻居”能被快速更新。如果远端系统MIB信息库因为过载(tooManyNeighbors)而不能容纳新的邻居信息,则会为了避免过多的 PDU传输而抑制快速发送行为。

LLDP DU 接收机制

LLDP 帧的接收由3个阶段组成:帧的识别、帧的校验以及 LLDP 远端 MIB 信息库更新。

帧的识别

帧识别由在 LLDP/LSAP(链路服务访问点)进行,检查的内容是帧的目的地是否是 LLDP 的组播 MAC 地址,帧的类型是否是 LLDP。

帧的验证

该过程会首先根据 TLV 的格式定义依次校验 Chassis ID TLV,Port ID TLV, Time To Live TLV,如果这三个TLV都存在且有效,才会进一步的解码可选的 TLV 直到遇到 End Of LLDPDU TLV,然后根据获得的信息更新远端 MIB 信息库。

远端MIB 信息库更新

在前两步都通过之后,LLDP DU 的接收者就需要根据解析出来的信息更新远端 MIB 信息库。在 MIB 信息库中,LLDP 使用 chassis ID + Port ID 来标识、存储来自不同源的信息。如果远端 MIB 库中已经有对应于该 chassis ID + Port ID 的信息,则使用收到的帧中的新的 TTL 来更新 TTL。并用对于收到的新的 LLDPP DU 中的每一种 type,如果有变化就进行更新,如果某种 type 原来不存在,则需要将其添加到MIB库中。

如果实现不支持某种类型的 type,则:

如果 type 不是 127,则按照基本 TLV 的格式将其存储到远端MIB库,存储格式为 type, length,value。

如果 type 是127,则按照组织定义TLV的格式将其存储到远端MIB库,存储格式为 type, length,value,OUI,组织自定义子类型,以及信息域。

更新时,如果需要添加新的 chassis ID + Port ID 的表项,或者为某个 chassis ID + Port ID添加新的 TLV,则可能遇到没有内存的问题,标准没有规定必须如何处理,只是给出了一些建议:• 忽略新的 LLDP DU 的信息

• 删除最旧的信息以释放空间给新的信息

• 随机删除一些旧的信息以释放空间给新的信息

LLDP DU 携带的TTL(Time To Live)值会影响接收端的处理方式,如果它不为0,则更新相应信息的老化时间,如果接收到的 LLDPDU 中的 TTL 等于0,则将立刻老化掉相应的信息(即与该 LLDP DU 的发送者相关的MIB信息)。

如果一个 chassis ID+Port ID 标识的信息的 TTL 超时,则相应的 MIB 信息会被删除。

LLDP 工作模式

LLDP 工作模式:• TxRx:既发送也接收 LLDP 帧。

• Tx:只发送不接收 LLDP 帧。

• Rx:只接收不发送 LLDP 帧。

• Disable:既不发送也不接收 LLDP 帧(准确的说,这并不是一个 LLDP 的状态,这可能是• LLDP 功能被关闭了,也可能是设备就不支持)。

由于 LLDP 可以单独工作在发送或接收模式下,因此 LLDP 协议的实现需要支持单独初始化发送或者接收功能。当工作模式发生变化时,需要根据老的/新的工作模式来关闭/打开发送或者接收的功能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137746.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • markdown字体颜色设置_markdown红色字体

    markdown字体颜色设置_markdown红色字体 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过类似HTML的标记语法,它可以使普通文本内容具有一定的格式。但是它本身是不支持修改背景色功能的!  从HTMLEditor转到CSDN-markdown编辑器的很多朋友可能有些不适应,明明很简单的背景色功能,这里却找不到了。  CSDN-markdown编辑器是其衍生版本,扩展了Markdown的功能(如表格、脚注、内嵌HTML等等)!对,就是内嵌HTML,接下来要讲的功能就需要使用内嵌HTML的方法来实现。  背景色由.

    2022年10月22日
    1
  • NSGA2 算法MATLAB完整代码 中文注释详解

    NSGA2 算法MATLAB完整代码 中文注释详解2019.7.17很意外本人这篇文章受到很多人的关注,在此把源码贴出来供大家更好的理解学习。https://download.csdn.net/download/joekepler/10590751========================分割=====================================本人最近研究NSGA2算法,网上有很多示例代码,但是基本没有…

    2022年5月12日
    43
  • ios在SQLite3基本操作

    ios在SQLite3基本操作

    2022年1月1日
    39
  • 2020年5月份编程语言排行榜「建议收藏」

    2020年5月份编程语言排行榜「建议收藏」前言本文章中语言排名数据来自TIOBE排行榜和PYPL排行榜。这段时间一直在忙,都忘记更新这个排行榜了,今天重操旧业,给大家看一下5月份的编程语言排行榜TIOBE排行榜5月份数据2020年5月TIOBE指数以下是官方说明五月标题:编程语言C又回到了第一位Java和C在4月份已经非常接近了,但是这个月C再次超越了Java。上一次C排名第一是在2015年。我们只能猜测为什么C又是第一名。其中一个原因可能是冠状病毒。这听起来可能很傻,但有些编程语言确实从这种情况中受益。数据科学领域的例子有P

    2022年5月31日
    60
  • C#递归题目代码建议收藏

    一列数的规则如下:1、1、2、3、5、8、13、21、34……求第30位数是多少,用递归算法实现。代码:1publicclassMainClass23{45public

    2021年12月21日
    38
  • Java中Random用法

    Java中Random用法今天看帖子时候看到了蓄水池算法,想起来之前看到过这样的题目,记录一下用到的Random类吧,面试写算法应该会碰到这样的题目。首先Random是随机生成数用法,介绍一下:1、Random.nextInt():这个用法就是生成一个Int范围里的一个随机数,用法举个例子:Randonmrandom=newRandom;System.out.println(random.nextInt());这时候输出的就是一个随机数,范围就是int的范围,当然括号里是可以填参数的,比如random.nextInt

    2022年7月7日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号