当前位置: 首页 > news >正文

wireshark抓包并进行Eigrp网络协议分析

路由协议

Eigrp

​ EIGRP:Enhanced Interior Gateway Routing Protocol 即 增强内部网关路由协议。也翻译为 加强型内部网关路由协议。 EIGRP是Cisco公司的私有协议(2013年已经公有化)。 EIGRP结合了链路状态距离矢量型路由选择协议的Cisco专用协议,采用弥散修正算法(DUAL)来实现快速收敛,可以不发送定期的路由更新信息以减少带宽的占用,支持Appletalk、IP、Novell和NetWare等多种网络层协议。该协议是一个内部网关协议。不同协议类型如下:

  • IGP:内部网关协议,在一个自治系统内运行。比如:RIP、OSPF、IS-IS、EIGRP等。
  • EGP:外部网关协议,用于连接不同的自治系统。比如:BGP

EIGRP报文

#字段解释
Cisco EIGRPVersion: 2    #协议号Opcode: Hello (5)   #Opcode字段,报文类型:1 Update、 3 Query、 4 Reply、 5 Hello/ACKChecksum: 0xeecb [correct][Checksum Status: Good]
#	标志(0x01表示INIT,0x02表示CR) INIT标志表示发送给新邻居的第一个初始化Update报文,这个报文将携带所有的路由信息,而以后的普通的Update报文将只携带变化了的路由信息Flags: 0x00000000.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set
"""
CR状态的作用:
某路由器R在一个接口上有A,B,C三个邻居.它向这个接口发送了一个Update报文,然后收到了A,C的确认,但是因为某种原因没有收到B的确认,这样无法知道B是否收到了这份Update报文.此时,路由器R既不想继续等B的确认;也不希望B在没有收到第一份Update报文的情况下接收第二份Update报文,因为这种失序有可能引起混乱.于是,路由器R发了一个带有Sequense TLV的Hello报文,里面列出了B的IP地址,这样A,C就会将自己置于CR状态,B则会保持正常态.R发出的后续Update报文将在报文头中打上CR标志,这样只有A,C才会接收到这些报文,而B因为不是CR状态,将会忽略带有CR标志的报文,这样就保证了B不会接收到失序的报文.路由器R将在稍后向B依次发送B所错过的报文
""".... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 0... = End Of Table: Not set   #分享路由信息Sequence: 0		#报文的序列号,用于确认机制,不需要确认的报文,如Hello报文,这个域为0.Acknowledge: 0	#文携带的确认信息.表示已经收到了此序列号的报文.Virtual Router ID: 0 (Address-Family)Autonomous System: 1	#自治系统号一般来说就是进程号.ParametersType: Parameters (0x0001)Length: 12K1: 1K2: 0K3: 1K4: 0K5: 0K6: 0Hold Time: 15Software Version: EIGRP=12.4, TLV=1.2Type: Software Version (0x0004)Length: 8EIGRP Release: 12.04EIGRP TLV version: 1.02# Sequense TLV可能出现在Hello报文中,它的TLV Type为0x0003,它的作用让某些邻居路由器进入到CR(Conditional Receive)状态.表示了一个邻居路由器的IP地址,Sequense TLV可以携带多个IP地址的列表.凡是接收到这个TLV的邻居路由器将检查自己是否在这个列表中,如果不在这个列表中,则把自己置为CR状态.只有处于CR状态的路由器,才能接收带有CR标志的报文.(EIGRP报文头部分中关于Flags字段的说明).SequenceType: Sequence (0x0003)Length: 9Address length: 4IP Address: 10.0.0.1
"""
Next Multicast Seq TLV可以出现在Hello报文中,它的TLV Type为0x0005.它需要和与Sequense TLV配合使用,单独的Next Multicast Seq TLV没有意义.在有Sequense TLV,但没有Next Multicast Seq TLV时,表示处于CR状态的邻居路由器可以接收以后所有带CR标志的报文.在有Sequense TLV和Next Multicast Seq TLV都有时,则Next Multicast Seq TLV指定了一个序列号,处于CR状态的邻居路由器只可以接收带CR标志,并且序列号为这个指定序列号的报文."""Next multicast sequence: 25Type: Next multicast sequence (0x0005)Length: 8Multicast Sequence: 25       #Seq Number:下一个可以接收的多播报文的序列号.# update消息Opcode: Update (1)Checksum: 0x24b9 [correct][Checksum Status: Good]Flags: 0x00000008, End Of Table.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 1... = End Of Table: Set  #标志位Sequence: 24									Acknowledge: 23Virtual Router ID: 0 (Address-Family)		#入这条路由的路由器的IP地址Autonomous System: 100				#引入这条路由的路由器所在的自治系统.Internal Route(IPv4)  =   192.168.1.0/24Type: Internal Route(IPv4) (0x0102)  # 0x0103表示扩展路由Length: 28	NextHop: 0.0.0.0  		#路由的下一跳的IP地址.#Delay,Bandwidth,MTU,Hop Count,Reliability,Load:依次是总延时,最小带宽,MTU值,跳数,可信度,负载.Legacy MetricScaled Delay: 2560	#延迟Scaled BW: 25600	#带宽MTU: 1500			#MTUHop Count: 0   		#路由器跳数Reliability: 255	Load: 1Route Tag: 0Flags.... ...0 = Source Withdraw: False.... ..0. = Candidate Default: False.... .0.. = Route is Active: False     .... 0... = Route is Replicated: FalsePrefix Length: 24Destination: 192.168.1.0   

