OSPF协议解析及相关技术探索(C/C++代码实现)

news2024/11/17 13:58:02

OSPF(开放最短路径优先)是一种用于自治系统(AS)内部的路由协议,它是基于链路状态算法的。OSPF的设计目的是为了提供一种可扩展、快速收敛和高效的路由解决方案。

OSPF概念和特点

  • 概念
自治系统(AS):一个AS是由一组通过统一路由策略或协议互相交换路由信息的路由器组成的网络。
 
链路状态:OSPF通过链路状态数据库(LSDB)来维护网络的拓扑结构。每个路由器会记录它与网络中其他路由器的连接状态,包括接口、成本和其他参数。
 
路由器ID(Router ID):每个OSPF路由器需要有一个唯一的32位标识符,用于在LSDB中表示自己。路由器ID通常配置为路由器的某个接口的IP地址。

OSPF区域:为了提高可扩展性和减少LSDB的大小,OSPF将网络划分为多个区域。每个区域有一个唯一的区域ID,并且只包含该区域内的链路状态信息。
 
链路状态通告(LSA):路由器通过发送LSA来通知其他路由器它所知道的链路状态变化。

洪泛(Flooding):OSPF使用洪泛机制来确保LSA能够被传递给网络中的所有路由器。

数据库描述(DBD):路由器之间通过DBD包来交换LSDB的概要信息。

选举:在OSPF网络中,会选举出区域内的主路由器(DR)和备份路由器(BDR),以及每个接口的指定路由器(DR)和备份指定路由器(BDR)。

  • 特点
无环路设计:OSPF通过SPF算法确保没有环路发生,从而避免路由循环。

快速收敛:OSPF在网络拓扑发生变化时能够快速地重新计算路由,收敛速度比距离矢量协议快。

支持CIDR:OSPF支持无类域内路由(CIDR),能够处理大量子网和聚合路由。

支持VLSM:OSPF支持可变长子网掩码(VLSM),允许在同一网络中使用不同长度的子网掩码。

组播通信:OSPF使用组播地址224.0.0.5(所有OSPF路由器)和224.0.0.6(OSPF DR和BDR)来进行路由器之间的通信。

安全性:OSPF提供了一系列安全特性,如接口认证和Hello包的序列号验证,以防止未授权的访问和路由信息的伪造。

灵活的网络结构:OSPF能够适应多种网络结构,包括点到点、广播、非广播和点到多点网络。

扩展性:OSPF通过区域的概念来提高可扩展性,使得大型网络能够更加高效地运行。

OSPF的这些概念和特点使其成为互联网和私有网络中广泛使用的一种内部网关协议。

OSPF工作过程的简要概述

OSPF(开放最短路径优先)协议的工作过程是一个复杂的过程,涉及多个步骤和机制。以下是OSPF工作过程的简要概述:
1.启动和配置:

  • 路由器启动并配置OSPF协议。
  • 每个路由器分配一个唯一的32位路由器ID。
  • 路由器根据其接口的IP地址和子网掩码确定其OSPF区域。

2.邻居发现和建立:

  • 路由器通过发送Hello包来发现其他OSPF路由器。
  • Hello包中包含路由器ID、接口IP地址、子网掩码、区域ID等信息。
  • 路由器根据收到的Hello包中的信息,与对端路由器建立邻居关系。

3.建立邻接关系:

  • 邻居关系建立后,路由器之间会建立邻接关系。
  • 邻接路由器之间交换DBD(数据库描述)包,以了解对方LSDB(链路状态数据库)的概要信息。

4.交换链路状态信息:

  • 路由器通过发送LSR(链路状态请求)包来请求特定的LSA(链路状态通告)信息。
  • 收到LSR包的邻居路由器会回应LSU(链路状态更新)包,携带请求的LSA信息。
  • 路由器接收到LSU包后,会更新自己的LSDB。

5.维护LSDB:

  • 路由器定期发送Hello包来维护邻居关系。
  • Hello包中包含LSA的序列号,用于检测LSA是否发生变化。
  • 如果检测到LSA发生变化,路由器会请求更新的LSA。

6.计算最短路径:

  • 路由器使用SPF(最短路径优先)算法,根据LSDB中的信息计算到达所有其他路由器的最短路径。
  • SPF算法会为每个目的地生成一个最短路径树。

