ns-3的分层结构概览
应用层
ns-3应用层协议主要负责数据分组的收发和处理,源码位于src/application/
下。应用层协议的软件架构如下:
- 分组生成部分按照给定的规则发送分组
- 分组处理部分负责接收来自下层协议的分组并对分组相关信息进行记录
这两部分均通过Socket与下层协议交互。原语函数值的就是基于POSIX套接字的原生函数,用于与下层协议连接、收发分组;回调函数用于接收事件通知。
ns-3支持4种套接字:
- 与传输层协议交互的流套接字;
- 数据报文套接字;
- 与网络层协议交互的原始套接字;
- 与链路层交互的Packet套接字。
传输层
ns-3实现了TCP和UDP,传输层协议为应用提供了逻辑上的端到端服务,源码位于src/internet/
下。传输层的软件架构如下:
- 端点(endpoint)是传输层通信连接的起始点。ns-3应用层创建一个Socket的同时,系统同时也在传输层创建一个与其匹配的端点对象。这个端点对象内部存储了本地和通信对端的套接字地址(IP:端口)。
- IpL4Protocol是传输层和网络层交互的接口,负责分组的实际收发。具体地,负责分组收发时的多路复用(分解)。
- 两个节点之间可以同时建立多个传输层连接,也就是一个节点拥有多个端点。
网络层
ns-3的网络层需要经历多个中间节点将分组发送至目标主机,同时不依赖任何底层物理链路技术而运行,源码位于src/internet/
下。网络层的软件架构如下:
- Ipv4是IPv4协议的基类,定义了IPv4协议的接口函数,其主要算法在子类Ipv4L3Protocol中实现。在ns-3中,一个节点只能有一个Ipv4L3Protocol和一个Ipv6L3Protocol对象。
- Ipv4Interface是网络层与链路层交互的媒介。节点的每一个NetDevice都对应着唯一一个Ipv4Interface对象,其内部保存着所属NetDevice的若干IP地址。
- Ipv4RoutingProtocol是所有路由协议的基类。
对于下行分组(传输层到网络层)来说,Ipv4L3Protocol的主要任务就是获取下一跳IP地址,并确定将分组发往哪一个Ipv4Interface对象;Ipv4Interface主要执行一些与NetDevice相关的操作。
对于上行分组来说,NetDevice通过回调函数把分组发送给Node对象的handler,从而确定是将分组发送给Ipv4L3Protocol还是Ipv6L3Protocol,之后Ipv4L3Protocol需要查询路由表确定如何处理分组;对于要接收的分组,Ipv4L3Protocol通过提取分组头中的协议号来确定将分组发送个哪一个传输层协议对象。
在脚本中,网络层的创建分为两步:
- 在节点安装网络层协议栈
InternetStackHelper::Install()
- IP地址分配
Ipv4AddressHelper::Assign()
还有一个不属于传统TCP/IP的TC层未在图中标出。流量管理层TC位于网络层和链路层之间,在ns-3中实现为TrafficControlLayer。
- 对下行分组来说,它位于Ipv4Interface和NetDevice之间
- 对上行分组来说,它位于node handler和Ipv4L3Protocol之间
TC层可以通过不同的队列算法来控制分组的收发行为。
链路层和物理层
PPP和CSMA
其分别实现在独立的模块:src/point-to-point/
和src/csma/
中。PPP和CSMA的软件架构完全相同:
在发送端,任何来自网络层的分组都会被存入一个发送缓存队列。待信道可用后,发送端队列才会开始向外传输分组。
在接收端,默认状态下分组会被直接转发到上层协议,但用户可以在脚本中选择一个错误模型,模拟信道中的分组丢失。队列和错误模型都属于network模块,源码位于src/network/utils/
目录。
PPP和CSMA的主要区别是判断信道是否可用。
- PPP NetDevice可以持续发送分组;
- CSMA 信道被多个节点共享,发送分组前需要先进行载波监听。
Wi-Fi
源码位于src/wifi/
下,实现了一系列IEEE 802.11协议。软件架构如下:
- WifiNetDevice 是Wi-Fi设备与上层协议通信的接口,可以视为WifiMac和网络层的中介。
- WifiMac Wi-Fi协议的MAC层实现,功能包括关联(association)、探测(probe)、信标(beacon)、分组重传等。
- RemoteStationManager 速率控制
- WifiPhy Wi-Fi协议的物理层实现,包括计算发射功率、传输延迟、接收功率阈值等。
- Channel 模拟Wi-Fi信道,属于物理层的一部分。结合传播和移动模型,Channel负责计算一个分组的接收功率、传播延迟等。