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报文