核心算法分析:
1. 解析帧结构模块
本模块实现了将封装好的MAC帧各字段解析为可阅读的文本的功能。
其中,任意位置的读入失败都抛出文件已到达末尾异常,结束解析。
2. 封装数据帧模块
本模块实现了将用户输入的文本封装为MAC帧的功能。
3. 模拟发送帧模块
本模块实现了简单的CSMA/CD协议,能够模拟单机发送一个MAC帧的过程。
步骤一:载波侦听过程(CSMA)
以太网中每个结点利用总线发送数据,总线是每个结点共享的公共传输介质。所以结点在发送一个帧前,必须侦听总线是否空闲。由于以太网的数据采用曼彻斯特编码方式,所以可以通过判断总线电平是否跳变来确定总线是否空闲。若总线空闲,就可以启动发送,否则继续监听。
步骤二:冲突检测(CD)
在数据发送过程中,可能会产生冲突(冲突是指总线上同时出现两个或两个以上的发送信号,他们叠加后的信号波形与任何发送结点的输出波形都不相同)。因为可能多个主机都在侦听总线,当他们侦听到总线空闲时,就会往总线上发送数据。所以在发送数据的过程中,也应该进行冲突检测,只要发现冲突就该立即停止发送数据。
步骤三:随即延迟后重发
随机延迟后重发。在检测到冲突,停止发送后,结点进行随机延迟后重发。若发16次后还未成功,则宣告发送失败,取消该帧的发送。随机延迟的算法一般采用截断二进制指数退避算法。
具体流程图如下所示:
本程序中,对冲突和总线忙两种状态的检测均采用随机值模拟。发生冲突的概率为87.5%,总线忙的概率为50%。
4.CRC8校验
为求精简而高效,本程序采用适用于CRC8的高效率的查表法。具体算法在背景知识章节中已有描述。