网络互联(软件路由器)实验

devtools/2025/1/21 4:58:29/

1 实验内容

给定网络拓扑以及节点的路由表配置,实现路由器的转发功能,使得各节点之间能够连通并传送数据。

  1. 在主机上安装arptables, iptables,用于禁止每个节点的相应功能
  2. 运行给定网络拓扑(router_topo.py)
  • 路由器节点r1上执行脚本(disable_arp.sh, disable_icmp.sh, disable_ip_forward.sh),禁止协议栈的相应功能
  • 终端节点h1-h3上执行脚本disable_offloading.sh
  1. 在r1上执行路由器程序
  2. 在h1上进行ping实验
  3. 构造一个包含多个路由器节点组成的网络
  • 手动配置每个路由器节点的路由表
  • 有两个终端节点,通过路由器节点相连,两节点之间的跳数不少于3跳,手动配置其默认路由表
  1. 连通性测试
  • 终端节点ping每个路由器节点的入端口IP地址,能够ping通
  1. 路径测试
  • 在一个终端节点上traceroute另一节点,能够正确输出路径上每个节点的IP信息

2 实验原理

不同网络之间的数据传输需要用到路由器的数据转发功能。

当数据包到达路由器的端口时,需要查询路由表获取转发路径,在查询路由表时,数据包只包含目的地址,通常使用最长前缀匹配的方式来查找,路由表结构如下:

Dest/Mask

GW

Iface

10.0.0.0/8

1.2.0.1

eth0

10.0.0.0/16

1.3.0.1

eth1

10.2.0.0/16

1.4.0.1

eth2

Default

1.5.0.1

eth3

最长前缀匹配方式:(dst_ip & mask) == (dest & mask),且掩码长度最长(mask值最大)

2.1 路由器总体实现逻辑

  1. 处理ARP请求和应答
  • 收到ARP请求时,如果Target Proto Addr为本端口地址,则ARP应答
  • 转发数据包时,如果ARP缓存中没有相应条目,则发送ARP请求
  1. ARP缓存管理
  • 进行ARP查询、更新等操作
  1. IP地址查找和IP数据包转发
  • 收到数据包后,查找对应的转发端口;更新IP头部,转发数据包
  1. 发送ICMP数据包
  • 路由表查找失败;ARP查询失败; TTL值为0;收到ping本端口的包

2.2 路由器路由查找流程

  1. 给定数据包,提取该数据包的目的IP地址
  • 注意进行字节序转换:数据包中的都是网络字节序,本地存储的数据结构都为本地字节序
  1. 遍历路由表(链表),使用最长前缀匹配查找相应条目
  • 如果设置默认路由,则肯定能查找到匹配路由条目
  1. 如果查找到相应条目,则将数据包从该条目对应端口转出,否则回复目的网络不可达(ICMP Dest Network Unreachable)。在转发数据包时:
    1. 对IP头部的TTL值进行减一操作,如果该值 <= 0,则将该数据包丢弃,并回复ICMP信息
    2. IP头部数据已经发生变化,需要重新设置checksum
    3. 在新的网络内发送数据包
    • 将以太网头部的源MAC地址设置为转发端口的MAC地址
    • 将目的MAC地址设置为对应的MAC地址

2.3 ARP查询

使用ARP机制查询下一跳IP地址对应的MAC地址:

    • 路由器维护一个缓存ARP相关内容的数据结构:arpcache
    • arpcache缓存两类数据:
      • IP->MAC映射条目
      • 查找不到相应条目而等待ARP应答的数据包

ARP缓存操作:

    • 查找IP->MAC映射
      • 如果在arp缓存中找到相应映射,则填充数据包的目的MAC地址,并转发该数据包
      • 否则,将该数据包缓存在arpcache->req_list中,并发送ARP请求
    • 收到新的IP->MAC映射
      • 将该映射写入arp缓存中 ,如果缓存已满(最多32条),则随机替换掉其中一个
      • 将在缓存中等待该映射的数据包,依次填写目的MAC地址,转发出去,并删除掉相应缓存数据包
    • 每1秒钟,运行arpcache_sweep操作
      • 如果一个缓存条目在缓存中已存在超过了15秒,将该条目清除
      • 如果一个IP对应的ARP请求发出去已经超过了1秒,重新发送ARP请求
      • 如果发送超过5次仍未收到ARP应答,则对该队列下的数据包依次回复ICMP(Destination Host Unreachable)消息,并删除等待的数据包

