Stanford CS144 lab6
- 总览
- 这个lab要实现一个路由器,其余lab5
- 路由器一般有好几个网路接口,其根据路由表决定
从哪个接口转发
和下一跳的IP地址
,这个lab不需要实现OSPF, RIP,BGP,SDN,SDN控制器等路由选择算法。
- 路由器根据路由表从指定接口转发报文,也能够从各个接口接收报文
- 实现
void add_route(const uint32_t route_prefix,const uint8_t prefix_length,const optional next_hop,const size_t interface_num)
,此函数添加路由项到路由表中
路由
是一个匹配-动作
规则:匹配
是,当一个报文到达路由器,通过IP地址的最长前缀匹配longest-prefix-match
规则匹配路由项;动作
是,如果路由器直连目的网络,那么next_hop
设置为空,置为空表示下一条就是报文的目的地址了,如果该路由器没有直接连接网络,那么下一条next_hop
的IP地址就是下一个路由器,参数interface_num
给出了路由器用来转发报文的接口,可以interface(interface num)
来访问相应接口。
void route_one_datagram(InternetDatagram &dgram);
该行动了Here’s where the rubber meets the road
,这个函数通过合适的接口路由一个报文到next_hop
,通过longest-prefix match
实习最好的路由,这意味着:
- 路由器在路由表中寻找目的ip地址(lab把它叫做
route prefix
)与报文目的ip地址能匹配的最长的前缀的项
- 如果没有匹配,需要丢弃该报文
- 路由器需要使该报文的TTL减一,如果TTL减完1后是0或者本来就是0(为什么会本来就是0?),那么路由器需要丢弃该报文
- 没有丢弃该报文,就通过合适的接口转发该报文,这样调用函数
interface(interface num).send datagram()
转发报文到下一跳
- 一个良好的Internet抽象设计使得路由器可以在对
ARP
,TCP
毫不知情的情况下,成功转发报文
- 问题
- 这里
via
之后的IP地址应该就是next_hop
的地址了,没有via
就是直接送达,注意这里有一个网络号前缀为0的项0.0.0.0/0,那么这个就是默认转发地址了,也就是这个问题所考量的
- 在真实世界中,也可能不发送ICMP报文