一、ARP协议报文、802.1X协议报文、LLDP协议报文、IGMP协议报文、ICMP协议报文、协议识别及维测统计

ARP 数据报文格式如下图所示:

主要参数包括:

  • 硬件类型:2 字节,值为 1 表示以太网地址
  • 协议类型:2 字节,0x0800 表示 IP 地址
  • u硬件地址长度:1 字节,数值为 6
  • u协议地址长度:1 字节,数值为 4
  • u操作代码:2 字节,1 表示请求报文,2 表示应答报文
  • u源 MAC 地址:6 字节
  • u源 IP 地址:4 节字
  • u 目的MAC 地址:6 字节
  • u 目的IP 地址:4 节字

1、802. 1X 协议报

        802. 1X 协议使用 EAP(Extensible Authentication Protocol ,可扩展认证协议)来实现客户端、NAS 和认证服务器之间认证信息的传递

        当 EAPOL 报文的 Packet Type 字段值为 0000 0000 时,表明 Packet Body 字段封装的是一个 EAP 数据包

主要参数包括:

  • Code:1 字节,EAP 帧类型,(Request 、Response 、Success 、Failure)
  • Identifier:1 字节,匹配 Request 消息和 Response 消息
  • Length:2 字节,EAP 帧的总长度(Code + Identifier + Length + Data 域)
  • Data:0 或更多字节,EAP 包的内容
  • 当 Code 字段的值为 Success 、Failure 时,Data 的值为空。
  • 当 Code 字段的值为 Request 、Response 时,Data 才有值,值包含 Type、 

Type data 两部分;其中 Type 的类型有:

  • Type =1 -Identifier(要求客户端程序发送用户输入的用户名信息)
  • Type =2 -Notification(非必须的一个消息,传送一些警告消息)
  • Type =3 -Response Only(Request报文中的认证类型不可接受时回应该类型的报文)
  • Type =4 -MD5-Challenge(类似于 CHAP 中的 MD5-Challenge)
  • Type =5 -One-Time Password (OTP)(一种密码交互的方式)
  • Type =6 -Generic Token Card(支持 Challenge 和 Response 时使用令牌)
  • Type =254 -Expanded Types(支持厂商自己扩展的类型)
  • Type =255 -Experimental use(实验新的类型时做测试用的类型)

2.    LLDP 协议报文

        LLDP(Link Layer Discovery Protocol ,链路层发现协议)是 IEEE 802. 1ab中定义的第二层发现(Layer 2 Discovery)协议。LLDP 提供了一种标准的链路层发现方式,可以将本端设备的主要能力、管理地址、设备标识、接口标识等信息封装到 LLDP 报文中传递给邻居节点,邻居节点在收到这些信息后将其以标准 MIB(Management Information Base ,管理信息库)的形式保存起来,供 NMS(Network Management System ,网络管理系统)查询及判断链路的通信状况。封装有 LLDP 数据单元 LLDPDU(LLDP Data Unit)的报文称为 LLDP 报文。LLDP 的帧格式如下图所示:        

主要字段包括:
  • Destination Mac: 长度 6 个字节,LLDP 帧的目的 MAC 地址。IEEE802. 1AB 规定可以取如下 3 种值:0x0180-C200-000E: 最近网桥(NearestBridge)组 MAC 地址。0x0180-C200-0003: 最近的非两端口 MAC 中继网桥(Nearest non-TPMR Bridge)组地址。0x0180-C200-0000: 最近的客户网桥(Nearest Customer Bridge)组 MAC 地址。
  • Source Mac: 长度 6 个字节,源 MAC 地址,为端口MAC 地址或设备桥MAC 地址(如果有端口地址则使用端口MAC 地址,否则使用设备桥 MAC 地址)。
  • LLDPDU:长度不固定变长,数据字段,标识帧的负载,为LLDPDU 。LLDPDU 就是封装在 LLDP 报文数据部分的数据单元。在组成LLDPDU 之前,设备先将本地信息封装成 TLV 格式,再由若干个 TLV 组合成一个 LLDPDU 封装在 LLDP 报文的数据部分进行传送。
  • FCS:4 字节,帧校验序列 FCS(Frame Check Sequence)是为接收网卡提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。FCS 只是通用叫法,具体的 FCS 还可以细分多种校验方法。在以太帧中,FCS 通常采用循环冗余码校验 CRC(Cyclical Redundancy Check)

        LLDPDU 包含了多个 TLV ,以 Chasis ID TLV、Port ID TLV 、TTLTLV 这三个 TLV 开头,以 End TLV 结尾,中间是可选 TLV ,如图 2 。LLDP 报文中必须包含这 4 个 TLV ,并且不能多于一个,否则就属于非法报文。可选携带即LLDP 报文中可以包含也可以不包含这些 TLV 。IEEE 802. 1AB 标准中将 TLV 分为基本 TLV(Basic TLV)、组织 TLV(Organizationally Specific TLVs)以及保留 TLV