7.更新路由表:

  • 根据SPF算法计算出的最短路径,路由器更新其路由表。
  • 路由表中包含目的地的IP地址、下一跳路由器的路由器ID和路径成本。

8.路由表维护和更新:

  • 路由器持续监控网络拓扑的变化。
  • 当网络拓扑发生变化时,路由器会重新计算最短路径,并更新路由表。

9.状态监控和故障处理:

  • 路由器通过发送Hello包来监控邻居状态。
  • 如果邻居路由器失效,路由器会进入Down状态,并重新建立邻居关系。

OSPF协议的工作过程确保了网络的路由信息能够及时更新,并快速响应网络拓扑的变化。这种协议的设计使得OSPF能够高效地支持大型和复杂的数据中心网络。

OSPF的网络类型有哪些

OSPF(开放最短路径优先)协议支持多种网络类型,以适应不同的网络环境和需求。以下是OSPF的主要网络类型:
1.点对点(Point-to-Point, P2P):

  • 点到点网络是指在一个链路上仅连接两台设备的网络。
  • 在点到点网络中,不需要进行DR(设计路由器)和BDR(备份设计路由器)的选举。
  • 点到点网络通常用于连接两个远程路由器,如通过PPP或HDLC连接的设备。

2.广播(Broadcast):

  • 广播网络是指支持广播功能的网络,如以太网。
  • 在广播网络中,需要进行DR和BDR的选举,以便控制路由器之间的链路状态信息的传播。
  • 广播网络中的所有路由器都会监听224.0.0.5这个组播地址,用于发送和接收OSPF报文。

3.非广播多路访问(Non-Broadcast, NBMA):

  • NBMA网络是指不支持广播的 多路访问网络,如帧中继、ATM等。

  • 在NBMA网络中,路由器无法通过发送Hello包来发现邻居,因此需要手动配置邻居关系。

  • NBMA网络中使用单播方式发送协议报文。

4.点到多点(Point-to-Multipoint, P2MP):

  • 点到多点网络是指一个接口通过点到多点的网络与多台路由器相连。

  • 点到多点网络没有专门的DR和BDR选举机制。

  • 这种网络类型通常用于连接多个客户端的路由器,如通过光纤通道或无线连接。

5.多路访问点到多点(Multipoint-to-Multipoint, MP2MP):

  • 多路访问点到多点网络是指多个路由器通过点到多点的连接相互连接。

  • 这种网络类型没有DR和BDR的选举,所有路由器都是平等的。

  • MP2MP网络通常用于大型网络,如通过卫星连接的多个分支机构。

6.环路back(Loopback):

  • 环路back网络是指路由器的一个环路接口,通常用于路由器的管理目的。
  • 环路back接口的网络类型默认就是环路back,且不能修改。

7.虚拟链路(Virtual Link):

  • 虚拟链路是一种特殊的网络类型,用于在非直接连接的OSPF区域之间建立逻辑连接。

  • 它允许跨区域的路由,使得不同区域之间的路由器仿佛直接相连。

8.点对多点非广播(Point-to-Multipoint Non-Broadcast, P2MP-NBMA):

  • P2MP-NBMA网络是一种特殊的点到多点网络,它在NBMA网络上实现了点到多点的功能。

  • 这种网络类型需要手动指定邻居,并使用单播方式发送协议报文。

每种网络类型都有其特定的应用场景和配置要求,OSPF通过这些网络类型的支持,能够适应各种不同的网络架构和需求。

OSPF报头格式

OSPF(开放最短路径优先)协议使用IP协议报文来传输其协议数据,这些数据被封装在不同的OSPF报文类型中。OSPF报文直接封装在IP协议数据包中,IP协议号为89。OSPF报文头部格式对所有报文类型都是相同的,但每种报文类型携带的数据内容不同。以下是OSPF报文头部的详细格式:

在这里插入图片描述

  • Version(版本):

占1个字节,指出所采用的OSPF协议版本号。目前最高版本为OSPF v4。

  • Type(类型):

占1个字节,标识对应报文的类型。OSPF有5种报文类型:Hello报文、DD(数据库描述)报文、LSR(链路状态请求)报文、LSU(链路状态更新)报文和LSAck(链路状态应答)报文。

  • Code(代码):

占1个字节,用于进一步区分报文类型。例如,在Hello报文中,Code字段用于指示Hello报文是用于邻居发现、确认邻居关系还是用于发送路由器ID。

  • Packet Length(包长度):

