ns3学习笔记(3) 应用层

模拟之路

应用层

ns3中有两类套接字接口
  • 两种分类方式 一种是:(根据目的不同
    • 基于POSIX的原语····函数 Bind() Listen() Recv() Send() —— 建立连接 、接收和发送分组
    • 回调函数 —— 接收来自下层协议的事件通知 ( 如连接成功和发送的分组接收成功的反馈)
  • 另一种是:(根据信息交流对象不同
    • 传输层 流套接字(stream packet
    • 数据报文套接字(datagram packet
    • 网络层 原始套接字 ( raw socket
    • 链路层 Packet套接字( packet socket
  • 应用测协议实际上就是制定分组手法规则和调用套接字API两部分操作组成
架构概述 p95-
  • 所有ns3自带的应用测层协议的基类都是Application类 ( 书中称为ns3内置应用
  • 一共分成两类:
    • 一类产生分组(packet generator ) —— Aplicatuon和network中的应用都属于这一列i
    • 另一类具有信令交互的行为(以internet-app模块为首) like Ping协议、DHCPv4协议、路由广播守护协议
  • 无论哪个内置类,其助手类的使用大同小异
应用层helper的使用
  • 必备参数两个
    • 指定下层协议:UDP——ns3::UdpSocketFactory; TCP——ns3::TcpSocketFactory、IPv4——ns3::Ipv4RawSocketFactory、IPv6、链路层 p98有写
    • 套接字地址
分组产生和接收 p100
For one hand
  • 分组产生器
    • TCP的贪婪发送 BulkSendApplication 【仅客户端】【只支持TCP】
    • OnOffApplication 【仅 客户端】【5种下层协议均支持】
  • 分组接收器
    • PacketSink 通过Rx trace变量接收分组并记录其信息 【仅服务器端】【5种下层协议均支持】
For another
  • UDP层次

    • UdpClient和UdpEchoClient
    • UdpTraceClient
  • 链路层层次

    • PacketSocketClient / PacketSocketServer 【不包含传输层与网络层分组头 没有助手类 】
      • 节点中要先安装PacketSocketFactory对象
Internet应用 p105
  • 概念:基于原始套接字( raw socket )接向IP层发送消息的内置应用总称

重要警告

  • 内置应用的trace没有使用Helper帮我们自动绑好,因为Socket是程序启动时才创建,所以必须要使用Schedule函数进行connect 详见例子src/traffic-control/examples/codel-vs-pfifo-asymmetric.cc中的TraceCwnd( )函数

自定义应用层协议 p107

Socket函数的使用方法以及如何自定义Application子类

  • SocketFactory的继承关系
    ns3学习笔记(3) 应用层_第1张图片
    子类分别代表着支持五种协议的socket

  • 小tip插入:BSD socket和 POSIX socket

一开始UNIX是一个成功的但是闭源的操作系统( 诞生于贝尔实验室 ),后来出现了很多基于BSD的操作系统,但是他们互相不兼容,所以为了规范,诞生了POSIX标准,这是BSD支持的规范,只有花钱进行POSIX标准兼容性测试并通过了的OS,才能称为Unix,其余的OS,最多称为Unix-like OS或者*nix OS。然后有了Linux(但linux不是基于BSD的源代码发展的),Linux相当于BSD的开源版本 。
至于BSD socket和 POSIX socket,除了术语bsd套接字包含bsd操作系统发布的api外,没有区别。posix标准适用于任何希望符合posix的os。

Socket类的使用方法

  • TCP的连接简历涉及信令交互,如果不适用Schedule则不知道网络元素是否已经建成
  • InetSocketAddress类
    类似BSD里面的inet_sockaddr,一个ipv4地址加上一个端口,就是一个InetSocketAddress
  • 就算是自定义,也要遵循服务器端socket先开后关的原则
  • 建立的时候进行Bind( )和Connect( ),Send( ) 在连接成功建立后的回调到达的时候调用,Recv()在收到消息的回调被调用的时候调用
  • 实例脚本 P 110
  • ns3 Socket函数原语 【P110剖析得蛮不错的】
    • Close( )原语不意味着删除 ,还可以接着重新连接

  • 网络层套接字地址就是ipv4或者ipv6地址本身,传输层套接字地址是ipv4或者ipv6+端口( 分别对应Bind()和Bind6()函数 )
  • 链路层套接字地址就是PacketSocketAddress(协议号+NetDevice标识+MAC地址)

将自定义的socket操作封装在一个application类里面

  • 通过继承application类封装
  • 参考src/application/model和src/internet-app/model里面的内置应用是很好的参考模型
  • p114也有一些列举

琐碎的联想

  • 所有的helper都是通过install()进行聚合的
  • p99 NodeContainer可以通过数组索引的方式进行对象的定位
  • p104使用Node->Addapplication( Application xx ) 【看来布置一个Node不仅可以app.install( Node xx ) 还可以这样 】
  • 谨记 所有的关联都是双向的,比如说一个netdevice关联了一个IpvxInterface 那么这个Interface就能反向找到自己关联的Netdevice !!

Q & A

  • ns3:TcpSocketFactory是一个协议?
    • 是一个socket的抽象类,用于规范,是所有tcp socket的父类 所以直接指向这个类就可以
  • P109的setRecvCallback和setAcceptCallback函数要再看看怎么用
    • 其实就是socket类的一个函数 固定好了的
  • 链路层套接字地址就是PacketSocketAddress(协议号+NetDevice标识+MAC地址) ??MAC地址不能唯一标识一个硬件吗,居然还要NetDevice标识 这到底是啥
    • To be solved

你可能感兴趣的:(ns3)