LLDPDU 基本 TLV 格式:
  •  End ofLLDPDU(Type=0):

        2 字节的全零的 TLV ,用于标记 LLDPDU 的结尾。当端口的状态发生改变(比如去使能 LLDP 或者端口 shut down)时,端口会向邻接设备发送一个LLDPDU ,其中 Time to Live TLV 中的 TTL=0 ,这个报文就是 shutdown 报文。所以 End ofLLDPDU TLV 只有类型和长度,没有 TLV information string 字段。

  • Classsis ID TLV(Type = 1):

        表示发送该 LLDP 报文的设备的 ID ,每个 LLDP 报文必须包含且只能包含一个 Chassis ID TLV 。LLDPDU 的第一个 TLV 必须是 Chassis ID TLV 。Chassis ID TLV 的 TLV Value 域必须以 8 比特的 chassis ID subtype 开头。

  • Port ID TLV(Type =2)

LLDPDU 的发送端口名称。每个 LLDPDU 必须包含且只能包含一个 Port ID TLV。

  • Time to Live TLV(Type=3):

        是一个 4 字节的 TLV ,用于标识 LLDP 在邻居设备的存活时间。该 TLV 的值是一个 0 –65535 的整数,它用来告诉接收端发送信息的有效期限,所以如果发送端在一段时间后没有更新该信息的话,接收端将丢弃该信息,对端接受到此 TLV 后,会用这个有效时间去更新其远端邻居的信息老化时间,它的单位为秒。

  • Port Descripton(Type=4):

        标识了本地设备端口的描述信息,如果设备支持 IETF RFC 2863,这个 TLV的值应该与 RFC 2863 的 iftable表项的 ifDescr 叶子节点值一致。在一个LLDPDU 报文中,只能包含一个 Port Description TLV。

  • System Name(Type=5):

        标识了本地设备的完整域名,如果设备支持 IETF RFC 3418 ,这个 TLV 的值应该与 RFC 3418 中的 sysName 的值一致。在一个 LLDPDU 报文中,只能包含一个 System Name TLV。

System Description (Type=6):标识了本地设备的全称、系统硬件类型的版本号、操作系统、网络软件等。如果设备支持 IETF RFC 3418,这个 TLV 的值应该与 RFC 3418 中的 sysDesc的值一致。在一个 LLDPDU 报文中,只能包含一个 System Description TLV。

  • System Capabilities(Type=7):

        标识设备支持的功能以及已使能的功能。如果该 TLV 列出的已使能功能不包含在系统支持功能中,该 TLV 会被视为有错误而被丢弃。

  • Management Address(Type=8):

管理地址,以及对应的接口号和 OID(Object Identifier ,对象标识)。

3.    IGMP 协议报文

IGMPv3 包含查询报文和报告报文两种不同格式的报文。

查询报文格式如下图所示:

IGMP v3 查询报文字段说明:

● 类型(Type): 0x11  成员关系查询

● 最大响应代码(Max_Resp_Code):

        最大响应代码字段指定在发送一个响应报告之前所允许的最大时间。实际允许的时间,被称为最大响应时间,其单位是 1/10 秒。

        最大响应时间的小值允许 IGMPv3 路由器调节“离开延迟 ”(最后一台主机离开组的那个时间点跟路由协议被通知到已经不存在成员的那个时间点,两者之间的时间差) 。更大的值,尤其在指数范围内的值,可以调节网络中IGMP 流量的爆炸。

● 校验和:

校验和是对整个 IGMP 数据报以 16 位为一段进行取反求和。为了计算校验和,校验和字段开始必须被设置成 0 。当收到一个数据,在处理之前必须先对校验和进行验证

● 组地址(GroupAddress):

当发送一个普通查询的时候,组地址字段必须被置 0 。当发送一个指定组查询或者发送一个指定组和源的查询时,必须被设置成要被查询的IP 组地址。

● 保留(Resv):

发送的时候以0 填充,接收的时候不做处理,被忽略。

● 标志位 S(禁止路由器处理):

        当被设置成 1 的时候,S 标志表示任何接收路由器禁止更新它们在收到查询时要更新的那些定时器。但它不禁止查询者选举或者普通的在路由器上执行的(当路由器作为一个组成员的时候)主机端的查询处理

● QQIC:查询间隔时间,单位是秒;

● 查询者的健壮变量(QRV)

        如果不为 0 ,QRV 中包含中一个被查询者使用的[健壮变量]的值,如果查询者的健壮变量的值超过 7 ,即 QRV 字段的最大值,那么QRV 被设成 0 。路由器取最近收到的查询中的 QRV 值作为它们自己的健壮性变量的值,除非最近收到的 QRV 是 0 ,在这种情况下,接收者使用缺省的健壮性变量值,或者是一个静态配置的值。

