首页 > 其他分享 >CS144-lab6-the IP router

CS144-lab6-the IP router

时间:2023-01-23 02:26:34浏览次数:73  
标签:IP CS144 length prefix lab6 路由器 route 路由 路由表

lab 地址 :lab6-doc
代码实现 :lab6-code

1. 目标

lab6 主要要实现一个路由的机制,首先互联网由多个局域网组成(不太严谨的说法),在 lab5 中我们只能支持在单个局域网中传递消息,确定目标地址(arp)。
而跨局域网的情况下,需要确定跨局域网的路由器地址,这里就需要用到路由表。

路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。打个比方,路由表就像我们平时使用的地图一样,标识着各种路线,路由表中保存着子网的标志信息、网上路由器的个数和下一个路由器的名字等内容。路由表可以是由系统管理员固定设置好的,也可以由系统动态修改,可以由路由器自动调整,也可以由主机控制。

lab6 中主要要实现的是两个接口

//! Send a single datagram from the appropriate outbound interface to the next hop,
//! as specified by the route with the longest prefix_length that matches the
//! datagram's destination address.
void route_one_datagram(InternetDatagram &dgram);

//! Add a route (a forwarding rule)
void add_route(const uint32_t route_prefix,
const uint8_t prefix_length,
const std::optional<Address> next_hop,
const size_t interface_num);

添加路由规则和正确路由一个数据报。

2. 实现

2.1 add_route

添加路由的逻辑比较简单,其实就是将参数中路由规则添加到路由表中,需要自定义一个路由表缓存结构。其中比较关键的参数为 route_prefixprefix_length ,这两者可以构建出一个 ip 范围。
假设有 ip “18.47.0.0/16”,那么它的 route_prefix 就是 305070080 (18 × 224 + 47 × 216) ,而 prefix_length 则是 16。
这里选择将参数都塞到一个结构体 RouteRule,然后用 vector 存放 RouteRule

2.2 route_one_datagram

路由表的目的是为了确认数据报的目标地址是否在路由表中有匹配的路由,路由匹配规则参考下图

由此可以确定,匹配一个路由的规则为:
route_prefix 右移 32 - prefix_length 位,目标 ip 地址也同样右移相同位数,然后比较两者是否相等,相等表示路由规则匹配。此外需要区别一种特殊情况,即 prefix_length 为 0,这时路由是满足匹配条件的。
接口的大致流程如下:

  1. 根据路由匹配规则,遍历路由表获取匹配的路由
  2. 当存在多条路由匹配的时候,选择 prefix_length 最长的路由规则
  3. 如果没有匹配的路由,则 drop 数据报
  4. 递减 datagram 的 ttl,如果递减完后 ttl 为 0 或者递减前 ttl 为 0,则 drop 数据报
  5. 条件满足的情况下,发送数据报

TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4报头的一个8 bit字段。

3. 测试结果

标签:IP,CS144,length,prefix,lab6,路由器,route,路由,路由表
From: https://www.cnblogs.com/lawliet12/p/17064835.html

相关文章

  • JavaScript学习笔记—数组去重实例
    编写代码去除数组中重复的元素constarr=[1,2,1,3,2,2,4,5,5,6,7];//分别获取数组中的元素for(leti=0;i<arr.length;i++){//获取当前值后边的所有值f......
  • JavaScript学习笔记—复制
    9.复制(1)浅拷贝(shallowcopy)通常对对象的拷贝都是浅拷贝只对对象的浅层进行复制(只复制一层)如果对象中存储的数据是原始值,那么拷贝的深浅是不重要浅拷贝只会对对象本......
  • JavaScript 跨域问题
    一、什么是跨域跨域(Cross-originresourcesharing,CORS)是指在浏览器中,同源策略限制了来自不同域的脚本对每个网络资源的访问权限。同源策略限制了一个网页脚本只能......
  • JavaScript学习笔记—数组的方法
    1.非破坏性方法(1)Array.isArray():用来检查一个对象是否是数组console.log(Array.isArray([1,2,3,4]));//trueconsole.log(Array.isArray({name:"孙悟空"}));//fals......
  • typescript联合类型的类型缩减使用
    never是所有类型的子类型当我们想要一个这样一个类型时困难1因为采用索引签名要满足所有成员都必须符合字符串的索引签名所有不能采用{[index:string]:string|ag......
  • JavaScript对象的创建方式有几种?怎么用?
    JavaScript对象的创建方式有几种?怎么用?对象是JavaScript的基本数据类型,对象不仅是字符串到值的映射还保持自有属性,JavaScript对象可以从一个称为原型的对象继承属性,对象的方......
  • JavaScript中的空值合并操作符【??】和可选链操作符【?.】的理解和使用
    参考:http://t.csdn.cn/5700Y??-空值合并操作符结构:eg:letres=num01??num02;??当左侧的变量为null或undefined的时,返回左侧num02否则返回自身num01(num01相当于nu......
  • JavaScript 循环引用
    JavaScript中的循环引用是指两个或多个对象之间相互引用的情况。这种情况下,这些对象就不能被垃圾回收机制正常回收,会导致内存泄漏。循环引用通常发生在对象之间相互包含......
  • JavaScript学习笔记—数组
    1.描述数组也是一种复合数据类型,在数组中可以存储多个不同类型的数据数组中存储的是有序的数据,数组中的每个数据都有一个唯一的索引,可以通过索引来操作获取数据数组中......
  • JavaScript 内存管理及垃圾回收
    一、内存管理JavaScript是一种自动垃圾回收语言,这意味着JavaScript引擎会自动监测和清理无用的内存。JavaScript中的内存管理主要由JavaScript引擎负责,开发人员不......