CDP思科发现协议解析及C/C++代码实现

news2024/11/17 0:02:46

通常,大多数网络都有几个路由器或交换机,为了便于网络管理,使用网络图或网络图来告诉网络中存在什么类型的设备,以及所有设备如何相互连接,使用的IP地址以及它们属于哪个VLAN的信息。

CDP是一种专有的第二层思科网络协议。它是一种网络发现工具,在cisco设备上运行,有助于发现连接到网络的cisco设备。CDP有助于有效地检查设备,而无需实际进行物理检查。CDP允许用户使用一些显示命令来查看连接设备的信息,例如有关本地端口、远程端口、主机名、设备平台等的信息。

默认情况下,从相邻的思科设备接收的CDP消息不会重定向到任何其他设备,即CDP只转发到直接连接的思科设备。所有支持CDP的设备都以表格格式存储从其相邻设备接收的所有消息,可以使用show CDP neighbors命令查看这些消息。

这些CDP消息在所有SNAP(子网络访问协议)报头兼容接口上每60秒传输一次。由于并非所有数据链路层介质类型都支持SNAP,因此支持的介质类型有令牌环、以太网、PPP(点对点协议)、FDDI(光纤分布式数据接口)、帧中继、ATM(异步传输模式)、HDLC(高级数据链路控制)。Cisco设备还将这些CDP消息发送到多播目标地址(01:00:0C:CC:CC:CC)。

CDP的工作原理

所有Cisco设备都会定期传输CDP数据包(默认时间间隔值为60秒,但可以调整)。这些数据包以秒为单位公布生存时间(TTL)值,该值指示在丢弃数据包之前必须保留的秒数(默认值为180秒)。

启用接口后,发送的CDP数据包的生存时间值为非零,并且在接口即将关闭之前,生存时间值为零。这提供了快速的状态发现。

所有Cisco设备都接收CDP数据包,对其进行处理并缓存数据包中的信息。Cisco设备从不转发CDP数据包。如果任何信息与上次接收到的数据包相比发生了变化,则会缓存新信息,并丢弃旧信息,即使其生存时间值尚未过期。

CDP版本

CDPV1:-初始版本,它只能收集连接到下一端的设备信息。


CDPV2:-是该协议的最新版本,提供了更智能的设备跟踪功能,如802.1Q中继上本地VLAN ID不匹配的实例,以及连接设备之间双工状态的不匹配。

  • 各字段定义
Version :包含设备软件版本信息。
TTL:接收器应保留此数据包中包含的信息的时间量,以秒为单位。180秒后默认。
Address :包含接收和发送设备的网络地址。
Port-ID :标识发送Cisco发现协议数据包的端口。 
Capabilities :标识设备类型,表示设备的功能能力。例如,一个开关。
Platform : 标识设备的硬件平台。例如,Cisco 4500。
Native :指示每个接口上未标记数据包的假定VLAN。Cisco发现协议学习接口的本机VLAN。该字段仅用于支持IEEE 802.1Q协议的接口。
VTP Management Domain: 播发配置的VLAN中继协议(VTP)-系统的管理域名。网络运营商使用此名称来验证相邻网络节点中的VTP域配置。
  • CDP Version1和Vesion 2 的区别

CDP Version1 和 Version2的主要区别在于 Version2 支持更多 TLV,比如交换机之间的 VVTP Domain,Duplex,Native VLAN ID 等等。这样极大的扩充了 CDP的功能。

思科发现协议第2版提供了比第1版更智能的设备跟踪功能。可用的功能之一是增强的报告机制,用于更快速的错误跟踪,这有助于减少网络停机时间。报告的错误包括连接端口上的本机VLAN ID(IEEE 802.1Q)不匹配以及连接设备之间的端口双工状态不匹配。有关报告错误的消息可以发送到控制台或日志服务器。

CDP监控和维护命令

clear cdp counters   #清除cdp计数器
clear cdp table     #清除cdp表
show cdp    #显示cdp
show cdp entry device-name [protocol | version]  #显示cdp入口设备名称[协议|版本]
show cdp interface [type number]  #显示cdp接口[类型号]
show cdp neighbors [type number] [detail]  #显示cdp邻居[类型编号][详细信息]
show cdp traffic  #显示cdp流量