1.Hello:用于邻居发现、建立、保活。目标地址为224.0.0.10,Hello包在邻居收到后不需要确认。

  • 用于邻居的发现和维护 5s一次

  • 默认使用组播(224.0.0.10)发送(目标地址 ERIP的组播地址)

  • 发现、建立、维护邻居关系

  • 发送的时候使用接口主IP地址作为源,不会使用辅IP地址

  • K值全部255时也叫goodbye消息

  • 网络收敛后,只有hello包发送

2.Update:更新包,携带路由条目信息—目标网络号+度量值。通过组播发送Update数据包,邻居收到后必须回复确认消息。

  • 传递路由更新,仅包含需要的路由条目

  • 收到第一个Hello包,以单播传送全部路由;路由信息变化,以组播方式发送变化的路由信息

  • 当为指定(neighbor)的一台路由器发更新时使用Unicast(P-TO-P) ,当为多台路由器发更新时使用Multicast.(MA)----可靠包

3.Query:查询包,当路由信息丢失并没有备用路由时,使用Query数据包向邻居查询,邻居必须回复确认

  • 当找不到Feasible Successor时,发送查询报文(Multicast)----可靠包

  • 若A发现路由变化,先发Update,再发Query

4.Reply:应答包,是对邻居Query数据包的回复,也需要邻居回复确认。

  • 回应查询报文,单播。(Unicast)----可靠包//B收到Query后,会先发ACK,Reply

5.ACK:确认包,是对收到的数据包的确认,告诉邻居自己已经收到数据包了,收到Ack后,不需要再对Ack做回复,因为这是没有意义的,并且可能造成死循环

  • 用来确认Update/Query/Reply (Unicast),单播报文

6.SIA-QUERY:

  • 用于避免SIA超时导致邻居关系重置

7.SIA-REPLY:

  • 用于避免SIA超时导致邻居关系重置

使用单播传送的包:reply,ack,使用组播传送的包:Hello,Update和query (224.0.0.10),可靠包:Update,Query,Reply。

