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 协议的实现需要支持单独初始化发送或者接收功能。当工作模式发生变化时,需要根据老的/新的工作模式来关闭/打开发送或者接收的功能。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Ubuntu下Chrome运行Silverlight程序

    Ubuntu下Chrome运行Silverlight程序

  • 「机械工程」力矩,转矩,扭矩的理解

    「机械工程」力矩,转矩,扭矩的理解1.力矩定义:力矩在物理学里是指作用力使物体绕着转动轴或支点转动的趋向。力矩的单位是牛顿-米。力矩希腊字母是tau。力矩的概念,起源于阿基米德对杠杆的研究。转动力矩又称为转矩或扭矩。力矩能够使物体改变其旋转运动。推挤或拖拉涉及到作用力,而扭转则涉及到力矩。力矩等于径向矢量与作用力的叉积。力矩在物理学里是指作用力使物体绕着转动轴或支点转动的趋向,是力对物体产生转动作用的物理量。可以分…

  • C#数组反转

    C#数组反转staticvoidMain(string[]arr){string[]names={“老杨1″,”老李2″,”老王3″,”老牛4″,”老虎5″,”老磁6”};for(inti=0;i<names.Length/2;i++){…

  • kalilinuxarp攻击_linux开启转发

    kalilinuxarp攻击_linux开启转发arpspoof-iwlan0-t10.50.129.4410.50.128.1arpspoof-iwlan0-t10.50.128.110.50.128.197mkdirtmp_picsdriftnet-iwlan0-dtmp_pics转载于:https://www.cnblogs.com/albertofwb/articles/4901195.ht…

  • jedis和jediscluster_java coroutine

    jedis和jediscluster_java coroutine1.JedisCluster类结构JedisCluster是针对RedisCluster的java客户端,它封装了java访问redis集群的各种操作,包括初始化连接、请求重定向等。我们先来看下JedisCluster的类结构:jedisCluster.pngJedisCluster初始化时,所有的集群连接信息都是封装在JedisClusterInfoCache里,由于jedis本身不是线程安全…

    2022年10月15日
  • Python使用captcha制作验证码[通俗易懂]

    Python使用captcha制作验证码[通俗易懂]在使用Keras搭建验证码识别模型时,需要大量的验证码图片。在这里,使用captcha模块生成验证码图片,验证码图片名称为验证码上显示的字符串。1生成单张验证码图片并显示生成一张验证码的代码如下:fromcaptcha.imageimportImageCaptchaimportmatplotlib.pyplotaspltimportnumpyasnpimport……

发表回复

您的电子邮箱地址不会被公开。

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