什么是CDP欺骗

在CDP欺骗中,攻击者发送以多播mac地址(01:00:0c:cc:cc:cc)为目的地、以各种欺骗或伪造的mac地址为源的数据包。当Cisco设备接收到这些帧时,它开始在CDP表中添加信息,并且该表将开始变得更大,因为攻击者可能会向设备发送数千个CDP帧。如果设备无法处理此攻击,则设备可能会在一段时间后崩溃,这就是为什么建议在连接非思科设备、用户站的接口上禁用CDP。

CDP TLV的类型

#define TYPE_DEVICE_ID      0x0001 
#define TYPE_ADDRESS        0x0002 
#define TYPE_PORT_ID        0x0003 
#define TYPE_CAPABILITIES   0x0004 
#define TYPE_IOS_VERSION    0x0005 
#define TYPE_PLATFORM       0x0006 
#define TYPE_IP_PREFIX      0x0007 
#define TYPE_PROTOCOL_HELLO     0x0008 
#define TYPE_VTP_MGMT_DOMAIN    0x0009 
#define TYPE_NATIVE_VLAN        0x000a 
#define TYPE_DUPLEX             0x000b 
/*                              0x000c */
/*                              0x000d */
#define TYPE_VOIP_VLAN_REPLY    0x000e
#define TYPE_VOIP_VLAN_QUERY    0x000f
#define TYPE_POWER              0x0010
#define TYPE_MTU                0x0011 
#define TYPE_TRUST_BITMAP       0x0012 
#define TYPE_UNTRUSTED_COS      0x0013 
#define TYPE_SYSTEM_NAME        0x0014 
#define TYPE_SYSTEM_OID         0x0015 
#define TYPE_MANAGEMENT_ADDR    0x0016 
#define TYPE_LOCATION           0x0017
#define TYPE_EXT_PORT_ID        0x0018
#define TYPE_POWER_REQUESTED    0x0019
#define TYPE_POWER_AVAILABLE    0x001a 
#define TYPE_PORT_UNIDIR        0x001b

功能名称

char CAPABILITIES_NAMES[7][19] = {
    "Router",
    "Transparent bridge",
    "Source Route Bridge",
    "Switch",
    "Host",
    "IGMP",
    "Repeater"
};

CDP思科发现协议解析及C/C++代码实现

int main( int argc, char *argv[] ) 
{

    ...
    // 获取命令行参数
    while( ( c = getopt( argc, argv, "i:dhw:r:" ) ) != -1 ) 
    {
        switch( c ) 
        {
            case 'i':
                dev = optarg;
                handle = pcap_open_live( dev, BUFSIZ, 1, 269000, errbuf );
                
                if( handle == NULL ) 
                {
                    fprintf( stderr, "Couldn't open device %s: %s\n", dev, errbuf );
                    return( 2 );
                }
                
                // 获取设备
                if( pcap_lookupnet( dev, &net, &mask, errbuf ) == -1 ) 
                {
                    fprintf( stderr, "Couldn't get netmask for device %s: %s\n",
                             dev, errbuf );
                    net = 0;
                    mask = 0;
                }
                break;
                
            case 'd':
                debug = 1;
                break;
            
            case 'r':
                dumpfile = optarg;
                handle = pcap_open_offline( dumpfile, errbuf );
                if( !handle )
                {
                    fprintf( stderr, "Couldn't open file %s: %s\n",
                             dumpfile, errbuf );
                    return( 2 );
                }
                
                net = 0;
                mask = 0;
                break;
                                
            case 'w':
                dumper = pcap_dump_open( handle, optarg );
                if( !dumper )
                {
                    fprintf( stderr, "Couldn't write to file %s: %s\n",
                             optarg, errbuf );
                }
                break;
                
            case '?':
                if( optopt == 'd' || optopt == 'w' ) 
                {
                    fprintf( stderr, "Option -%c requires an argument.\n",
                             optopt );
                } 
                else if( isprint ( optopt ) ) 
                {
                    fprintf( stderr, "Unknown option `-%c'.\n", optopt );
                } 
                else 
                {
                    fprintf( stderr, "Unknown option character `\\x%x'.\n",
                             optopt );
                }
                return 1;

           case 'h':
           default:
               print_help( argv );
               return( 0 );
             
           }
    }
    
    if( !dev && !dumpfile ) 
    {
        print_help( argv );
        return( 0 );
    }
    
...
    
    printf( "Reading packets from %s.\n", ( dev ) ? dev : dumpfile );
    printf( "Waiting for a CDP packet...\n\n" );
    
    // 死循环 
    while( pcap_packet == 1 ) 
    {
        
        // 抓一包
        pcap_packet =
            pcap_next_ex( handle, &header, (const u_char **) &data );
        
        // 一旦数据包到达,就将其写入转储文件      
        if( dumper )
        {
            pcap_dump( (u_char *)dumper, header, data );
            pcap_dump_flush( dumper );
        }
        
...
        
...
        
        // 解析TLV树
        tlv_parse( data, header->len );
        
...
    }
    
...
}

