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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hexo next主题优化_Zoom虚拟背景没有添加图片

    hexo next主题优化_Zoom虚拟背景没有添加图片Hexo设置博客背景图片(NexT主题)设置背景图片将想要的背景图片命名为background.jpg放入themes/next/source/images。之前很多文章给出的做法都是:打开themes/next/source/css/_custom/custom.styl文件,这个是Next故意留给用户自己个性化定制一些样式的文件,添加以下代码即可。实际上更新的版本里没有_custom,新建目录也无法实现。可以在themes/next/source/css/_schemes/

    2022年10月11日
    0
  • 过滤器和拦截器区别以及执行顺序图_压缩空气过滤器安装顺序

    过滤器和拦截器区别以及执行顺序图_压缩空气过滤器安装顺序过滤器和拦截器区别觉得这个总结的很好,所以用来借鉴借鉴摘抄于网络,侵删过滤器和拦截器执行顺序在SpringBoot中编写测试代码自定义过滤器/***@Author:xiaoshijiu*@Date:2019/5/22*@Description:自定义过滤器*/publicclassMyFilterextendsHttpFilter…

    2022年8月23日
    3
  • 贴片电阻封装与功率对照表_贴片电阻能承受多大电流

    贴片电阻封装与功率对照表_贴片电阻能承受多大电流注意事项:设计和使用贴片电阻时,最大功率不能超过其额定功率,否则会降低其可靠性。一般按额定功率的70%降额设计使用。也不能超过其最大工作电压,否则有击穿的危险。一般按最高工作电压的75%降额设计使用。当环境温度超过70°C,必须按照降额曲线图降额使用。国内贴片电阻的命名方法1、5%精度的命名:RS-05K102JT2、1%精度的命名:RS-05K1002FTR-表示电阻S-表示功率0402是1/16W、0603是1/10W、0805是1/8W、1206是1/4W、1210是1

    2022年8月21日
    11
  • android监听进程杀死_安卓进程管理

    android监听进程杀死_安卓进程管理今天在编写application通用组件时,需要在低内存的回调中杀死进程,所以找了下androd傻进程的方法,总结下来有下面几种:根据进程名称杀进程android.os.Process.killProcess(android.os.Process.myPid());代码本身没什么可以说的,需要注意的是,当进程在前台时,会杀死现有进程,然后再重新启动改线程,类似于手机的重启。但是只要我们把…

    2022年9月4日
    2
  • Android使用系统签名以及安装[通俗易懂]

    Android使用系统签名以及安装[通俗易懂]在adt-bundle下编译APK,并进行Androidapk的系统签名.

    2022年6月21日
    33
  • springboot 指定logback.xml文件的位置(springboot接收参数)

    学习了下psring的日志管理,具体的xml配置文件记录如下,方便以后参考。<?xmlversion="1.0"encoding="UTF-8"?><!–configuration根节点属性说明:scan:配置文件改

    2022年4月11日
    37

发表回复

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

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