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的繼承關係
    在這裏插入圖片描述
    子類分別代表着支持五種協議的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 ) 還可以這樣 】

Q & A

  • ns3:TcpSocketFactory是一個協議?
    • 是一個socket的抽象類,用於規範,是所有tcp socket的父類 所以直接指向這個類就可以
  • P109的setRecvCallback和setAcceptCallback函數要再看看怎麼用
    • 其實就是socket類的一個函數 固定好了的
  • 鏈路層套接字地址就是PacketSocketAddress(協議號+NetDevice標識+MAC地址) ??MAC地址不能唯一標識一個硬件嗎,居然還要NetDevice標識 這到底是啥
    • To be solved
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章