C语言:基于套接字的最小网元设计

C语言:基于套接字的最小网元设计

一、设计要求

用C语言设计一组基于套接字的网元,并测试。要求网元除物理层外最少有2层,并且每个网元都具有帧同步,差错控制,流量控制功能,完成应用数据产生、处理、控制——可以手动录入数据,用于单独跟踪测试,也可自动生成信源数据,测试系统可靠性和功能,收端对数据进行检查和显示。 分别实现交换机功能、路由器功能的模拟,并在此基础上搭建一个有交换机、路由器的混合组网。

二、工具

Visual Studio2019、物理层模拟软件(具有连接两个网元(信道)、使传输的数据产生扰码的功能)

三、阶段一

3.1 任务

阶段一完成帧同步,差错控制,流量控制设计。完成应用数据产生、处理、控制——可以手动录入数据,用于单独跟踪测试,也可自动生成信源数据,测试系统可靠性和功能,收端对数据进行检查和显示。

3.2 设计思路

本次最小网元设计是基于上次套接字程序的再设计,整体框架由上次写的套接字代码和连接物理层的代码构成。在此基础上,添加了成帧函数、CRC 校验码生成函数和差错检测函数,流量控制的实现体现在主函数中。
发送端应用层用于生成数据并向发送端网络层发送数据。发送端网络层接收到应用层的数据,对数据进行成帧处理,并把帧发送到物理层。物理层接收到数据,在传输过程中会产生扰码或误码,扰码与帧会一起传给接收端的网络层。
数据传给接收端网络层后,网络层中的差错检测函数会对帧进行识别,并利用 CRC校验码校验原始数据,若数据无误则把提取出来的原始数据传给接收端应用层,若数据错误,则向应用层发送错误代码,同时也向发送端发送一个反馈,若数据无误则发送全 1 内容的帧,若数据错误则发送全 0 内容的帧。发送端的网络层接收到反馈后会判断反馈信息的内容,然后向应用层发送信息,让应用层判断是否重传。
这样整个数据发送及重新传输的流程就可以实现了。

3.3 实现的功能

在阶段二中实现了重传、发送文字、发送图片等功能。

3.4 主要的函数设计

3.4.1 成帧函数

详细分析物理信道传送的比特数据内容时,我首先向物理层发送了一些数据,
可以明显的观察到我发送的数据和物理层本身传输的同步时钟信号(形如
“010101”的比特流)是混合在一起的,所以我们无法从物理层提取到自己真正想
收的信号。于是我需要对我们传输的数据内容做出处理:封装成帧。
封装的帧形式如下:
在这里插入图片描述
无论用户在应用层选择的数据形式是怎样的,我们都把数据转换为二进制编码,再加入数据序号发送给网络层,让网络层对其计算校验码及封装成帧。

3.4.2 CRC校验码生成函数

物理层信道会有随机的误码产生,这对误码的修正做出了要求。本次设计采用的是CRC校验码,利用八位数据产生一个八位二进制的CRC校验码后放在帧内数据的后面。
为了简化代码,我们采用了查表的方式帮助实现。

3.4.3 差错校验及帧提取函数

本次的网元设计中,我们把帧的提取函数和差错校验函数放在了一个函数里,这样可以让代码更简单,数据提取及校验更方便。
对于帧的提取,我们采用了直接的提取方式,即在一个if语句中直接把帧头帧尾识别出来,这样的方式看似暴力,但是不会出现错把与帧头一样的原始数据识别为帧头或帧尾的情况。在if语句里把原始数据及CRC校验码分别提取出来,然后对原始数据生成一个新的CRC校验码,两个校验码对比,则可以判断数据有没有错误。
由于通过信道传输而来的数据是不可信的,若有错误产生,我们不知道到底是八位数据发生了误码,还是八位CRC校验码发生了误码,所以无法进行纠错,对于这种情况,我们选择重传数据。

3.4.4 文字编码与解码函数

要想传输文字,则必须对文字编码,简便起见,我们规定只能传输英文。我们利用ASCII码对英文进行转换,再把ASCII码值转换为八位二进制数。
文字的解码则与编码过程相反。
例:在这里插入图片描述

3.4.4 图片编码与解码函数

我们采用base64方法对图片进行编码。进行base64编码后会生成一串字符串,然后再把每个字符转换为八位二进制数,即实现了对图片的编码。
对图片的解码过程与编码过程相反。
例:
将要传输的图片:(15×14)
在这里插入图片描述
base64编码后产生的字符串:共1984个字符。
在这里插入图片描述
转换为二进制后的比特流:共15872比特(部分)
在这里插入图片描述

3.4 应用层及网络层结构设计

3.4.1 发送接收机制