##hello消息的结构Opcode字段,报文类型:1 Update、 3 Query、 4 Reply、 5 Hello/ACKSequence字段: the 32-bit sequence number used by the RTPACK字段:如果此字段不为零的话,那么这个包就是ACK包而不是Hello包TLV:Type / Length / ValueTLV Types分为4个大类,如下:
''' TLV消息结构
ParametersType: Parameters (0x0001)Length: 12K1: 1K2: 0K3: 1K4: 0K5: 0K6: 0Hold Time: 15   默认3倍
'''
1.General TLV Types0x0001 EIGRP Parameters  EIGRP参数0x0003 Sequence		序列0x0004 Software Version		 软件版本0x0005 Next Multicast Sequence 	下一个组播序列2.IP-Specific TLV Types0x0102 IP Internal Routes		IP内部路由0x0103 IP External Routes		IP外部路由3.AppleTalk-Specific TLV Types0x0202 AppleTalk Internal Routes	AppleTalk内部路由0X0203 AppleTalk External Routes		AppleTalk外部路由0x0204 AppleTalk Cable Configuration	AppleTalk电缆配置4.IPX-Specific TLV Types0x0302 IPX Internal Routes		IPX内部路由0x0303 IPX External Routes 	IPX外部路由
hello消息 抓包报文
#普通hello消息
Cisco EIGRPVersion: 2Opcode: Hello (5)Checksum: 0xeecb [correct][Checksum Status: Good]Flags: 0x00000000Sequence: 0Acknowledge: 0			#有值时为 ack消息Virtual Router ID: 0 (Address-Family)Autonomous System: 1ParametersType: Parameters (0x0001)Length: 12K1: 1K2: 0K3: 1K4: 0K5: 0K6: 0Hold Time: 15Software Version: EIGRP=12.4, TLV=1.2Type: Software Version (0x0004)Length: 8EIGRP Release: 12.04EIGRP TLV version: 1.02#携带下一个组播序号的hello
Cisco EIGRPVersion: 2Opcode: Hello (5)Checksum: 0xc352 [correct][Checksum Status: Good]Flags: 0x00000000.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 0... = End Of Table: Not setSequence: 0Acknowledge: 0Virtual Router ID: 0 (Address-Family)Autonomous System: 100ParametersType: Parameters (0x0001)Length: 12K1: 1K2: 0K3: 1K4: 0K5: 0K6: 0Hold Time: 15Software Version: EIGRP=12.4, TLV=1.2Type: Software Version (0x0004)Length: 8EIGRP Release: 12.04EIGRP TLV version: 1.02SequenceType: Sequence (0x0003)Length: 9Address length: 4IP Address: 10.0.0.1Next multicast sequence: 25Type: Next multicast sequence (0x0005)Length: 8Multicast Sequence: 25
update消息 抓包报文
#会话建立 1 from 1 to 2
Cisco EIGRPVersion: 2Opcode: Update (1)Checksum: 0xfd82 [correct][Checksum Status: Good]Flags: 0x00000001, Init.... .... .... .... .... .... .... ...1 = Init: Set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 0... = End Of Table: Not setSequence: 23Acknowledge: 0Virtual Router ID: 0 (Address-Family)Autonomous System: 100
#会话建立 2 from 2 to 1
Cisco EIGRPVersion: 2Opcode: Update (1)Checksum: 0xfd6b [correct][Checksum Status: Good]Flags: 0x00000001, Init.... .... .... .... .... .... .... ...1 = Init: Set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 0... = End Of Table: Not setSequence: 23Acknowledge: 23Virtual Router ID: 0 (Address-Family)Autonomous System: 100#路由信息传递1  from 1 to 2
Cisco EIGRPVersion: 2Opcode: Update (1)Checksum: 0x24b9 [correct][Checksum Status: Good]Flags: 0x00000008, End Of Table.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 1... = End Of Table: SetSequence: 24Acknowledge: 23Virtual Router ID: 0 (Address-Family)Autonomous System: 100Internal Route(IPv4)  =   192.168.1.0/24Type: Internal Route(IPv4) (0x0102)Length: 28NextHop: 0.0.0.0Legacy MetricScaled Delay: 2560Scaled BW: 25600MTU: 1500Hop Count: 0Reliability: 255Load: 1Route Tag: 0Flags.... ...0 = Source Withdraw: False.... ..0. = Candidate Default: False.... .0.. = Route is Active: False.... 0... = Route is Replicated: FalsePrefix Length: 24Destination: 192.168.1.0#路由信息传递2  from 2 to 1
Cisco EIGRPVersion: 2Opcode: Update (1)Checksum: 0x7d9b [correct][Checksum Status: Good]Flags: 0x00000008, End Of Table.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 1... = End Of Table: SetSequence: 24Acknowledge: 24Virtual Router ID: 0 (Address-Family)Autonomous System: 100#更新后的路由信息传递 to 组播
Cisco EIGRPVersion: 2Opcode: Update (1)Checksum: 0xa2d8 [correct][Checksum Status: Good]Flags: 0x00000002, Conditional Receive.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..1. = Conditional Receive: Set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 0... = End Of Table: Not setSequence: 25Acknowledge: 0Virtual Router ID: 0 (Address-Family)Autonomous System: 100Internal Route(IPv4)  =   192.168.1.0/24Type: Internal Route(IPv4) (0x0102)Length: 28NextHop: 0.0.0.0Legacy MetricScaled Delay: 4294967295Scaled BW: 256000MTU: 1500Hop Count: 1Reliability: 255Load: 1Route Tag: 0Flags.... ...0 = Source Withdraw: False.... ..0. = Candidate Default: False.... .0.. = Route is Active: False.... 0... = Route is Replicated: FalsePrefix Length: 24Destination: 192.168.1.0#更新后的路由信息  from 2 to 1
Cisco EIGRPVersion: 2Opcode: Update (1)Checksum: 0xa2c2 [correct][Checksum Status: Good]Flags: 0x00000000.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 0... = End Of Table: Not setSequence: 25Acknowledge: 24Virtual Router ID: 0 (Address-Family)Autonomous System: 100Internal Route(IPv4)  =  #上一条一致
Query消息
Cisco EIGRPVersion: 2Opcode: Query (3)Checksum: 0xf9cc [correct][Checksum Status: Good]Flags: 0x00000000.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 0... = End Of Table: Not setSequence: 5Acknowledge: 0Virtual Router ID: 0 (Address-Family)Autonomous System: 1Internal Route(IPv4)  =   1.1.1.0/24Type: Internal Route(IPv4) (0x0102)Length: 28NextHop: 0.0.0.0Legacy MetricScaled Delay: 4294967295Scaled BW: 0MTU: 1514Hop Count: 0Reliability: 0Load: 0Route Tag: 0Flags.... ...0 = Source Withdraw: False.... ..0. = Candidate Default: False.... .1.. = Route is Active: True            #查询消息.... 0... = Route is Replicated: FalsePrefix Length: 24Destination: 1.1.1.0
reply
Cisco EIGRPVersion: 2Opcode: Reply (4)Checksum: 0xf9c4 [correct][Checksum Status: Good]Flags: 0x00000000.... .... .... .... .... .... .... ...0 = Init: Not set.... .... .... .... .... .... .... ..0. = Conditional Receive: Not set.... .... .... .... .... .... .... .0.. = Restart: Not set.... .... .... .... .... .... .... 0... = End Of Table: Not setSequence: 11Acknowledge: 5Virtual Router ID: 0 (Address-Family)Autonomous System: 1Internal Route(IPv4)  =   1.1.1.0/24
  • 大概流程:发送hello消息后,建好邻居表,使用update LSA/LSP LSDB链路状态数据库(可以形成拓扑表)

  • 网络结构:Layer 2 |IPV4|EIGRP|FCS protocol| 88 该消息是 先有控制层面,再有数据层面数据。

  • EIGRP使用混合度量值进行计算路径的好坏,主要包含5个方面

    • 带宽:bd

    • 延迟:delay

    • 负载:load

    • 可靠性:reliability

    • 最大传输单元:MTU(基本不做计算)

  • eigrp进行路劲好坏计算时用的两个参数:AD、FD(表示不同的代价,代价由上面的五个参数结合k值(下文)权重计算)。A路由器要到达C路由,需要经过B路由或者D路由,AD是B到C的代价,FD则是A通过计算A到B的代价加上AD 得到新的A由B到C的代价FD1 ,或者A由D到C的代价FD2,并使用 min(FD1,FD2)得到最优的路径,次路径为备份路径。

    AD和FD的计算方法

  • 建立邻居的必要条件

    • 收到hello ack

    • 匹配AS:EIGRP两台路由器需要建立令居需要AS号相同。

      • 相同的度量值(K值)

        • 路径度量值权重 (0-255)

          k1 1 带宽 的权重

          k2 0 负载 的权重

          k3 1 延迟 的权重

          k4 0 可靠性 的权重

          k5 0 最大传输单元 的权重

    • 其他条件:认证通过。

