在仿真环境使用两个UDP实体实现全栈仿真的方法:情景分析

书接上篇。

我们进行仿真的情景是不断发送数据包给B。在仿真前我们先想想具体经历的情景。

1,上层用户发送接口只提供以下几个数值给实体A:接收方的IP和UDP端口号以及我的UDP端口号。(具体这个我的端口好的用途大家可以灵活定义,比如希望对方收到我这个报文后的返回内容发给我这个端口号)。

2,上层用户将UDP报文和对方IP以及双方端口号发给UDP层进行打包,因为要生成UDP的check sum,并且蹩脚的是这个checksum在udp报文内容的前面,所以要先换成你报文计算出结果再将check sum的数值写入对应的位置。

3,UDP生成并缓存了报文,就通知IP层有内容要传递,IP如果不满立即通知到mac管理层,等待处理。因为多个发送端口要申请mac进行发送,所以这里面多了一个mac管理层,就是咱们之前写的mac_hub模块。

4,mac管理收到的ip层请求只包含了对方的ip,mac管理层首先从arp_cache里面寻找看有没有保存过这个ip的对应的mac地址。

5,因为是第一次主动发送,arp_cache里面没有找到相应的条目,就要发送arp_requst请求,广播给局域网内其他主机,请求IP对应的MAC地址。

6,mac管理层通过给arp_gen选择不同参数并产生控制时序发送生成了arp——request数据包,发给mac层,mac直接组成mac包后又组成以太网包,通过以太网总线发送给实体B。

7,实体B的ether_rx模块收到数据去掉7+1字节的前导和起始,去掉了尾部4自己的FCS(循环校验)并告知此帧是否出错,之后传递给mac_rx。

8,mac_rx收到后经由状态机st1确定如果发送的mac是本机或者发送地址是6个FF广播地址才予以接收处理。

9,mac_rx的状态机st2处理收到的arp_request。此场景下收到一个arp_request数据包,并且检查了一下ip地址字段是发送给我们的,此后他要安排好做两件事情:1;提取出来发送方的ip和mac,保存的arp_cache里(因为根据常规思路,你发送给我数据,下一步很可能就要给你发送数据了,所以我直接先保留你的ip和mac对应,这样在我发送给你的时候免的再次发送arp请求了)。2:告知arp_gen模块产生一个arp_reply回应。

10,实体B的arp_cache接受了上述IP和MAC的条目并存储。实体B的mac管理层收到了arp_reply的请求,给arp_gen设置参数并用控制时序控制生成arp_reply报文发给mac_tx生成以太网包发给实体A。

11,实体A的mac_rx收到B发来的arp_reply解析出来IP和MAC存如实体A的ARP_CACHE。

12,接5,mac管理层在没有发出去装有 UDP报文的IP,就继续继续轮询,当然后续一秒内轮询不到ip的mac不再发出arp_request,一秒后再发出,防止成为arp炸弹。

13,A的arp_cache被收到的arp_requst更新,有了要发送的ip对应的mac地址后,此IP包就可以发送了。

14,再次轮询时就有了要发送数据包IP地址对应的MAC地址,可以直接件mac_tx的数据接在upd_ip模块上,将此IP包发送出去。

以上就是一个比较完整的过程了,仿真先实现以上情景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值