ns3学习笔记(4) 传输层

模拟之路

架构 p115

  • 源码位于Src/internet
    ns3学习笔记(4) 传输层

socket是传输层和应用层的交互接口,也是传输层核心算法的实现主体

端点概念和作用 p115

  • 存储本地和通信对端的套接字地址
  • 由于套接字地址的分类不同,也分为v4和v6两种

IpL4Protocol

  • 负责multiplexing 和 demultiplexing

    • 因为传输层和而节点之间可以同时简历多个传输层连接,所以一个节点可以拥有多端点,这就需要接收端的传输层做多路分解和多路复用,这既是IpL4Protocol做的事情
  • 还负责创建Socket与端点和socket的联系创建

    • Socket::CreateSocket( )实际上都是调用IpL4Protocol子类的CreateSocket函数,这样传输层协议才能掌握相应的端点的信息 【 所以不难理解在跟踪trace的时候,configPath中SocketList在IpV4Protocol中了 】
  • 网络层通过ip头获取上层协议号,然后分别传给相应的IpV4Portocol子类( 注意,一个节点里面只有一个子类的实例对象 ),然后子类再传送给各个端点(收消息的时候就socket直接收就可以了,端点主要是提供远程的地址)
    ns3学习笔记(4) 传输层

  • 端点用唯一的端口号进行区别IpV4Protocol用唯一的协议号进行区别( 所以一个节点只有一个UdpL4Protocol和TcpL4Protocol )

  • 与端点和socket的联系创建

  • 比较复杂在INternetStackHelper.install( Node n )的过程中创建了

TCP

  • 分为原生TCP和cradle TCP,后者可以连接实际中的Linux 网络,so Cradle
  • 本书讨论ns3原生TCP

架构

  • Socket子类是: TcpSocketBase (默认采用New Reno算法和SACK
  • IpV4Protocol子类是:TcpL4Protocol
  • 核心的属性和race集中在如下
    • TcpSocket
      • 虚类 定义基本的TCP属性
      • 关键属性有:SegmentSize
    • TcpSocketBase
      • 窗口管理、拥塞控制等主要TCP算法都在这个类中实现
      • 关键trace有:CongestionWindow、Tx、Rx 【InternetStackHelper也可以打印出来这些信息】
    • TcpLProtocol
      • 负责与网络层的接口 & 创建TcpSocketBase
      • 关键属性有:SocketType

结合doxygen以后整理如下:
ns3学习笔记(4) 传输层

  • 注意 ,Socket子类对象的trace都要放在Schedule里面进行回调的绑定,例子见Src/traffic-control/examples/codel-vs-pfifo-asymmetric.cc脚本
分组头结构
  • src/internet/model/tcp-header.h TcpHeader
  • TcpHeader::Print()可以打印除了校验位以外的所有TCP分组头信息
  • TcpHeader::GetOption()获取选项信息
  • 实例见P120 tcp-socket-base.cc
连接建立与关闭

窗口管理


UDP

  • Socket子类是: UdpSocketImpl (TCP的就叫TcpSocketBase 命名不一致,也是很迷了
  • IpV4Protocol子类是:UdpL4Protocol
  • 核心的属性和race不多
    ns3学习笔记(4) 传输层

分组头结构

  • src/internet/model/udp-header.h UdpHeader

广播与多播

  • 例子见p126

传输层协议开发 p126
【这里列举的逻辑是从底向上 实际上我们从宏观到微观的过程应该从后面往回看建立过程】

Socket & SocketFactory

  • Socket 的Bind等原语函数都是纯虚的,需要在子类中根据新的协议重新是新啊
  • Socket基类定义了一些列以Notify开头的函数, 用于触发那些只想应用层回调函数的Socket函数指针
  • 有了Socket子类猴,要实现对应额SocketFactory子类( xxSocketFactoryImpl ) ,后者在CreateSocket的时候会调用相应的传输层协议(IpV4Protocol的子类)的CreateSocket

IpV4Protocol

  • 定义子类的协议号
  • CreateSocket()
  • NotifyNewAggregate()
    • 每一个Object子类都会实现的函数
    • 在IpV4Protocol中 该函数的功能是 P127
      • 创建Socket(including its 端点)
      • 绑定这个Socket到自己所在的Node的聚合数组里面 这样才能保证传输层的完整性

助手类 InternetStackHelper

  • 把新定义的IpV4Protocol子类 在install的时候聚合到Node里面去

示例脚本举例 见P127

非发行版的传输协议 P127

  • including Cubic Noordwijk MPTCP

question

  • 实际网络中有端点这种说法吗
  • cradle TCP可以连接实际中的Linux 网络,so What’s cradle mean?
  • socket and socketFactory in ns3 关联是啥…