占2个字节。它是指整个报文(包括OSPF报头和后面各报文内容部分)的字节长度。

  • Router ID(路由器ID):

占4个字节,指定发送报文的源路由器ID。

  • Area ID(区域ID):

占4个字节,指定发送报文的路由器所对应的OSPF区域号。

  • Checksum(校验和):

占2个字节,是对整个报文(包括OSPF报头和各报文具体内容,但不包括认证字段)的校验和。用于确保报文在传输过程中的完整性。

  • AuType(验证类型):

占2个字节,表示OSPF验证类型。0表示不验证,1表示简单认证,2表示MD5认证。

  • Authentication(认证信息):

根据验证类型而定。验证类型为0时未定义,验证类型为1时该字段是密码信息,类型为2时该字段包括Key ID、MD5验证数据长度和序列号的信息。MD5验证数据添加在OSPF报文后面,不包含在Authentication字段中。

除了头部信息,不同类型的OSPF报文还包含特定的数据字段。例如,Hello报文包含用于邻居发现和维护邻居关系的信息,如Hello间隔、Dead间隔等;DD报文用于在邻居之间同步数据库摘要信息;LSR报文用于请求特定类型的LSA;LSU报文用于发送完整的LSA信息;LSAck报文用于对收到的LSA进行确认。

OSPF报文的详细格式和内容可以参考OSPF协议的官方文档或相关技术标准。

OSPF协议中常用的一些数据包类型

1.Hello包(Hello Packet):

  • 用于在路由器之间发现邻居并维护邻居关系。
  • 包含路由器ID、网络掩码、Hello间隔、Dead间隔等信息。
  • 通过周期性地发送Hello包,路由器可以检测邻居的状态。

2.数据库描述包(Database Description Packet,DBD):

  • 用于在邻居之间同步数据库的概要信息。

  • 包含本地OSPF数据库中LSA的类型、ID和序列号。

  • DBD包是初始同步过程的一部分,用于确定需要交换哪些具体的LSA。

3.链路状态请求包(Link State Request Packet,LSR):

  • 用于请求对端邻居的特定LSA。

  • 当一个路由器需要了解它尚未收到的LSA时,它会发送LSR包。

  • LSR包包含请求的LSA的ID和广告路由器的信息。

4.链路状态更新包(Link State Update Packet,LSU):

  • 用于携带完整的LSA信息。

  • 当路由器收到新的LSA或者当LSA的内容发生变化时,它会发送LSU包。

  • LSU包中包含LSA的具体信息,如链路成本、出口接口等。

5.链路状态确认包(Link State Acknowledgment Packet,LSACK):

  • 用于确认收到的LSU包。

  • LSACK包包含一个或多个LSA的序列号,表示确认这些LSA已经正确接收。

  • 这有助于确保LSA的可靠传输。

除了上述五种主要类型的包,OSPF还定义了其他一些数据包类型,例如:

  • Hello包的扩展(Hello Packet Extensions):

提供比基本Hello包更多的信息,如路由器的优先级、DR和BDR的选举状态等。

  • Link State Packet(LSP):

在某些情况下,LSU包可能被LSP替代,LSP包含一个或多个LSA的集合。

  • Graceful Restart Packets:

用于在路由器重启过程中维护网络的连通性。

OSPF中LSA的一些基本概念

在OSPF(开放最短路径优先)协议中,链路状态通告(Link State Advertisement,LSA)是核心概念之一。LSAs是OSPF路由器用来描述其连接链路状态的数据包,它们包含了路由器接口的详细信息,如接口类型、成本、邻居路由器等。LSAs是OSPF构建链路状态数据库(LSDB)的基础,从而使得OSPF能够计算出网络中的最短路径。
以下是OSPF中LSA的一些基本概念:
1.LSA类型:

  • 类型1 LSA(路由器LSA):由每个OSPF路由器生成,描述了路由器上的所有接口及其成本。
  • 类型2 LSA(网络LSA):由设计路由器(DR)生成,描述了多路访问网络(如以太网)的拓扑结构。
  • 类型3 LSA(汇总网络LSA):由区域边界路由器(ABR)生成,用于在多个区域之间汇总网络信息。
  • 类型4 LSA(ASBR汇总LSA):由ABR生成,描述了到达AS边界路由器(ASBR)的路径。
  • 类型5 LSA(外部LSA):由ASBR生成,描述了到达外部网络的路由信息。