报文交换&建立过程

一旦收到任何符合条件(AS相同,度量值权重K相同)邻居的hello报文,则将发送者设置为邻居,并向对方单播发送update报文,该报文不携带路由信息,其中 flag init位置位。

  • step1:10.0.0.2 向224.0.0.10 进行组播

    image-20231109134207439

  • step2: 10.0.0.1收到hello消息后,回复给10.0.0.2 单播 update信息,修改init标志位,产生随机序列号。

    image-20231109134459297

  • setp4: 10.0.0.2 收到来自10.0.0.1的update消息后,向10.0.0.1发送update消息,并确认序列号,实现握手。

    image-20231109134904739

  • step5:10.0.0.1 收到update消息,知道10.0.0.2也是init了,开始向10.0.0.2传播数据。并设置end标志位,表示10.0.0.1的路由信息已传完。

    image-20231109135313636

    路由参数

# 10.0.0.1 的一条路由信息。
Internal Route(IPv4)  =   192.168.1.0/24 Type: Internal Route(IPv4) (0x0102) #内部路由Length: 28							#NextHop: 0.0.0.0					#下一跳,0.0.0.0表示自己Legacy Metric						#度量值Scaled Delay: 25600				#延迟Scaled BW: 256000				#带宽MTU: 1500						#MTUHop Count: 0					#跳数Reliability: 255				#可靠性Load: 1							#负载Route Tag: 0					#路由标记Flags.... ...0 = Source Withdraw: False.... ..0. = Candidate Default: False.... .0.. = Route is Active: False.... 0... = Route is Replicated: FalsePrefix Length: 30Destination: 10.0.0.4				#目的地址
  • step6:10.0.0.2 收到update消息,获取到10.0.0.1的路由信息,同时向10.0.0.1传播本机的路由数据。并设置end标志位,表示10.0.0.2的路由信息已传完。下面的路由是10.0.0.2的。

    image-20231109140045257

  • step7: 10.0.0.1收到后,向10.0.0.2 发送确认消息 确认号为ack 24

    image-20231109140255181

    image-20231109143021120

  • 下面为公告自己的最新路由信息

  • step8:在更新完自身的最佳路由后,10.0.0.2 又发hello消息,但是携带的参数更多。包括 序列携带下一个组播序列号,接着马上发送更新后的路由信息。该信息中Sequence中的路由器不会被设置为CR,但是其他都会被设置为CR,方便2发送新的CR消息通知其他被设置为CR的路由

    image-20231109144136472

  • step9: 10.0.0.2 向组播地址以及 sequence中的路由器 发送update消息 传递参数,携带更新的路由信息(即只发送已更改的、新增或删除的路由信息,而不是发送整个路由表)。发送CR消息,该消息10.0.0.1不会被接受,其他都会被接受

    image-20231109145403223

  • step10: 10.0.0.2 向step8中的 sequence中的路由器 发送update消息 告知最近的路由信息。

    image-20231109161407087

  • step11 : 10.0.0.1 收到update消息后对10.0.0.2进行确认回复。

    image-20231109161540454

  • step12 : 10.0.0.1 向组播地址 发送update消息 传递参数,携带更新的路由信息(即只发送已更改的、新增或删除的路由信息,而不是发送整个路由表)。

    image-20231109161857338

  • step13 : 10.0.0.2 向10.0.0.1 回复确认。

    image-20231109162302976

  • 更新的路由分析

    这里发布的信息是更新的信息,表示路由1 更新了3条路由信息,以跳数为例子(当中涉及其他的权重计算)

    image-20231110093632022

  • 最终的路由信息,综合更新的路由一起。

    image-20231110094139676

  • 大致的拓扑结构

    image-20231110100058969

