计算机网络项目——最小网元设计(阶段三)

目录

  • 阶段目标
  • 设计描述
    • 1、帧结构
    • 2、按目的转发
    • 3、反向地址学习
    • 4、未知广播
  • 测试情况
  • 其他想说的话

阶段目标

本阶段主要完成链路层交换机的功能实现:单播目的地址判收、支持广播、有端口地址表、反向地址学习,并在含交换机的多网元情况下完成测试。

设计描述

1、帧结构

原理

在阶段二基础的帧格式下,在帧头增加了源、目的MAC地址,其中MAC地址采用3位二进制码编码(考虑到配置文件设备数不超过8,也算是视情况偷了个懒),并且对本来为6字节的MAC地址简单处理,设备号即为MAC地址(如设备号为3则MAC地址为(int)3,然后转换为二进制目的和源MAC地址),帧格式其他部分同阶段二。
此处的源MAC地址可以直接利用配置文件所读取到的参数直接赋值,而目的MAC地址则需要手动进行输入,或在APP层进行键入传递参数,或直接利用LNK层封装时进行手动键盘键入。

01111110010001000000011001…011001111110
帧头定界符Dst_MACSrc_MACACK标志位帧序号数据位CRC校验位帧尾定界符

涉及函数

发送方:
int add_src_mac(U8* s, int len);	//插入源MAC地址
int add_dst_mac(U8* s, int len, int dst_mac);	//插入目的MAC地址接收方:
int get_src_mac(U8* s);	//提取源MAC地址
int get_dst_mac(U8* s);	//提取目的MAC地址

要点

  1. 需要注意int类型的MAC地址到U8类型的二进制MAC数据的转换。
  2. 为了避免在头部添加数据所带来的头部指针移动的麻烦,因此一种较好的办法就是预先分配足够的内存再往其中填数据,有点类似一些协议中帧长固定。

2、按目的转发

原理

本例中,通过lowerNumber的数量是否大于1来初步判断是否为交换机,以区别交换机和一般主机的LNK层。
每接收一帧,查看其目的MAC地址,判断是否为自身,如果是自身则向上层递交,不是则按端口号转发,若无此地址则广播到其他端口。其中转发和广播均通过Timeout()函数定时发送实现,以达到交换机先“存储”再转发的效果
对于交换机,在所收到的数据需要进行转发时,需要进行拆包,与自己的MAC地址表进行比对,然后利用find_port()函数找到MAC表映射的转发端口,进行转发。

涉及函数

-----全局MAC地址表-----
struct Switch_table {int addr;int port;
};//建立交换机MAC表//全局MAC表,个数最大为PORTNUM
struct Switch_table* st;
int table_len;	//MAC表端口数-----查表和表输出函数-----
void print_switch_table();	//打印MAC表
int find_port(int addr);	//根据目的地址查询并返回端口号----Timeout()函数中存储转发所需要的循环队列----
#define MAX_QUE 60
struct queue_t {int front;int rear;U8* data[MAX_QUE];		//数据数组int len[MAX_QUE];		//每个帧的帧长数组int next_port[MAX_QUE];		//待转发数据的转发出口int src_port[MAX_QUE];		//接收数据的源端口,记录下来便于后面的反向地址学习以及未知广播
};
//全局循环队列缓冲区
struct queue_t my_buffer_pool;int enqueue(struct queue_t* que, U8* buf, int len, int nextPort, int srcPort);
U8* dequeue(struct queue_t* que, int* len, int* nextPort, int* srcPort);
void initqueue(struct queue_t* que);	//初始化队列,建议在程序开始运行时的initialFunction()中使用
void freequeue(struct queue_t* que);	//清空缓存区

要点

  1. 其实没有过多需要注意的地方,弄清楚MAC地址和端口的映射,然后再转发时存下相关数据,并且注意参数的传递就好了。
  2. 对于全局缓冲区struct queue_t my_buffer_pool,由于他不是一个指针,所以在函数参数传递中,一定是传入的它的地址,就是要取地址传入&my_buffer_pool。

3、反向地址学习

原理

接收帧后,获取其源MAC地址,如果MAC表中没有此映射,则进行该地址的学习,或者在原有基础上进行更新(一定是要更新的,但这也可能在广播风暴中造成地址漂移)。
本例设计时考虑到模型的规模较小,设备不多,如果采用先进行ARP进行定时广播学习,会浪费信道资源(其实一想也不会太浪费),故采用按需学习的方式。本例中反向学习re_addr_learn()仅对接收帧内的源地址进行学习,对于没有参与通信设备的地址不进行学习。