2.LSA的传播:

  • LSA在生成后,首先被发送到本区域的所有邻居路由器。
  • 然后,通过OSPF的扩散算法(Explicit Data Distribution),LSA会在整个OSPF域内传播。

3.LSA的寿命:

  • 每个LSA都有一个寿命,随着时间的推移会不断增加。
  • 当LSA的寿命达到一定值时,它会被标记为不活动,并停止传播。
  • 路由器会根据收到的LSA的寿命来更新自己的LSDB。

4.LSA的同步:

  • 当路由器加入OSPF网络时,它会通过交换Hello包来发现邻居。
  • 随后,路由器会请求missing的LSA,并通过DBD和LSR包来同步LSDB。

5.LSA的可靠性:

  • OSPF通过LSA的校验和来确保数据的完整性。
  • 收到LSA的路由器会验证校验和,如果不符合,则丢弃该LSA。

6.LSA的更新:

  • 当网络拓扑发生变化时,相关路由器会生成新的LSA或更新现有LSA。
  • 这些更新会通过LSU包快速传播到整个网络。

LSA是OSPF协议能够高效计算路由的关键,因为它们提供了网络拓扑的详细信息,使得OSPF可以采用Dijkstra算法来计算最短路径树。每种类型的LSA都有其特定的用途和格式,确保了OSPF网络的可靠性和灵活性。

OSPF路径选择的基本过程

路径选择是基于路由器之间的链路状态信息来确定的。OSPF使用最短路径优先(SPF)算法,该算法由Dijkstra提出,用于在复杂的网络中选择数据包传输的最短路径。以下是OSPF路径选择的基本过程:
1.收集链路状态信息:

  • 每个OSPF路由器通过发送Hello包来发现邻居。
  • 路由器通过Hello包交换来确定邻居的状态和它们之间的链路成本。
  • 路由器还会通过数据库描述(DBD)包来同步邻居的链路状态数据库(LSDB)的概要信息。

2.构建链路状态通告(LSA):

  • 每个路由器根据其接口的状态生成LSAs。
  • LSA包含有关接口的详细信息,如接口类型、成本、邻居路由器等。
  • LSAs通过链路状态更新(LSU)包在OSPF域内传播。

3.交换链路状态信息:

  • 路由器通过交换LSU包来更新它们之间的链路状态信息。

  • 这确保了所有路由器都有一个最新的网络拓扑视图。

4.运行最短路径优先(SPF)算法:

  • 每个路由器使用SPF算法计算到达网络中每个目的地的最短路径。
  • SPF算法考虑了所有可用的路径,并选择成本最低的路径作为最佳路径。
  • 算法使用一个称为最短路径树(SPT)的数据结构来表示网络拓扑和最短路径。

5.维护和更新路径:

  • 当网络拓扑发生变化时(如链路故障、路由器故障等),相关路由器会重新生成或更新LSAs。
  • 这些更新通过LSU包传播,并触发OSPF路由器重新运行SPF算法,以计算新的最短路径。

6.路径选择依据:

  • 路径选择主要依据是路径的成本,这通常与接口的带宽和延迟相关。
  • 除了成本,OSPF还考虑了其他因素,如路径的可靠性、快速收敛等。

7.类型1的外部路由和类型2的外部路由:

  • 类型1的外部路由包括到达外部网络的路由信息,以及到达该外部网络的OSPF域内的下一跳路由器。
  • 类型2的外部路由仅包括到达外部网络的路由信息,不包含OSPF域内的下一跳信息。

OSPF的路径选择过程确保了网络数据的传输遵循最短路径,从而优化了网络性能,降低了延迟。此外,OSPF的快速收敛特性使得网络在发生变化时能够迅速适应,保证网络的稳定性和可靠性

OSPF协议解析及相关技术探索(C/C++代码实现)

...
typedef struct ospf2_header{

    u_int8_t  version;
    u_int8_t  type;
    u_int16_t length;
    u_int32_t router_id;
    u_int32_t area_id;
    u_int16_t checksum;
    u_int16_t auth_type;
    u_int8_t  auth_data[8];

} ospf2_header;

