模拟之路
架构 p115
- 源码位于Src/internet
socket是传输层和应用层的交互接口,也是传输层核心算法的实现主体
端点概念和作用 p115
- 存储本地和通信对端的套接字地址
- 由于套接字地址的分类不同,也分为v4和v6两种
IpL4Protocol
-
负责multiplexing 和 demultiplexing
- 因为传输层和而节点之间可以同时简历多个传输层连接,所以一个节点可以拥有多端点,这就需要接收端的传输层做多路分解和多路复用,这既是IpL4Protocol做的事情
-
还负责创建Socket【与端点和socket的联系创建】
- Socket::CreateSocket( )实际上都是调用IpL4Protocol子类的CreateSocket函数,这样传输层协议才能掌握相应的端点的信息 【 所以不难理解在跟踪trace的时候,configPath中SocketList在IpV4Protocol中了 】
-
网络层通过ip头获取上层协议号,然后分别传给相应的IpV4Portocol子类( 注意,一个节点里面只有一个子类的实例对象 ),然后子类再传送给各个端点(收消息的时候就socket直接收就可以了,端点主要是提供远程的地址)
-
端点用唯一的端口号进行区别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
- TcpSocket
结合doxygen以后整理如下:
- 注意 ,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不多
分组头结构
- 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 关联是啥…