两个节点未知

image-20231110100112443

结构突变

(1)新增网段:直连新增网段的设备,使用更新包 update消息告知所有邻居即可

(2)断开网段:直连断开网段的设备,发出查询包Query消息,通过DUAL,收集应答包来重新收敛;完成全网同步。

(3)设备无法沟通:hello time 5s hold time 15s 。hold time (采取的是倒计时方式)计时器结束断开邻居关系,同时产生删除所有从邻居出学习到的信息

断开网段
Cisco EIGRPOpcode: Query (3)Internal Route(IPv4)  =   1.1.1.0/24Type: Internal Route(IPv4) (0x0102)Length: 28NextHop: 0.0.0.0Legacy MetricScaled Delay: 4294967295Scaled BW: 0MTU: 1514Hop Count: 0Reliability: 0Load: 0Route Tag: 0Flags# False,即源撤回标志位未设置。该标志位通常与路由划分和路由更新相关,用于指示是否有源节点撤回了路由信息。.... ...0 = Source Withdraw: False	#即候选默认路由标志位未设置。候选默认路由用于在没有更具体的路由匹配时,作为默认路径来转发数据包。.... ..0. = Candidate Default: False.... .1.. = Route is Active: True  #该路由是活动的,被选定为转发数据流量的路径。.... 0... = Route is Replicated: False#False,即路由未进行复制。这表示该路由未被复制到其他设备上。Prefix Length: 24Destination: 1.1.1.0

image-20231110122452105

参考文献

参考文献:
https://zhuanlan.zhihu.com/p/393295263
https://blog.csdn.net/Sisyphuss/article/details/132633851
https://www.cisco.com/c/en/us/support/docs/ip/enhanced-interior-gateway-routing-protocol-eigrp/16406-eigrp-toc.html

eigrp关键参数

1 AS号、系数K值是否与自己的一致。如果一致,则建立邻居关系,得到一个自治域的路由器列表。同时监听路由器的hello消息,如果超时,可能该路由已经下线。 编程:将K和AS作为 自治域的 key

