文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C/C++详解实现二层转发

2024-04-02 19:55

关注

OSI第2层

前两个字段分别是目的地址和源地址字段。第3个字段是2字节的类型字段,用来标识上一层是什么协议。

数据链路层有两个子层:逻辑链路控制 (LLC) 子层和媒体访问控制 (MAC) 子层。

媒体访问控制 (MAC):MAC 子层处理硬件标识号的分配,称为 MAC 地址,它唯一地标识网络上的每个设备。 任何两个设备都不应具有相同的 MAC 地址。 MAC 地址是在制造时分配的。 大多数网络都会自动识别它。 MAC 地址位于网卡 上。

交换机跟踪网络上的所有 MAC 地址。

逻辑链路控制 (LLC):LLC 子层处理成帧寻址和流量控制。 速度取决于节点之间的链接,例如以太网或 Wifi。

第 2 层上的数据单元是一个帧。每个帧都包含一个帧头、正文和一个帧尾:

Header:通常包括源节点和目标节点的 MAC 地址。

Body:由正在传输的位组成。

Trailer:包括错误检测信息。 当检测到错误时,根据网络或协议的实现或配置,帧可能会被丢弃,或者可能会将错误报告给更高层以进行进一步的纠错。

error detection mechanisms::循环冗余校验 (CRC) 和帧校验序列 (FCS)。

通常有一个最大帧大小限制,称为最大传输单元,MTU。 巨型帧超过标准 MTU.

通过ARP解析出目标 MAC 地址?

传统交换在 OSI 模型的第 2 层运行,其中数据包根据目标 MAC 地址发送到特定的交换机端口。第 2 层网段中的设备不需要路由即可到达本地对等点。 然而,需要的是可以通过地址解析协议 (ARP) 解析的目标 MAC 地址,如下所示:

在这里,PC A 想要将流量发送到 IP 地址为 192.168.1.6 的 PC B。 然而,它不知道唯一的 MAC 地址,直到它通过 ARP 发现它,该 ARP 在整个第 2 层网段中广播。

然后将数据包发送到适当的目标 MAC 地址,交换机将根据其 MAC 地址表将正确的端口转发出去。

什么是MAC地址表

MAC地址表是在交换机中记录局域网主机和对应接口关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的。

MAC地址表可以动态的学习数据帧中的原MAC地址。在MAC地址表中,交换机的一个接口可以对应多个MAC地址。一个MAC地址只能对应在一个接口上。下面是MAC地址表形成的具体过程,如下:

二层转发C/C++代码实现

cethping:

void ethping(char *destination, char* interface){
    //创建原始套接字。 指定接口名称
    struct RawSocket* rawsocket = new_RawSocket(interface);
    //数据包数据缓冲区
    unsigned char buf[1024];
    //定义数据包。 投射以匹配以太网帧的格式
    struct ethhdr_frame* eth_packet = (struct ethhdr_frame*)buf;
    //存储发送方和接收方的 MAC 地址。 协议类型是可选的,并且指定了 0x0806。
    //根据指定的接口名称获取发送者的MAC地址
    memset(buf, 0x0, sizeof(eth_packet));
    set_macaddr_from_string(destination, eth_packet->h_dest);
    set_macaddr_from_ifname(interface, eth_packet->h_source);
	eth_packet->h_proto = 0x0806;
    //在payload中设置字符串“Hello”
    char* data = "Hello";
    memcpy(eth_packet->payload, data, sizeof(data)); 
    //绑定指定接口上的socket
    rawsocket->bind_rawsocket(rawsocket);
    int send_size = send(rawsocket->socket, &buf, sizeof(buf), 0);
    printf("%dbyte send.\n", send_size);
    //关闭原始套接字
    rawsocket->close_rawsocket(rawsocket);
}
int main(int argc, char *argv[]){
    if(argc != 3){
        printf("usage: %s <destination> <interface>", argv[0]);
        exit(0);
    }
    char *destination = argv[1];
    char *if_name = argv[2];
    ethping(destination, if_name);
    return 0;
}

cethpingd:

void start_daemon(char *interface){
    //创建原始套接字(指定接收器接口名称)
    struct RawSocket* rawsocket = new_RawSocket(interface);
    int len;
    //使用 bind 绑定到接口
    rawsocket->bind_rawsocket(rawsocket);
    while(1){
        int len = rawsocket->recv_rawsocket(rawsocket);
        struct ethhdr_frame *data = (struct ethhdr_frame*)(rawsocket->buf);
        fflush(stdout);
        //显示接收到的数据包的内容
        if(len > 0){
            printf("src: ");
            print_macaddr(data->h_source);
            printf(", ");
            printf("dst: ");
            print_macaddr(data->h_dest);
            printf(", ");
            printf("type: ");
            printf("%02x", (uint16_t)data->h_proto);
            printf(", ");
            printf("payload: ");
            printf("%s", data->payload);
            printf("\n");
        }
    }
}
int main(int argc, char *argv[]){
    if(argc != 2){
        printf("usage: %s <interface>", argv[0]);
        exit(0);
    }
    char *if_name = argv[1];
    start_daemon(if_name);
    return 0;
}

编译:

增加两个虚拟网卡:

运行:

总结

转发是将连接到网络交换机一个端口的设备的网络流量传递到连接到交换机上另一个端口的另一个设备的过程。

当第 2 层以太网帧到达网络交换机上的端口时,交换机会读取以太网帧的源 MAC 地址作为学习功能的一部分,它还会读取目标 MAC 地址作为转发功能的一部分。目标 MAC 地址对于确定连接目标设备的端口号很重要。如果在 MAC 地址表中找到目的 MAC 地址,则交换机通过 MAC 地址对应的端口转发以太网帧。

参考:

《TCP IP详解卷一》

到此这篇关于C/C++详解实现二层转发的文章就介绍到这了,更多相关C语言二层转发内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