// type 1 - Hello
typedef struct ospf2_hello{

    u_int32_t   mask;
    u_int16_t   hello_interval;
    u_int8_t    opts;
    u_int8_t    rtr_priority;
    u_int32_t   rtr_dead_interval;
    u_int32_t   d_rtr;
    u_int32_t   bd_rtr;

} ospf2_hello;

// type 2 - Database Description
typedef struct ospf2_db_dscrp_hdr{

    u_int16_t   iface_mtu;
    u_int8_t    opts;
    u_int8_t    bits;
    u_int32_t   dd_seq_num;

} ospf2_db_dscrp_hdr;

// type 3 - LSA Request
typedef struct ospf2_ls_req_hdr{

    u_int32_t   type;
    u_int32_t   ls_id;
    u_int32_t   adv_rtr;

} ospf2_ls_req_hdr;

// type 4 - LSA Update
typedef struct ospf2_ls_upd_hdr {

    u_int32_t   num_lsa;

} ospf2_ls_upd_hdr;


// LSA Router
typedef struct ospf2_lsa_rtr {

	u_int8_t		flags;
	u_int8_t		dummy;
	u_int16_t		nlinks;

} ospf2_lsa_rtr;

// LSA Router Link
typedef struct ospf2_lsa_rtr_link {

	u_int32_t		id;
	u_int32_t		data;
	u_int8_t		type;
	u_int8_t		num_tos;
	u_int16_t		metric;

} ospf2_lsa_rtr_link;

// LSA Network Header
typedef struct ospf2_lsa_net {

	u_int32_t		mask;

} ospf2_lsa_net;

// LSA Network Attached
typedef struct ospf2_lsa_net_att {

    u_int32_t		att_rtr;

} ospf2_lsa_net_att;

// LSA Network Link
typedef struct ospf2_lsa_net_link {

	u_int32_t		att_rtr;

} ospf2_lsa_net_link;

// LSA Summary
typedef struct ospf2_lsa_sum {

	u_int32_t		mask;
	u_int32_t		metric;

} ospf2_lsa_sum;

// LSA AS-External
typedef struct ospf2_lsa_asext {

	u_int32_t		mask;
	u_int32_t		metric;
	u_int32_t		fw_addr;
	u_int32_t		ext_tag;

} ospf2_lsa_asext;

// LSA Header
typedef struct ospf2_lsa_hdr {

	u_int16_t		age;
	u_int8_t		opts;
	u_int8_t		type;
	u_int32_t		ls_id;
	u_int32_t		adv_rtr;
	u_int32_t		seq_num;
	u_int16_t		ls_chksum;
	u_int16_t		len;

} ospf2_lsa_hdr;

// LLS Data Block
typedef struct ospf2_lls_data_block {

    u_int16_t        checksum;
    u_int16_t        data_length;

} ospf2_lls_data_block;


typedef struct ospf2_lsa {

    struct ospf2_lsa_hdr    hdr;
    union {
        struct ospf2_lsa_rtr    rtr;
        struct ospf2_lsa_net    net;
        struct ospf2_lsa_sum    sum;
        struct ospf2_lsa_asext  asext;
    } data;

} ospf2_lsa;


//-------------

typedef struct ospf3_header{

    u_int8_t  version;
    u_int8_t  type;
    u_int16_t length;
    u_int32_t router_id;
    u_int32_t area_id;
    u_int16_t checksum;
    u_int8_t instance_id;
    u_int8_t  dummy;

} ospf3_header;

typedef struct ospf3_hello{

    u_int32_t   interface_id;
    u_int32_t   opts;
    u_int16_t   hello_interval;
    u_int16_t   rtr_dead_interval;
    u_int32_t   d_rtr;
    u_int32_t   bd_rtr;
    u_int32_t   neighbor_id;

} ospf3_hello;

...

...
typedef struct ospf3_lsa_hdr {

	u_int16_t		age;
	u_int16_t       type;
	u_int32_t		ls_id;
	u_int32_t		adv_rtr;
	u_int32_t		seq_num;
	u_int16_t		ls_chksum;
	u_int16_t		len;

} ospf3_lsa_hdr;

// Router-LSA header
typedef struct ospf3_lsa_rtr_hdr {

    u_int32_t       opts;

} ospf3_lsa_rtr_hdr;

// Router-LSA
typedef struct ospf3_lsa_rtr {

    u_int8_t        type;
    u_int8_t        dummy;
    u_int16_t       metric;
    u_int32_t       if_id;
    u_int32_t       n_if_id;
    u_int32_t       n_rtr_id;

} ospf3_lsa_rtr;