Cisco EIGRPVersion: 2Opcode: Hello (5)			#确定消息类型  #Opcode字段,报文类型:1 Update、 3 Query、 4 Reply、 5 Hello/ACKChecksum: 0xee68 [correct][Checksum Status: Good]  Flags: 0x00000000						#确定update消息类型的关键参数  为1 表示 握手,0x00000008表示交换路由信息Sequence: 0 Acknowledge: 0  Virtual Router ID: 0 (Address-Family)Autonomous System: 100                   #确定自治域的关键参数  *******************ParametersType: Parameters (0x0001)Length: 12K1: 1								# #关键参数K2: 0								# #关键参数K3: 1								 #关键参数K4: 0								 #关键参数K5: 0								 #关键参数K6: 0								#关键参数Hold Time: 15Software Version: EIGRP=12.4, TLV=1.2Type: Software Version (0x0004)Length: 8EIGRP Release: 12.04EIGRP TLV version: 1.02

2 使用update消息,获取路由信息,根据路由信息 统计路由表

# 1 路由A和B 相互发送该报文 但是IPV4参数不一样 flag为8    携带源ip和目的ip 根据源ip确定该路由的路由变化
Cisco EIGRPVersion: 2Opcode: Update (1)  Checksum: 0x24b9 [correct][Checksum Status: Good]Flags: 0x00000008, End Of Table   #关键参数 确保这是个报文交换消息Sequence: 24Acknowledge: 23Virtual Router ID: 0 (Address-Family)Autonomous System: 100Internal Route(IPv4)  =   192.168.1.0/24  #关键参数,Internal Route(IPv4)  =   10.0.0.4/30Internal Route(IPv4)  =   192.168.3.0/24Internal Route(IPv4)  =   10.0.0.12/30Internal Route(IPv4)  =   192.168.4.0/24Internal Route(IPv4)  =   10.0.0.8/30Internal Route(IPv4)  =   192.168.2.0/24
#2 AB收到路由信息后,双发 发出更新的路由信息 此时flag为0  携带源ip和目的ip  根据源ip确定该路由的路由变化
Cisco EIGRPVersion: 2Opcode: Update (1)Checksum: 0x9dd9 [correct][Checksum Status: Good]Flags: 0x00000000Sequence: 25Acknowledge: 0Virtual Router ID: 0 (Address-Family)Autonomous System: 100Internal Route(IPv4)  =   192.168.2.0/24Internal Route(IPv4)  =   10.0.0.8/30Internal Route(IPv4)  =   192.168.4.0/24

eigrp拓扑图

  • 1 获取自治域。

  • 2 获取路由器信息

    根据EIGRP.flag==8判断是否是交换路由消息;根据EIGRP.flag==0判断是否是更新消息。得到两个的报文信息。

  • 3 获取路由器的路由表信息

  • 4 获取具体的网口信息

    image-20231113101558606

处理代码-python