1、发送端的网元:
(1)应用层:应用层有两种产生数据的方式,一是产生随机的八位二进制数据并将其发送到网络层,二是将用户输入的文字编码成二进制码流并拆分成八位二进制数再将其发送到网络层。
(2)网络层:网络层接收数据后先生成CRC校验码,再封装成帧,并将帧发往物理层。在这里插入图片描述
2、接收端的网元:
(1)网络层:网络层接收到物理层发来的数据后,对数据进行帧的提取,再进行八位数据的提取,并生成新的CRC校验码,与原校验码对比,判断数据是否发生错误。若无误则发往应用层,若有误则发送提示信息。
(2)应用层:应用层接收到网络层发来的数据后,首先判断这个数据是不是错误信息,若不是,则打印出八位数据,或把文字还原并打印;若是错误信息,则打印错误提示。

在这里插入图片描述

3.4.2 反馈机制

1、接收端的网元:
接收端发送反馈主要是依靠网络层,网络层对接收的帧校验后,如果数据是正确的,则给发送端反馈一个信息,信息的内容不论。如果数据错误,不做任何处理,等待即可。(停止等待流量控制)

2、发送端的网元
发送端接收反馈并判断的也是在网络层。网络层接收到反馈帧则认为接收无误。
若没有接收反馈帧,我们规定一个等待时间,在规定时间内没有检测到反馈帧,则为超时,就要重传。

3.4.3 重传机制

重传主要是在发送端的应用层实现。
应用层接收到网络层发来的超时提示的信息后,保存本次的传输数据,并把重传判断参数调为1(重传判断参数为1则为需要重传,为0则不需要),这样在下一个传输循环中,发送的数据就会和上一次的一样,即实现了重传。
在这里插入图片描述

3.5 测试

(1)随机数据:
发送端:左为应用层,右为网络层
在这里插入图片描述
在这里插入图片描述
接收端:左为应用层,右为网络层。
在这里插入图片描述
从图片中的数据可见,第1、2次发生了误码,而且是反馈信息的误码,发送端重传了两次。
(2)传输文字的测试
测试1:在发送端应用层输入“hello”,让其发送。
发送端:左为应用层,右为网络层。
在这里插入图片描述
接收端:左为应用层,右为网络层。
在这里插入图片描述
测试2:在发送端应用层输入“hello,world”,让其发送。
发送端网络层:
在这里插入图片描述
接收端应用层:
在这里插入图片描述
(3)传输图片的测试
待传输的图片:(15×14)
在这里插入图片描述
接收端:
在这里插入图片描述
解码后的图片:
在这里插入图片描述

四、阶段二

4.1 任务

完成交换接口排队模型设计——多接入的寻址设计,完成二层交换模型设计。(需结合二层交换技术)。

4.2 设计思路

本次设计依靠于配置文件中的“ne 5 三个网元三层连成环 交换机模型”(见github)。所以本次的设计是三个网元连成环状,每一个网元都是一个交换机,都能完成成帧、差错控制、寻址、转发的功能。在整个模型中,可以实现点对点及广播。

4.3 结构设计

4.3.1 网元结构

在OSI模型中,交换机本应在数据链路层,但我们出于简化网元的考虑,没有设计数据链路层,而是把交换机的功能放到我们设计的网元的网络层。这样网元仍是三层结构:应用层、网络层(数据链路层)、物理层。
在这里插入图片描述

4.3.2 交换机模型结构设计

在我们的交换机模型中,三个网元连成环,构成环状拓扑,规定以逆时针方向发送数据。每个网元都是交换机,都可以发送、接收和转发数据,也就是说,每个网元都是一样的。
在这里插入图片描述
如果网元1作为数据的发送端,则它向端口号为11100的物理层发出数据,网元2从端口号为12100的物理层接收数据,在网元2的网络层(数据链路层)判断是转发还是自己接收还是既转发又接收(广播)。如果是转发,则网元2从端口号为12101的物理层发出数据,网元3从端口号为13101的物理层接收数据。如果是网元2接收了数据,则网元3无需做任何操作。
对未知端口的处理。在环形拓扑中,如果不利用生成树算法,对携带未知端口号的数据会进行无限转发。

4.4 测试

略。。。

五、阶段三

5.1 任务

完成路由器设计,完成混合组网设计。

5.2 组网结构

在这里插入图片描述

5.3 网元结构

出于简化的考虑,我们没有增加链路层,而是把链路层与网络层结合为一层,其结构与阶段三相同。

5.4 路由器设计

在最小网元设计中,由于网络拓扑简单,路由器与交换机实现的功能十分相似。在本次的设计中,我们设计的是静态路由,并且配置了静态路由表。
静态路由表的配置示例:
在这里插入图片描述

5.5 测试

略。。。

代码:https://github.com/ccc-hhh/C-.git

发布了2 篇原创文章 · 获赞 0 · 访问量 92

猜你喜欢

转载自blog.csdn.net/ccooppplus/article/details/103863481