运行结果:

CDP Version1 解析:

CDP Version2 解析:



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

总结

Cisco发现协议是一种第2层、独立于媒体和网络的协议,网络应用程序使用该协议来了解附近的直接连接设备。默认情况下启用Cisco发现协议。为Cisco发现协议配置的每个设备至少播发一个地址,设备可以在该地址接收消息,并将定期播发(消息)发送到众所周知的多播地址01:00:0C:CC:CC:CC。设备通过监听该地址来发现彼此。当其他设备上的接口打开或关闭时,他们也会听消息来学习。

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

参考:https://www.cisco.com/

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

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

相关文章

Table Transformer做表格检测和识别实践

计算机视觉方面的三大顶级会议:ICCV,CVPR,ECCV.统称ICE CVPR 2022文档图像分析与识别相关论文26篇汇集简介 论文: PubTables-1M: Towards comprehensive table extraction from unstructured documents是发表于CVPR上的一篇论文 作者发布了两个模型&…

22级ACM 4.16 周赛 题解

这场能题解写的感觉没多少其实(真的不是因为懒),既然有人想要题解,那么就随便写一下吧,其实大部分的题都有人写出来,感觉这场真的不需要。 A 题 题解 Count Interval AtCoder - abc233_d_霾まる的博客-CS…

AI绘画王炸功能Control Net安装教程

原文:AI绘画王炸功能Control Net安装教程 - 知乎 AI绘画,最近两大王炸功能出圈了。 一个就是超真实超细节的美女图片,已经快和照片无异了,甚至有人用AI绘画的“女仆照片”开始招募游艇会了,具体教程可以查看Lora这篇…

一键生成元宇宙 AI又杀疯了

人类十几年的进步水平,AI用几个月就能轻易实现。在展示了超强的文本对话能力和一键生图功能后,AI大模型不打算停下,开始挑战搭建3D空间这一更高难度的动作。 这次,Facebook母公司Meta想当一把主导者。几天前,它的首席…

185-二35