// Network-LSA Header
typedef struct ospf3_lsa_net_hdr {

    u_int32_t       opts;

} ospf3_lsa_net_hdr;

// Network-LSA
typedef struct ospf3_lsa_net {

    u_int32_t       att_rtr;

} ospf3_lsa_net;

// Inter-Area-Prefix-LSA
typedef struct ospf3_lsa_inter_area_prefix_hdr {

    u_int32_t       metric;
    u_int8_t        p_len;
    u_int8_t        p_opts;
    u_int16_t       dummy;

} ospf3_inter_area_prefix_hdr;

// Inter-Area-Router-LSA
typedef struct ospf3_lsa_inter_area_rtr {

    u_int32_t       opts;
    u_int32_t       metric;
    u_int32_t       dst_rtr_id;

} ospf3_lsa_inter_area_rtr;

// AS-External-LSA
typedef struct ospf3_lsa_asext_hdr {

    u_int32_t       metric;
    u_int8_t        p_len;
    u_int8_t        p_opts;
    u_int16_t       ref_ls;

} ospf3_lsa_asext_hdr;

// Link-LSA Header
typedef struct ospf3_lsa_link_hdr {

    u_int32_t       opts;
    struct in6_addr addr;
    u_int32_t       num_pref;

} ospf3_lsa_link_hdr;

// Link-LSA
typedef struct ospf3_lsa_link {

    u_int8_t        p_len;
    u_int8_t        p_opts;
    u_int16_t       dummy;

} ospf3_lsa_link;


typedef struct ospf3_lsa_intra_area_prefix_hdr{

    u_int16_t       num_pref;
    u_int16_t       type;
    u_int32_t       ref_ls_id;
    u_int32_t       ref_adv_rtr;

} ospf3_lsa_intra_area_prefix_hdr;

// Intra-Area-Prefix LSA
typedef struct ospf3_lsa_intra_area_prefix {

    u_int8_t        p_len;
    u_int8_t        p_opts;
    u_int16_t       metric;


} ospf3_lsa_intra_area_prefix;

// OSPF3 LSA
typedef struct ospf3_lsa {

    struct ospf3_lsa_hdr        hdr;
    union{
        struct ospf3_lsa_rtr_hdr    rtr_hdr; // jak se to tam zobrazuje hdr+rtr?
        struct ospf3_lsa_net    net;
        struct ospf3_lsa_inter_area_prefix_hdr  ia_p_hdr;
        struct ospf3_lsa_inter_area_rtr         ia_rtr;
        struct ospf3_lsa_asext_hdr              asext_hdr;
        struct ospf3_lsa_link_hdr               link_hdr;
        struct ospf3_lsa_intra_area_prefix_hdr  intra_p_hdr;
    } data;

} ospf3_lsa;

//------

struct ospf3_db_item{

    struct ospf3_lsa* lsa;
    struct ospf3_db_item* next;

} ospf3_db_item;

struct ospf3_db_area{

    // area id
    u_int32_t area_id;

    struct ospf3_db_item* rtr_ls;

    struct ospf3_db_item* net_ls;

    struct ospf3_db_item* ia_p_ls;

    struct ospf3_db_item* ia_rtr_ls;

    struct ospf3_db_item* asext_ls;

    struct ospf3_db_item* link_ls;

    struct ospf3_db_item* intra_p_ls;

    struct ospf3_db_area* next;

} ospf3_db_area;

struct ospf3_db_instance{

    u_int32_t instance_id;

    struct ospf3_db_area* area_list;

    struct ospf3_db_instance* next;

} ospf3_db_instance;


struct ospf3_db {

    // id routeru
    u_int32_t router_id;
    // seznam instanci OSPFv3 na danem routeru
    struct ospf3_db_instance* instance_list;
    // ukazatel na dalsi databazi
    struct ospf3_db* next;

} ospf3_db;


