模拟之路 @ 网络层
源码 src/internet
架构
- 网络层主要是指Ipv4和Ipv6两个协议
- 默认情况下安装了TCP/IP协议栈的节点都是双栈节点
- Ipv4和Ipv6分别各自有个v4和v6的基类
- 本节主要以Ipv4协议栈为例讲解
网络层主要基类 及 扮演角色
Ipv4
- 协议的基类 主要定义协议的接口函数
- 主要算法在子类Ipv4L3Protocol中实现
- 一个节点只能有一个Ipv4L3Protocol和一个Ipv6L3Protocol对象
Ipv4Interface
- 网络层与链路层交互的媒介,执行与NetDevice相关的事情
- 每个节点的NetDevvice对应唯一一个interface对象 ,其内部保存着所属NetDevice的一个或多个IP地址
- 还做一些比如检查接口状态的事情,必要时使用ARP协议查询MAC地址
Ipv4RoutingProtocol
- 路由协议的基类,各种路由协议都是其子类
- 对于下行分组来说
- 获取下一跳IP,确定发往哪个Ipv4Interface对象 , 然后后者做一些与NetDevice的关联操作
- 对于上行分组来说
- 分组先发给Node中的handler向量数据结构,确定前往哪个协议(e.g, v4还是v6 )
- 然后相应的L3Protocol查询路由表,确定是接收、转发还是丢弃
- 接受 根据提取的协议号来确定发给上层哪一个传输层协议对象
每个新的L3Protocol创建的时候都要在handler这个结构里面注册先
创建
安装
- InternetStackHelper::Install( )除了安装传输层协议,还安装了网络层协议(Ipv4L3Protocol 和Ipv6L3Protocol )对象,同时建立了他们与相应的IpvxRoutingProtocol之间的关联
- 默认安装双站街点,可以通过helper的serIpv4StackInstall选择卸载某一个
地址分配 p135-138还有补充讲解
- 手动
- Ipv4AddressHelper
- .SetBase( ip ,mask )
- assign( NetDevice ) // retrun IpvxInterface 【安装ip地址就返回IpvxInterface】
- DHCP自动分配
- DhcpHelper
- 分配好的地址就存在IpvxInterface里
TC层次 (traffic-control) P132
- ns3只实现了下行的,including CoDel 、RED 、FQ-CoDel 、PIE 和 MP队列控制算法
- 可以参考ns-3 model library
脚本配置与trace
- 本层的属性很少 常见的网络层配置是路由协议
- 配置路由协议的例子和default setting 见p132
trace变量很多
- 均属于IpvxProtocol类,都和分组的收发有关
- 列举与差别见p133
Ipv4分组头
- Ipv4Header 类 ipv4-header.h
- 同样提供Print()功能
- 暂不支持Option
Ipv6分组头
路由协议
- 主要负责路由表的创建、更新和维护
- 决定要接收还是转发的时候IpvxProtocol要查表,发送往下一跳的时候也要查表
- 除了DSR和Click 其他的都是IpvxRoutingRrotocol的子类,对应的助手类的基类是IpvxRoutingHelper
- 可以使用InternetStackHelper::SetRoutingHelper( )来为一个节点指定路由
列表路由 p139
- 结点创建的时候默认使用这个 这不是个协议 是管理同一个节点上的多个协议的方法 [ 一个节点可以有多个路由协议 ] 按优先级来查询
每个协议都有个对应的IpvxProtocolHelper ( e.g. Ipv6StaticRoutingHelper 对应的就是Ipv6StaticRouting [ 这里命名隐去了Protocol我觉得是因为名字太长了2333 ] )
-
默认情况下,ipv4的列表路由存的是静态和全局路由,其中静态优先级比较高,ipv6Protocol的list中存的只有静态( 目前只支持Ipv4分组的全局路由 )
-
Ipv4ListRouting 和 Ipv4StaticRouting等 其实是同一个父类的子类,查路由表的时候实际上是调用Ipv4ListRouting 的LookUp,在list里面按照优先级遍历每个路由表,如果在该路由表找到的话最好,没有找到的话就继续遍历
路由表打印 p140
- 可以打印一个节点的、多个节点的、定时打印、反复打印 等等 都行
静态路由配置 p141
-
IpvxStaticRouting 默认的第一个查询的路由机制
tip : 因为路由协议是和网络层协议绑定的 所有要先从node里面找网络层协议,然后从网络层协议的聚合数组里面找路由协议 -
可以禁止转发 设置下IpForward属性即可 p142
-
常用函数
- IpvxStaticRouting.SetDefaultRoute( ) 设置默认静态路由
- Helper.AddHostRouteTo( 下一跳,转发地址, 接口索引号 )
全局路由 p142
- 目前只支持Ipv4分组 Ipv4GlobalRouting类
一些具体细节可以再看看书
网络层协议开发
隧道协议
- 既可以在网络层实现,又可以在链路层实现 【本节指的是网络层的 e.g. IP in IP (IP 隧道)、GRE
路由协议
其本身
- 最好直接继承IpvxProtocol,需要实现几个虚函数 p146
- 路由表
- std::list
- std::map
- 助手类
- 创建新的路由以后记得添加到RoutingList里面 p147有例程
联想
- InternetStackHelper干了好多事情 : 安装网络层的协议,绑定对应的路由协议;安装传输层的L4Protocol,创建相应的Socket(实际上主要是L4Protocol完整)并且绑定这两层的接口
question
- MANET(ad-hoc网络) OLSR协议 p132?
- p132 全局路由协议? 应该是一类协议的全称?