模擬之路
應用層
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對象
- PacketSocketClient / PacketSocketServer 【不包含傳輸層與網絡層分組頭 沒有助手類 】
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