大家直接在评论区发布答案就可以哦~
课后作业1- UDP socket 实现 ack,感知丢包重传
作业要求:
- 学会 UDP socket 编程
- 先从简单的 ack 学习,客户端等待 ack 再发包
- 什么时候客户端认为是丢包?
- 重传怎么考虑效率?
- 能不能不阻塞只穿丢掉的中间的段?
课后作业2- 三台同网段内的服务器,模拟实现一个路由器
方法一: Linux 操作系统配置法
提示:
- 了解Linux的路由配置方式
- 确保是同网段直连可达的环境。在三台机器上另外配置IP网段和路由
- 一台机器做客户端,一台机器做路由器,一台机器做服务端
- 客户端配置到达服务器的下一跳指向路由器,路由器上配置到达服务端的路由
方法二: 用户态 socket 编程实现简易 route 软件
提示:
- 收到指定的包后,做转发
- 注意是修改报文的 MAC ,不是修改 IP
- 实现一个对称路由。这样可以实现 TCP 交互
- 可以通过 ping 来验证
-
可以支持 traceroute 吗?
< 作业提交截止时间:5月17日 10:00前 >
正确答案:
课后作业1:
开放性问题,答案只要合理即可。具体实现可以参考github.com/networkprot…
根据作业要求的顺序一点点去实现,由简单ack功能入手到复杂的流控。
课后作业2:
开放性问题,答案只要合理即可。具体实现可以参考:
- 静态路由表的注入可以在代码内用全局变量表示,也可以写一个配置文件去注入。
- socket编程收raw包
- 解析raw包的IP层数据,根据静态路由表找到目标IP的下一跳
- 获取下一跳的MAC地址(linux有命令/系统调用接口,也可以自己实现简单的arp请求,保存目标MAC地址)
- 修改目标MAC地址为下一跳的MAC,修改源MAC地址为本机的出口网卡MAC。
- ttl记得-1,然后转发数据包。