涉及代码

void re_addr_learn(int addr, int port);		//反向地址学习

4、未知广播

交换机对于未知的目的地址将会广播到其他所有端口,在Timeout()函数中利用for循环依次向除接收端口转发出去即可。但在交换机组成环型拓扑时会引起广播风暴占用大量带宽。故应设计生成树算法进行此问题的规避。(但由于一个人的人力问题和时间问题,生成树没有想到怎么较好的实现,可能是图论算法没有学的很好的缘故,DFS和BFS没有想好咋在这个里面简单使用)

测试情况

1、含交换机的一条线拓扑测试情况
在这里插入图片描述
发送一次数据,由于数据帧和确认帧的来回两次转发,交换机产生两次MAC地址的反向学习,并打印显示MAC表。

2、广播风暴所带来的MAC表漂移情况
在这里插入图片描述
在以上无生成树环型拓扑图中,理论分析,各交换机会不断进行转发,形成广播风暴,并伴随MAC表漂移。以下测试从网元1的APP层发送一次数据,观测各交换机LNK层情况。
在这里插入图片描述
可以观测到,在网元1只发送了一次数据的情况下,其他各个网元LNK层均同上图一样,不停的转发广播数据帧,不停的更新MAC表,并且同一地址的映射发生漂移,同理论分析一样形成广播风暴。

其他想说的话

虽然交换机的基本功能都已经实现,但是无奈一个人的工作量还是太大,生成树当时没能来得及实现,也是有点小遗憾。而且在这个阶段由于没有牵涉进来网络层的路由,所以不太好指明数据最终的目的设备是谁,当时是简单通过代码里面手动修改。但在引入路由和IP与MAC的映射关系之后,这个问题便没有了。
这个阶段个人认为除了完整的生成树协议的实现,其他功能的实现还是比较简单的,而且仍然主要停留在数据链路层,还没有考虑与其他层交互的设计,导致难度也没有那么高。

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

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

相关文章

计算机网络项目——最小网元设计(阶段四)

目录阶段目标设计描述1、实体编址2、路由表设计3、路由配置4、路由器的存储转发5、端到端的图片传输测试情况其他想说的话阶段目标 本阶段需要对实体进行编址,实现NET层的IP地址到MAC层地址的映射,解决各层实体的标定区分和数据投递,同时网络…

扫一扫 移动端_移动端手机APP 身份证识别 手机扫一扫离线识别

证件识别是指能实现拍照自动输入身份信息,让用户完全告别手动输入身份证、驾驶证、行驶证等证件信息。它支持Android、 iOS 、Java、Linux等多终端形式接入,电 一山一,领九九,六八九八菱还能通过多样化的结果输出,满足…

figma应用——面向用户的咖啡点单APP的设计过程记录