● 查询者的查询间隔代码(QQIC)

        查询者的查询间隔代码字段指定查询者使用的[查询间隔] 。实际的间隔,称为查询者的查询间隔(QQI) ,以秒为单位表示。

● 源数量 Number_of_Source:

        源数量(N)字段表明该查询中存在多少个源地址。在普通查询或指定组查询中这个值是 0 ,在指定组和源的查询中,这个值为非 0 值。

● 附加数据:

        如果收到的查询中的 IP 首部中数据报长度字段表明除了上述的字段之外,还有附加的数据存在,IGMPv3 的实现在计算校验和的时候必须包含这些数据,但是在发送查询的时候,必须忽略这些数据,一个 IGMPv3 的实现在上述字段之外,不能再包含其它数据。

报告报文格式如下图:

IGMP v3 报告报文字段说明:

● Type(8bit):0x22 成员关系报告

● Reserved( 8bit)和 Reserved( 16bit):

        都是表示保留字段,不过在 IGMP 中为了使它们都保持对应的长度,所以才有了长度上的区别,它在发送的时候是以0 填充,在接收的时候是不作任何处理的。

● 校验和:

        校验和是对整个 IGMP 消息以 16 位为一段进行取反求和。为了计算校验和,校验和字段首先必须被置 0 。当收到一个数据,在处理之前,必须先对校验和进行验证。

● Number_of_Group_Records(M):

该字段表示该报告报文中包含有几个组记录

● Group Record[i] (i 从 1 到 M):

        一个主机可能需要点播多个组播地址的组播业务,每个记录包含了对应于其中一个组播地址的源地址列表等信息,它受到 Number_of_Group_Records 的大小的影响。

        每一个组记录字段是一整块数据,其含有的信息是关于发送者在报告发送接口上的某一个多播组的成员关系。

4.    ICMP 协议报文

        ICMP(Internet Control Message Protocol)是一种网络协议,它用于在 IP 网络中传递控制信息和错误消息。它通常与 IP 协议一起使用,IP 协议负责发送和路由数据包,而 ICMP 协议负责检查网络是否可达、路由是否正确、主机是否可达等网络状态的反馈信息。

ICMP 协议处理模块的主要功能如下:

  • 发现网络错误:当一个数据包在传输过程中出现错误时,ICMP 协议通过向发送方发送错误通知来发现网络错误。
  • 检查网络是否可达:通过发送 ICMP ECHO 请求并接收 ICMP ECHO 回复消息,可以确定目标主机是否可达。
  • 发现主机错误:当一个主机无法正常工作时,ICMP 协议通过向发送方发送错误通知来发现主机错误。
  • 发送路由信息:ICMP 协议可以向其他主机发送路由信息,以帮助它们在网络中找到合适的路由。

ICMP 数据格式如下:

ICMP 首部格式:

        在 ICMP 协议处理模块中,识别及构造 ICMP 报文。接收到 ICMP 报文,被动响应对应的 ICMP 回应报文。

5.    SNMP 网络管理协议

        SNMP 的前身是简单网关监控协议(SGMP),用来对通信线路进行管理。随后,人们对 SGMP 进行了很大的修改,特别是加入了符合 Internet定义的  SMI(一种管理信息的结构)和 MIB ,然后就演进成为了 SNMP 协议。

        SNMP 采用特殊的客户机/服务器模式,即代理(agent)/管理站(NMS)模型。对网络的管理与维护是通过管理工作站与 SNMP 代理间的交互工作完成的。每个 SNMP 从代理负责回答 SNMP 管理工作站(主代理)关于 MIB 定义信息的各种查询。所以,对于被管理设备来说,可以认为他就是一个 agent。

SNMP 的应用场景如图所示:

        其中管理员通过操作管理站(NMS)跟被管设备(Agent)通信,同时在两者中都维护了一个 MIB 库,通过 MIB 库中定义的节点(OID)来唯一标识双方操作的是那个数据。当然 MIB 库也有公共的节点(system .etc),各个厂家也会加入自己的私有节点,通过写成 MIB 文件的形式发布个客户。

SNMP 工作场景如图:

        管理站和 agent 之间 Get/Set 请求使用 161 port进行交互,因为使用UDP 协议,不存在连接,GET/SET 通过数据报的消息发送和接收,162 port用于发送告警信息(Agent主动发出,告知 NMS 有某些事情发生)。

        SNMP 代理和管理站通过 SNMP 协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP 使用 UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP 消息报文包含两个部分:SNMP 报头和协议数据单元 PDU。

snmp 也定义了几种trap 类型,如下:

6、协议识别及维测统计

        IP数据报文都是由首部和数据两部分组成。每个IP数据报都以一个IP报头开始。IP报头中包含大量信息,如源IP地址、目的IP地址、数据报长度、IP版本号等。每个信息都被称为一个字段。模块支持IPV4、ARP、802.1x、LLDP、IGMP等协议字段识别。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