Java185-二35单列集合顶层接口collection迭代器增强forlambda表达式list特有方法遍历数据结构数组Linkedlist集合泛型类,泛型方法,泛型结构泛型方法泛型的通配符泛型总结数据结构数据结构(二叉树)前序遍历数据结构(二叉…

crm系统有哪些?具体的功能有哪些?

市面上的CRM系统有很多,例如简道云、销售易、salesforce、纷享销客、SugarCRM等等,这些都是比较知名的,前面也有写过很多关于CRM选型的内容,大家可以点进我的主页翻阅一下。 那么,CRM具体的功能有哪些?下面…

计算机网络 - UDP协议 与 TCP协议可靠性(传输层)

前言 本篇介绍UDP报文格式,认识UDP报文,介绍TCP报文格式,了解TCP可靠性的核心机制,TCP通信中三次握手与四次挥手;如有错误,请在评论区指正,让我们一起交流,共同进步! 文…

EDA基础概念

EDA基础概念EDA和CADCAD工具EDA工具EDA技术实现目标可编程逻辑器件简称PLD发展历程FPGA简介CPLD简介FPGA和CPLD区别是否需要同时学习FPGA和CPLDXilinx(赛灵思)公司介绍(AMD收购)开发工具Xilinx产品Altera(阿尔特拉&…

Qt关于QPainter绘制1px宽度图形带来的问题思考

前言 前段时间遇到这样一个问题,使用QPainter绘制直线的时候,设置了笔宽为1像素,但是绘制出来的线条却是2px宽度,而且设置的画笔颜色很明显是降低了透明度,不是最“纯正”的颜色。 当时就感觉非常奇怪,明明…

【FPGA实验1】FPGA点灯工程师养成记

对于FPGA几个与LED相关的实验(包括按键点灯、流水灯、呼吸灯等)的记录,方便日后查看。这世界上就又多了一个FPGA点灯工程师了😏 成为一个FPGA点灯工程师分三步:一、按键点灯1、按键点灯程序2、硬件实现二、流水灯1、流…

Vue2-黑马(二)

目录: (1)vue2-基础-属性绑定 (2)vue2-事件绑定 (3)vue2-双向绑定 (4)vue2-计算属性 (1)vue2-基础-属性绑定 属性与js数据绑定: …

react-router原理

前端路由的原理 自己来监听URL的改变,改变url,渲染不同的组件(页面),但是页面不要进行强制刷新(a元素不行)。 hash模式,localhost:3000/#/abc 优势就是兼容性更好,在老版IE中都可以运行缺点是…

DNS配置

TCP/IP提供了通过IP地址来连接到设备的功能,但对用户来讲,记住某台设备的IP地址是相当困难的,因此专门设计了一种字符串形式的主机命名机制,这些主机名与IP地址相对应。 在IP地址与主机名之间需要有一种转换和查询机制&#xff0c…

CANopen | 对象字典OD 06 - 创建对象字典变量,通过TPDO定时发送

文章目录一、前言二、实验目的三、对象字典OD四、TPDO1定时发送tx_Value变量一、前言 该笔记的程序: github 二、实验目的 CANopen从站有一个变量tx_Value,映射到TPDO1上。接着,CANopen从站每1S发送一次TPDO1,将tx_Value发送出去。 三、…

PasteSpider之文件同步软件的介绍

作为PasteSpider系统中的一大特色,那就是文件的差量同步和配置同步。能够实现对不同需求的良好实现。 在网站https://www.pastecode.cn/下载文件同步软件后,完全解压到自己的文件夹内,然后双击“SpiderSyncFile”,如下图: 打开登陆…

Nginx模板自动化

背景 在日常工作中,我们经常需要创建Nginx配置文件的模板,以便在不同的环境中快速部署和配置Nginx服务器。然而,这样的任务通常需要重复性高、耗时长,且容易出错。为了加快这些任务的完成,并提高工作效率,…

C/C++开发,认识opencv各模块

目录 一、opencv模块总述 二、opencv主要模块 2.1 opencv安装路径及内容 2.2 opencv模块头文件说明 2.3 成熟OpenCV主要模块 2.4 社区支持的opencv_contrib扩展主要模块 2.5 关于库文件的引用 一、opencv模块总述 opencv的主要能力在于图像处理,尤其是针对二维图…

字节8年测试经验,送给想要学习自动化测试的同学6条建议

我的职业生涯开始和大多数测试人一样,开始接触都是纯功能界面测试。那时候在一家电商公司做测试,做了有一段时间,熟悉产品的业务流程以及熟练测试工作流程规范之后,效率提高了,工作比较轻松,也得到了更好的…

QML控件--Dial

文章目录一、控件基本信息二、控件使用三、属性成员四、成员函数五、信号一、控件基本信息 Import Statement:import QtQuick.Controls 2.14 Since:Qt 5.7 Inherits:Control 二、控件使用 Dial:是一个旋钮控件; im…

【权限维持】黄金白银票据隐藏账户C2远控RustDeskGotoHTTP

文章目录内网域&单机版-权限维持-基于用户-隐藏用户内网域-权限维持-基于服务TGT-黄金白银票据黄金方法:白银方法:内网域-权限维持-基于软件-GotoHTTP&RustDesk—无需安装C2 GotoHTTPC2 RustDesk 推荐内网域&单机版-权限维持-基于用户-隐藏用…