当前位置:网站首页>【斯坦福计网CS144项目】Lab5: NetworkInterface
【斯坦福计网CS144项目】Lab5: NetworkInterface
2022-08-02 22:11:00 【Altair_alpha】
(旅游归来,先把这个系列的剩下两个 Lab 补完╰( ̄▽ ̄)╭)
完成 Lab 4 后,恭喜你已经翻越了本门课程的最高峰,完成了传输层 TCP 协议的主体实现。剩下的两个 Lab 则是向下看,在网络层和链路层上实现一些功能,如讲义中下图所示。
实现前 4 个 Lab 后,我们已经能自行构造一个完整的 TCP 数据包。要将这个数据包传输到另一个终端,在实际操作上有以下几种方式:
- TCP-in-UDP-in-IP。Linux 提供了接口 UDPSocket,用户只需提交负载数据,所有层的打包工作由系统完成。于是可以将我们的 TCP 包利用这个接口套在 UDP 包中发送。
- TCP-in-IP。直接将 TCP 包放在 IP 数据报中发送。Linux 提供了 TUN,用户需提交完整的 IP 包,链路层打包由系统完成。注意课程组的代码中已经提供了 TCP 到 IP 包打包的实现,Lab 4 的测试中也已经使用过。
- TCP-in-IP-in-Ethernet。Linux 还提供了 TAP,用户直接提交链路层的完整帧,系统负责收送。这两节的 Lab 我们将要使用的就是这种方式,也就是要自己实现网络层和链路层上的一些功能。
具体来说,本节要实现的是一个网络层和链路层间的接口 NetworkInterface,解决数据包的收发问题。下一节我们还会继续用这个接口实现网络层的路由功能。
网络层 IP 地址与链路层 MAC 地址存在对应关系,当源主机不知道一个 IP 数据报的目标 IP 地址对应的 MAC 地址时,应该通过 ARP 地址解析协议,广播一个 ARP 请求,该 IP 的主机收到请求后产生 ARP 回复,告知自己的 MAC 地址,源主机收到回复记录该对应关系形成 ARP cache。该缓存也有时效性。ARP 协议的具体内容可以参考维基百科。
本次需实现的接口函数共 3 个:
发送:
void NetworkInterface::send_datagram(const InternetDatagram &dgram, const Address &next_hop)
。
将一个 IP 数据报InternetDatagram
打包成以太网帧EthernetFrame
。所谓发送和之前一样,将帧 push 到一个队列_frames_out
中即可。如果next_hop
对应的 MAC 地址不知道,就要用上面所说的 ARP 协议,广播 ARP 请求并将 IP 数据报暂存。请求相同 IP 地址的 MAC 地址的数据包至少 相隔 5 秒 才能重复发送。接收:
optional<InternetDatagram> NetworkInterface::recv_frame(const EthernetFrame &frame)
。
接收一个以太网帧,如果解析为 IP 数据报,则取出内容并返回;如果为 ARP,记录源主机的 IP 和 MAC 地址映射关系,如果查询的 IP 地址是自身,则产生 ARP 回复。记录的有效期是 30 秒,过期则废弃。时间更新:
void NetworkInterface::tick(const size_t ms_since_last_tick)
。与之前 Lab 相同的被动时间感知。
代码实现按逻辑即可,没什么坑点,直接放链接:
network_interface.hh
network_interface.cc
通关截图:
边栏推荐
猜你喜欢
Teach you how to kill if else
redis的学习笔记
如何通过 IDEA 数据库管理工具连接 TDengine?
Add and delete all these years, finally planted in MySQL architecture design!
H5网页播放器EasyPlayer.js播放器界面的加载效果无法消失是什么原因?
同样月薪6K,为什么同事跳槽月薪翻倍,而你只涨了1000?
kubernetes pod podsecurityPolicies(PSP)
Sentinel vs Hystrix 限流对比,到底怎么选?
GameStop NFT 市场分析
【Unity】Unity开发进阶(六)UnityEvent使用与源码解析
随机推荐
Abstract Factory Pattern
Matplotlib drawing core principles explain (more detailed)
Jmeter二次开发实现rsa加密
【C语言】带头双向循环链表(list)详解(定义、增、删、查、改)
辅助脚本开发之旅
kubernetes pod podsecurityPolicies(PSP)
How many ways do you know the singleton pattern?
双轴晶体中的锥形折射
Broadcast platform, the use of the node generated captcha image, and validate
SRv6网络演进面临的挑战
Towards a General Purpose CNN for Long Range Dependencies in ND
TCP三次握手与四次挥手
Token、Redis实现单点登录
别再用Field注入了
创建型模式 - 单例模式Singleton
You and I will meet the needs of: how to export the data in a MySQL simple ~!Practical!
严格反馈非线性系统基于事件触发的自抗扰预设有限时间跟踪控制
IP Protocol (Internet Protocol)
非关系型数据库MongoDB简介和部署
双轴晶体中锥形折射的建模与应用