class As_system:"""自治与"""def __init__(self, key, as_num, routers):self.key = keyself.as_num = as_numself.routers = routersclass Router:def __init__(self, ASNum, router_id, addr_mac, super_mac, ip):self.ASNum = ASNum  # 路由域self.router_id = router_id  # idself.addr_mac = addr_mac  # 路由器macself.super_mac = super_mac  # 上级路由器self.ip = ipself.port = 0self.neigbhor = []  # 邻居表self.router_info_raw = []  # 路由信息self.router_info_other = []  # 路由信息self.router_info_new = []  # 路由信息self.key = hash(addr_mac)class Internal:def __init__(self):self.rouType = 0self.nextHop = 0self.metric = 0self.dst = 0class Node:def __init__(self, name):self.name = nameself.edges = []def add_edge(self, node, weight=1):self.edges.append((node, weight))class Graph:def __init__(self):self.nodes = {}def add_node(self, node):self.nodes[node.name] = nodedef add_edge(self, node1, node2, weight=1):if node1.name in self.nodes and node2.name in self.nodes:self.nodes[node1.name].add_edge(node2, weight)self.nodes[node2.name].add_edge(node1, weight)else:raise ValueError("Both nodes must be added to the graph before adding an edge.")def creat_router(packet):""""前置条件,hello消息,为组播"""global router_idglobal router_dictglobal router_ip_dictcomm = packet["comm"][0]eigrp = packet["eigrp"]asnum = eigrp["ASNum"]# k=eigrp["k"]  #获取到keyk = "01001"  # 获取到keyas_key = hash((asnum, k))classic = []if eigrp["flag"] == 8 and eigrp["opCode"] == 1:classic = eigrp["classic"]router_ip_dict[comm["srcMac"]] = classicif as_key in router_dict:as_system = router_dict[as_key]routers = as_system["routers"]  #routers_mac = as_system["routers_mac"]  #if comm["srcMac"] in routers_mac:router = routers[comm["srcMac"]]if len(classic) > 0:router.router_info_raw = classicelse:router_id += 1router = Router(asnum, router_id, comm["srcMac"], comm["dstMac"], comm["srcAddr"])router.router_info_raw = classicrouters[comm["srcMac"]] = routerrouters_mac.append(comm["srcMac"])else:router_id += 1router_dict[as_key] = {"key": as_key,"as_num": asnum,"routers": {},"routers_mac": [comm["srcMac"]]}routers = router_dict[as_key]["routers"]router = Router(asnum, router_id, comm["srcMac"], comm["dstMac"], comm["srcAddr"])router.router_info_raw = classicrouters[comm["srcMac"]] = routerglobals()["router_id"] = 0
globals()["router_dict"] = {}
globals()["router_ip_dict"] = {}import json# 指定本地 JSON 文件路径
file_path = "data/0EC0A8582C0C1C4F_192.168.88.44_1.json"
# file_path = "data/data.json"
with open(file_path, "r", encoding="gbk", errors="ignore") as file:lines = file.readlines()
data_list = []
for line in lines:data = json.loads(line)data_list.append(data)
for item in data_list:creat_router(item)  # 创建路由集合print("end")

相关文章:

wireshark抓包并进行Eigrp网络协议分析

路由协议 Eigrp ​ EIGRP:Enhanced Interior Gateway Routing Protocol 即 增强内部网关路由协议。也翻译为 加强型内部网关路由协议。 EIGRP是Cisco公司的私有协议(2013年已经公有化)。 EIGRP结合了链路状态和距离矢量型路由选择协议的Cisco专用协议&a…...

力扣刷题-二叉树-二叉树的层序遍历(相关题目总结)

思路 层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。 需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的…...

fundamental notes in 3D math