int main(int argc, char *argv[])
{
...
    while((c = getopt(argc, argv, "hi:")) != -1){
        switch(c){
            case 'h':
                print_help();
                return(EXIT_SUCCESS);
                break;
            case 'i':
                dev = optarg;
                #ifdef DEBUG
                    printf("dev: %s", dev);
                #endif
                break;
            default:
                print_help();
                return(EXIT_FAILURE);
                break;
        }
    }


    if(pcap_lookupnet(dev, &net, &mask, errbuf) == -1){
        #ifdef DEBUG
            fprintf(ERROUT, "Can't get netmask for device %s, %s\n", dev, errbuf);
        #endif
        net = 0;
        mask = 0;
        //return ERRDEV;
    }


...
    handle = pcap_open_live(dev, SNAP_LEN, 1, 1000, errbuf);
    if(handle == NULL){
        fprintf(ERROUT, "Couldn't open device %s: %s\n", dev, errbuf);
        return(EXIT_FAILURE);
    }


    if(pcap_datalink(handle) != DLT_EN10MB){
        fprintf(ERROUT, "%s is not an Ethernet interface\n", dev);
        exit(EXIT_FAILURE);
    }


    if(pcap_compile(handle, &fp, filter_exp, 0, net) == -1){
        fprintf(ERROUT, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle));
        return(EXIT_FAILURE);
    }


    if(pcap_setfilter(handle, &fp) == -1){
        fprintf(ERROUT, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle));
        return(EXIT_FAILURE);
    }


    pcap_loop(handle, NUMPACKETS, got_packet, NULL);


    pcap_freecode(&fp);
    pcap_close(handle);

    return(EXIT_SUCCESS);
}

If you need the complete source code, please add the WeChat number (c17865354792)

运行结果:

使用Wireshark可以捕获网络中传输的OSPF数据包,包括Hello包、数据库描述包(DBD)、链路状态请求包(LSR)、链路状态更新包(LSU)和链路状态确认包(LSAck)。

总结

OSPF协议作为互联网中重要的路由协议,其安全运行对整个互联网的稳定性至关重要。通过使用网络嗅探工具,如Wireshark,安全专家能够监控和分析OSPF协议的运行状态,及时发现并处理可能的安全威胁,保证网络的安全和稳定。

参考:RFC 2328、RFC 2740、、RFC 5340、RFC 826、RFC 1122、RFC 1191、RFC 4632

Welcome to follow WeChat official account【程序猿编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Docker、Minikube在PC端构建K8S试验环境

在桌面电脑上使用Docker和Minikube构建Kubernetes(K8S)试验环境,为学习和测试提供了一个理想的平台。Docker的容器化技术允许在隔离的环境中运行应用,而Minikube则简化了在单节点上部署和管理Kubernetes集群的过程。这种组合使得个…

Apache 辅助系统工具

一丶Apache Sqoop 1.Sqoop的介绍: Sqoop的工作机制是将导入或者导出的命令翻译成MapReduce实现,Sqoop可以理解为:SQL到Hadoop或者Hadoop到SQL 2.Sqoop的安装 配置文件修改: cd $SQOOP_HOME/conf mv sqoop-env-template.sh sqo…

C语言第八弹---一维数组

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 一维数组 1、数组的概念 2、⼀维数组的创建和初始化 2.1、数组创建 2.2、数组的初始化 2.3、数组的类型 3、⼀维数组的使用 3.1、数组下标 3.2、数组元素…

从c到c++——4:引用

前言 在《水浒传》中,梁山一百零八好汉,每个人都有一个响亮的外号,比如,当我们提到李逵和提到黑旋风提到铁牛时,本质上我们指的是同一个人。黑旋风江州劫法场,那李逵,铁牛也有江州劫法场的经历。引用也是…

【3.6数据库系统】数据库备份与恢复技术

目录 1.数据备份1.1备份方式1.2备份类型 2.数据库故障与恢复 1.数据备份 1.1备份方式 △冷备份也称为静态备份,别是将数据库正常关闭,在停止状态下,将数据库的文件全部备份(复制)下来。 △热备份也称为动态备份,是利用备份软件&a…

E7数据库备份和恢复

E7数据库备份和恢复 一、实验目的 在Mysql上,学习如何备份数据库和恢复的各种方法。 二、实验要求: 1、基本硬件配置:英特尔Pentium III 以上,大于4G内存; 2、软件要求:Mysql; 3、时间:1小时; 4、撰写实验报告并按时提交。 三、…

常用MQ产品的对比

常用MQ产品的对比 本文整理了常用MQ之间的对比,旨在帮助大家在实际项目中选择MQ产品。 消息队列对比参照表 注: 对照表来自:消息队列对比参照表 ,对比维度比较全面,结果个人比较认同,强烈建议参考。 Rock…