ARP协议格式:

2.4 ICMP数据包格式

  1. 路由表查找失败

Type: 3, Code: 0, Rest of ICMP Header: 前4字节设置为0,接着拷贝收到数据包的IP头部(>= 20字节)和随后的8字节

  1. ARP查询失败

Type: 3, Code: 1, Rest of ICMP Header: 同上

  1. TTL值减为0

Type: 11, Code: 0, Rest of ICMP Header:同上

  1. 收到Ping本端口的数据包( Type为8 )

Type: 0, Code: 0, Rest of ICMP Header: 拷贝Ping包中的相应字段

    • Type 8 表示 Echo Request,即Ping请求,用于向目标主机发送Ping包。
    • Type 0 表示 Echo Reply,即Ping应答,用于回应Ping请求。

3 实验流程与结果分析

3.1 实验具体实现

代码的实现逻辑自顶向下推导,如下框图所示:

对于数据包的处理包含两条逻辑:转发数据包类型还是icmp通信协议类型。对于数据包的转发需要考虑对路由表的遍历、最长前缀匹配以及是否满足转发条件;对于icmp通信协议类型则根据不同typ


http://www.ppmy.cn/devtools/152267.html

相关文章

钉钉消息推送()

记录一下java实现消息推送 1. 首先添加依赖 <dependencies><dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>2.0.0</version></dependency><dependency&…

基于Springboot实现旅游网站系统开发

项目介绍 在介绍文章之前呢&#xff0c;小伙伴们需要掌握关于咱们前后端知识点&#xff0c;我整理了几个课程&#xff0c;可以去学习&#xff1a; 课程1-java和vue前后端分离项目实战 课程2-HTML5入门级开发 课程3-vue入门级开发教程 课程4-CSS入门级开发 里边的老师也很敬业&…

CV 图像处理基础笔记大全(超全版哦~)!!!

一、图像的数字化表示 像素 数字图像由众多像素组成&#xff0c;是图像的基本构成单位。在灰度图像中&#xff0c;一个像素用一个数值表示其亮度&#xff0c;通常 8 位存储&#xff0c;取值范围 0 - 255&#xff0c;0 为纯黑&#xff0c;255 为纯白。例如&#xff0c;一幅简单的…

Django框架:python web开发

1.环境搭建&#xff1a; &#xff08;a&#xff09;开发环境&#xff1a;pycharm &#xff08;b&#xff09;虚拟环境&#xff08;可有可无&#xff0c;优点&#xff1a;使用虚拟环境可以把使用的包自动生成一个文件&#xff0c;其他人需要使用时可以直接选择导入包&#xff…

SpringBoot整合junit

SpringBoot 整合 junit 特别简单&#xff0c;分为以下三步完成: 1在测试类上添加 SpringBootTest 注解2使用 Autowired 注入要测试的资源3定义测试方法进行测试 1.实验准备&#xff1a; 创建一个名为 springboot_junit_test 的 SpringBoot 工程&#xff0c;工程目录结构如下…

如何修改React 项目版本

npx create-react-app react-project-name在项目根目录运行以下命令&#xff0c;卸载当前的 React 和 React-DOM&#xff1a; npm uninstall react react-dom重新安装 React 和 React-DOM 指定版本&#xff1a; npm install react18.2.0 react-dom18.2.0确认 package.json 中…

SDL2:arm64下编译使用 -- SDL2多媒体库使用音频实例

更多内容&#xff1a;XiaoJ的知识星球 SDL2&#xff1a;Android-arm64端编译使用 2. SDL2&#xff1a;Android-arm64端编译使用2.1 安装和配置NDK2.2 下载编译SDL22.3 SDL2使用示例&#xff1a;Audio2.4 Android设备运行 2. SDL2&#xff1a;Android-arm64端编译使用 在Linux系…

Android-Gradle-自动化多渠道打包

所谓自动执行加固&#xff0c;无非就是几行命令&#xff0c;360加固保提供了一套命令行进行加固 特别提醒&#xff0c;此处360配置可选项的增强服务有bug&#xff0c;已经跟官方沟通&#xff0c;他们需要在下个版本修复&#xff0c;当前存在bug的版本3.2.2.3&#xff08;2020-0…