目录概述设计阶段1、Brainstorm2、用户分析(1)用户画像(2)竞品分析(3)用户旅程地图(4)用户需求分析3、点单APP的demo设计(1)整体布局逻辑概览(2&a…

打docker镜像_使用docker构建自己的镜像

在docker中,我们使用docker build构建一个新的镜像,构建镜像之前需要去编写Dockerfile这个文件才能否建一个新的镜像。官方文档:https://docs.docker.com/engine/reference/builder/#fromFROM:用于指定基础镜像RUN:构建…

3d打印主要的切片参数类型_3D打印混凝土工艺参数对成型精度的影响

3D打印混凝土技术作为新兴技术,由于其不需要模板,节省大量劳动力和可打印复杂造型的特点,得到了大家的关注。但是,利用3D打印技术建造想要的结构,成型精度是必须考虑的一个问题。成型精度受材料性能、打印设备及打印工…

web中hasmoreelements_Web开发模式【Mode I 和Mode II的介绍、应用案例】

开发模式的介绍在Web开发模式中,有两个主要的开发结构,称为模式一(Mode I)和模式二(Mode II).首先我们来理清一些概念吧:DAO(Data Access Object):主要对数据的操作,增加、修改、删除等原子性操作。Web层:界…

网络传输大端序_大端、小端与网络字节序

大端(Big-Endian),小端(Little-Endian)以及网络字节序的概念在编程中经常会遇到,网络字节序(Network Byte Order)一般是指大端(Big-Endian,对大部分网络传输协议而言)传输,大端小端的概念是面向多字节数据类型的存储方式定义的&am…

cupload怎么保存图片_原生js的图片上传插件cupload

插件描述:支持图片预览、像素限制、大小限制、多图上传、更新模式下页面初始化加载图片更新时间:2020-09-25 00:23:49更新说明:添加 删除时,同时删除服务器图片的功能,文档提供php实例。添加参数Url参数更新 {ele: &q…

mysql 半同步_mysql 主从同步 与 半同步

mysql主从同步复制定义主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。通过配置文件,可以指定复制所有的数据库,某个数据…

java mysql jsp分页代码_JAVA/JSP学习系列之六(MySQL翻页例子)

JAVA/JSP学习系列之六(MySQL翻页例子)更新时间:2006年10月13日 00:00:00 作者:一、运行前准备下载了mysql的jdbc驱动(一个jar文件)并加载在CLASSPATH(方法见《JAVA/JSP学习系列之一(JDK安装) 》)(如果找不到,请从本站下载)建一个MySQL数据库…

gcn代码pytorch_GCN的简单实现(pytorch)

import torch import torch.nn as nn import torch.nn.functional as Fimport networkx as nxdef normalize(A , symmetricTrue):# A AIA A torch.eye(A.size(0))# 所有节点的度d A.sum(1)if symmetric:#D D^-1/2D torch.diag(torch.pow(d , -0.5))return D.mm(A).mm(D)e…

当电压放大电路的开路增益和输出电阻固定后_放大器的设计基础

放大器是电子电路(尤其是模拟电路)中的主要构件之一,使用放大器,它们会提高信号电平。放大器是一个术语,用于描述增加输入信号强度的电路。放大器广泛用于从音频应用到射频应用的各个领域中。但是,对于所有放大器,无论…

mysql数据库 auto_increment_mysql数据库 auto_increment

MySQL内核月报 2014.09-MySQL 捉虫动态auto_increment背景:Innodb引擎使用B_tree结构保存表数据,这样就需要一个唯一键表示每一行记录(比如二级索引记录引用)。Innodb表定义中处理主键的逻辑是:1.如果表定义了主键,就使用主键唯一…

linux 嵌入式 快照_Linux 系统之Systemd

标签:子贡问为仁。子曰:“工欲善其事,必先利其器。居是邦也,事其大夫之贤者,友其士之仁者。”——孔子(春秋)《论语卫灵公》【工欲善其事,必先利其器】掌握一门技术,知道其发展历程是非常重要的…

myeclipse打包java文件_MyEclipse将Java项目打包成jar文件的三种方法

方案一:用Eclipse自带的Export功能步骤1:准备主清单文件 “MANIFEST.MF”,由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目下建立文件MANIFEST.MF,内容如下:M…

java程序模拟atm机_Java项目实现模拟ATM机

本文实例为大家分享了Java实现模拟ATM机的具体代码,供大家参考,具体内容如下项目名称模拟ATM机项目描述简单实现ATM机功能代码实现测试类public class Test {//模拟多功能ATM机public static void main(String[] args) {ATM atm new ATM();atm.opearte(…

java计算器流程图_帮帮忙:Java小计算器代码,及需求分析.流程图.

展开全部package example;import java.awt.*;import java.awt.event.*;public class Calculator extends Frame {/*** 本实例实现功能如下 1.普通加减乘除运算 2.小数点的情况已经解32313133353236313431303231363533e58685e5aeb931333236393738决 3.开始按0已经解决 4.消去键可…

java 邮件跟踪_如何跟踪邮件已读状态(Java)

>图片的展示形式:html中图片元素表示:其中src部分是比较好玩的,我们可以用图片服务器链接地址,例如:我们也可以使用base64的图片字符串,例如:>利用图片加载来跟踪用户打开邮件状态&#x…

linux定时结束java进程_使用zt-exec库定时清理linux休眠进程

在几个月前上线的一个采集项目,构架是基于java selenium chromedriver chrome实现的采集。至于为哈不直接用jsoup或httpclient实现采集功能,是因为很多被采集页面都是通过js来渲染内容的,所以必须用webdriverchrome来模拟真正的浏览器访问…

java spring4 jar包_spring jar包官方下载|

spring-web jar包是用来SSH配置的jar包 配置了监听器,还出现严重: Error configuring application listener of class org.springframework.web.context.ContextLoader就需要它,欢迎有需要的用户前来it猫扑下载!spring-web.jar作用spring-web…