【OCC学习23】使用Draw探索OCC API 【完结】

对于OCC应用开发者来说,OCC的文档虽然不错,但针对具体的需求找到合适的API还是得不断摸索。我发现看Draw的代码是探索OCC API使用的最佳路径。掌握根据Draw命令查找对应代码就能高效找到解决方案。所以这是本系列的最后一篇分享了,个人感觉OC…

TarGAN:多模态医学图像转换GAN

TarGAN 核心思想网络结构 核心思想 论文:https://arxiv.org/abs/2105.08993 代码:https://github.com/2165998/TarGAN 解决的问题:传统多模态医学图像转换通常,在生成高质量图像方面存在问题,特别是在关键目标区域或…

nginx安装ssl模块http_ssl_module

查看nginx安装的模块 /usr/local/nginx/sbin/nginx -V若出现“–with-http_ssl_module”说明已经安装过,否则继续执行下列步骤 进入nginx源文件目录 cd /usr/local/nginx/nginx-1.20.2重新编译nginx ./configure --with-http_ssl_module如果组件linux缺少&…

利用Burp Suite观察https通联

对使用 HTTPS 协议的应用程序进行测试时,常使用 bp 观察流量,为能成功建立HTTPS联接,在将bp设置居代理的同时,还必须导入bp伪证书,这样才能修改请求和响应,加密和解密流量,成功模拟浏览的各种动…

Web3创业:去中心化初创公司的崛起

随着Web3时代的到来,去中心化技术的崛起不仅令人瞩目,也为创业者带来了前所未有的机遇。在这个新的时代,一批去中心化初创公司正崭露头角,重新定义着商业和创新的边界。本文将深入探讨Web3创业的趋势,以及去中心化初创…

Your lDE is missing natures to properly support your projects

错误提示 Your lDE is missing natures to properly support your projects. Some extensions on the Eclipse Marketplace can be installed to support those natures.解决方案 打开项目文件,找到.project 文件,用编辑器打开 找到 把下图效果图中相关…

自然语言处理-文本标注

文本标注 现在让我们考虑词元级任务,比如文本标注(text tagging),其中每个词元都被分配了一个标签。在文本标注任务中,词性标注为每个单词分配词性标记(例如,形容词和限定词)。 根据…

【iOS ARKit】人脸追踪之挂载虚拟元素

人脸跟踪(Face Tracking)是指将人脸检测扩展到视频序列,跟踪同一张人脸在视频序列中的位置。是论上讲,任何出现在视频中的人险都可以被跟踪,也即是说,在连续视频帧中检测到的人脸可以被识别为同一个人。人脸…

单片机面向对象思维的架构:时间轮片法

今天分享一篇单片机程序框架的文章。 程序架构重要性 很多人尤其是初学者在写代码的时候往往都是想一点写一点,最开始没有一个整体的规划,导致后面代码越写越乱,bug不断。 最终代码跑起来看似没有问题(有可能也真的没有问题),但…

vue3创建多种遥感底图的网页教程

创建一个能调用多种遥感底图的网页教程 简介 大家好,我是锐多宝。 最近我正在使用vue3,这里记录一下我是如何使用vue3调用多种遥感底图。当然,如果你觉得安装vue麻烦,也可以直接使用原生的JavaScript,方法大同小异。…

机器学习:多元线性回归闭式解(Python)

import numpy as np import matplotlib.pyplot as pltclass LRClosedFormSol:def __init__(self, fit_interceptTrue, normalizeTrue):""":param fit_intercept: 是否训练bias:param normalize: 是否标准化数据"""self.theta None # 训练权重系…

【Chrome】浏览器怎么清除缓存并强制刷新

文章目录 1、正常刷新:正常刷新网页,网页有缓存则采用缓存。 F5 或 刷新键2、强制刷新:忽略缓存刷新,重新下载资源不用缓存。 CtrlF5 或 ShiftF5 或 CtrlShiftR3、在浏览器的设置里面清除所有数据

哪些 3D 建模软件值得推荐?

云端地球是一款免费的在线实景三维建模软件,不需要复杂的技巧,只要需要手机,多拍几张照片,就可以得到完整的三维模型! 无论是大场景倾斜摄影测量还是小场景、小物体建模,都可以通过云端地球将二维数据向三…