平面方程 a x b y c z d axbycz d axbyczd, 法向量 a , b , c a,b,c a,b,c, 点到平面的距离为 d / s q r t ( a 2 b 2 c 2 ) d / sqrt(a^2 b^2 c^2) d/sqrt(a2b2c2) , 距离可为正, 为负, 为正表示跟法向量方向一致, 为负表示相反 点 ( x o , y o , z o ) (x_o, y_o, z…...

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上,属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery,这位前端开发的巫师,通过简洁而强大的语法,为我们提供了便捷的属性操作工具。在这篇博客中,我们将深入研究JQuery DOM操作中的属性操作&…...

腾讯云5年云服务器还有吗?腾讯云5年时长服务器入口在哪?

如果你是一名企业家或者是一个热衷于数字化转型的创业者,那么腾讯云最近推出的一项优惠活动绝对不会让你无动于衷。现在,腾讯云正在大力推广一项5年特价云服务器活动,只需要花费3879元,你就可以享受到腾讯云提供的优质服务。 腾讯…...

odoo在iot领域的发展情况

Odoo 是一个全面的集成商业管理软件套装,主要提供企业资源规划 (ERP)、客户关系管理 (CRM)、电子商务、会计、库存管理等功能。在 IoT(物联网)领域,Odoo 侧重于通过提供一个中心化的平台来整合多方面的业务流程,包括生…...

Paas-云原生-容器-编排-持续部署

了解云原生 云原生架构让企业的基础设施,从简单的资源池化,转向以应用为中心,为应用赋能的敏捷、自运维、安全的云原生基础设施。以应用为中心的云原生基础设置,可以支持多种类型的应用,如微服务应用,中间件应用和AI 应用;可以提升应用交付效率,简化应用管理的复杂度;…...

sass 生成辅助色

背景 一个按钮往往有 4 个状态。 默认状态hover鼠标按下禁用状态 为了表示这 4 个状态&#xff0c;需要设置 4 个颜色来提示用户。 按钮类型一般有 5 个&#xff1a; 以 primary 类型按钮为例&#xff0c;设置它不同状态下的颜色&#xff1a; <button class"btn…...

DevEco Studio开发工具下载、安装(HarmonyOS开发)_For Mac

一、说明 初学HarmonyOS开发&#xff0c;DevEco Studio开发工具的安装和使用是必须的。 &#xff08;注&#xff1a;不多废话&#xff0c;跟着下面流程操作下载、安装DevEco Studio即可。&#xff09; 二、下载DevEco Studio 1.官网下载地址&#xff1a; https://developer.…...

按键精灵中的字符串常用的场景

在使用按键精灵编写脚本时&#xff0c;与字符串有关的场景有以下几种&#xff1a; 1. 用时间字符串记录脚本使用截止使用时间 Dim localTime "2023-11-12 00:15:14" Dim networkTime GetNetworkTime() TracePrint networkTime If networkTime > localTime The…...

python数据结构与算法-01_抽象数据类型和面向对象编程

Python 一切皆对象 举个例子&#xff0c;在 python 中我们经常使用的 list l list() # 实例化一个 list 对象 l l.append(1) # 调用 l 的 append 方法 l.append(2) l.remove(1) print(len(l)) # 调用对象的 __len__ 方法在后面实现新的数据类型时&#xff0c;我们将…...

纯手写 模态框、消息弹框、呼吸灯

在有些做某些网页中&#xff0c;应用不想引用一些前端框架&#xff0c;对于一些比较常用的插件可以纯手写实现 1、模态框 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Water Ripple Effect</title> <style…...

windows安装composer并更换国内镜像

第一步、官网下载 下载地址 Composer安装https://getcomposer.org/Composer-Setup.exe第二步、双击安装即可 第三步选择 php安装路径并配置path 第四步、 composer -v查看安装是否成功&#xff0c;出现成功界面 第五步、查看镜像地址并更换&#xff08;composer国内可能较慢…...

c++ basic_string 和string区别

在C中&#xff0c;basic_string 是一个模板类&#xff0c;而 string 是 basic_string 的一个具体实例化&#xff0c;即 basic_string<char>。basic_string 模板类被设计为支持多种字符类型&#xff0c;而 string 是其中一种特定字符类型的字符串类。 具体来说&#xff0…...

怎么在uni-app中使用Vuex 简单demo,通俗易懂(第二篇)

Vuex是Vue.js的官方状态管理库&#xff0c;可以帮助我们更好地管理和维护复杂状态和数据共享。在Vuex中&#xff0c;整个应用的状态被集中到一个单一的状态树中&#xff0c;这个状态树包含了所有的共享状态和数据。通过状态管理模块、getter、mutation、action等机制&#xff0…...

相机专业模型详解,各个参数作用,专业模式英文全称和缩写

ISO&#xff08;感光度&#xff09; 全称&#xff1a; International Organization for Standardization缩写&#xff1a; ISO Shutter Speed&#xff08;快门速度&#xff09; 全称&#xff1a; Shutter Speed缩写&#xff1a; SS Aperture&#xff08;光圈大小&#xff09; 全…...

将随机数设成3407,让你的深度学习模型再涨一个点!文再附3种随机数设定方法

随机数重要性 深度学习已经在计算机视觉领域取得了巨大的成功&#xff0c;但我们是否曾想过为什么同样的模型在不同的训练过程中会有不同的表现&#xff1f;为什么使用同样的代码&#xff0c;就是和别人得到的结果不一样&#xff1f;怎么样才能保证自己每次跑同一个实验得到的…...

Spring后端HttpClient实现微信小程序登录

这是微信官方提供的时序图。我们需要关注的是前后端的交互&#xff0c;以及服务端如何收发网络请求。 小程序端 封装基本网络请求 我们先封装一个基本的网络请求。 const baseUrl"localhost:8080" export default{sendRequsetAsync } /* e url&#xff1a;目标页…...

Linux下部署MySQL-MHA环境

目前的环境如下&#xff1a;centos7 有四台虚拟机&#xff0c;20&#xff0c;21&#xff0c;22&#xff0c;23 20为master&#xff0c;21&#xff0c;22&#xff0c;23 为20的从库&#xff0c;21 为管理节点。 搭建MySQL主从复制的&#xff0c;可以参考我之前的文章 MHA&#…...

DaoWiki(基于Django)开发笔记 20231114-阿里云mysql外部访问

文章目录 创建mysql用户&#xff0c;用户远程访问配置阿里云安全策略下载安装mysql workbench 创建mysql用户&#xff0c;用户远程访问 创建用户 CREATE USER dao_wiki% IDENTIFIED BY password;授权访问dao_wiki数据库 GRANT ALL PRIVILEGES ON dao_wiki.* TO dao_wiki%; F…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...