NS3網路模擬(4): DataRate屬性
阿新 • • 發佈:2019-01-01
快樂蝦
歡迎轉載,但請保留作者資訊
在first.py中建立了一個點到點的通道,且配置了兩個屬性:
pointToPoint = ns.point_to_point.PointToPointHelper()
pointToPoint.SetDeviceAttribute("DataRate", ns.core.StringValue("2Mbps"))
pointToPoint.SetChannelAttribute("Delay", ns.core.StringValue("100ms"))
在配置DataRate時,first.py傳遞了一個字串”2Mbps”,這個字串最後由下面的C++程式碼進行解析:
bool DataRate::DoParse (const std::string s, uint64_t *v) { NS_LOG_FUNCTION (s << v); std::string::size_type n = s.find_first_not_of ("0123456789."); if (n != std::string::npos) { // Found non-numeric std::istringstream iss; iss.str (s.substr (0, n)); double r; iss >> r; std::string trailer = s.substr (n, std::string::npos); if (trailer == "bps") { // bit/s *v = (uint64_t)r; } else if (trailer == "b/s") { // bit/s *v = (uint64_t)r; } else if (trailer == "Bps") { // byte/s *v = (uint64_t)(r * 8); } else if (trailer == "B/s") { // byte/s *v = (uint64_t)(r * 8); } else if (trailer == "kbps") { // kilobits/s *v = (uint64_t)(r * 1000); } else if (trailer == "kb/s") { // kilobits/s *v = (uint64_t)(r * 1000); } else if (trailer == "Kbps") { // kilobits/s *v = (uint64_t)(r * 1000); } else if (trailer == "Kb/s") { // kilobits/s *v = (uint64_t)(r * 1000); } else if (trailer == "kBps") { // kiloByte/s *v = (uint64_t)(r * 8000); } else if (trailer == "kB/s") { // KiloByte/s *v = (uint64_t)(r * 8000); } else if (trailer == "KBps") { // kiloByte/s *v = (uint64_t)(r * 8000); } else if (trailer == "KB/s") { // KiloByte/s *v = (uint64_t)(r * 8000); } else if (trailer == "Kib/s") { // kibibit/s *v = (uint64_t)(r * 1024); } else if (trailer == "KiB/s") { // kibibyte/s *v = (uint64_t)(r * 8192); } else if (trailer == "Mbps") { // MegaBits/s *v = (uint64_t)(r * 1000000); } else if (trailer == "Mb/s") { // MegaBits/s *v = (uint64_t)(r * 1000000); } else if (trailer == "MBps") { // MegaBytes/s *v = (uint64_t)(r * 8000000); } else if (trailer == "MB/s") { // MegaBytes/s *v = (uint64_t)(r * 8000000); } else if (trailer == "Mib/s") { // MebiBits/s *v = (uint64_t)(r * 1048576); } else if (trailer == "MiB/s") { // MebiByte/s *v = (uint64_t)(r * 1048576 * 8); } else if (trailer == "Gbps") { // GigaBit/s *v = (uint64_t)(r * 1000000000); } else if (trailer == "Gb/s") { // GigaBit/s *v = (uint64_t)(r * 1000000000); } else if (trailer == "GBps") { // GigaByte/s *v = (uint64_t)(r * 8*1000000000); } else if (trailer == "GB/s") { // GigaByte/s *v = (uint64_t)(r * 8*1000000000); } else if (trailer == "Gib/s") { // GibiBits/s *v = (uint64_t)(r * 1048576 * 1024); } else if (trailer == "GiB/s") { // GibiByte/s *v = (uint64_t)(r * 1048576 * 1024 * 8); } else { return false; } return true; } std::istringstream iss; iss.str (s); iss >> *v; return true; }
從這一段程式碼也可以明顯看出NS3中速率字串的表達方式及意義,比文件清晰多了,原來還不知道速率可以有這麼多的表達方式,汗一個~~~~
從”DataRate”順藤摸瓜,可以發現其它幾個裝置屬性:
TypeId SimpleNetDevice::GetTypeId (void) { static TypeId tid = TypeId ("ns3::SimpleNetDevice") .SetParent<NetDevice> () .SetGroupName("Network") .AddConstructor<SimpleNetDevice> () .AddAttribute ("ReceiveErrorModel", "The receiver error model used to simulate packet loss", PointerValue (), MakePointerAccessor (&SimpleNetDevice::m_receiveErrorModel), MakePointerChecker<ErrorModel> ()) .AddAttribute ("PointToPointMode", "The device is configured in Point to Point mode", BooleanValue (false), MakeBooleanAccessor (&SimpleNetDevice::m_pointToPointMode), MakeBooleanChecker ()) .AddAttribute ("TxQueue", "A queue to use as the transmit queue in the device.", StringValue ("ns3::DropTailQueue"), MakePointerAccessor (&SimpleNetDevice::m_queue), MakePointerChecker<Queue> ()) .AddAttribute ("DataRate", "The default data rate for point to point links. Zero means infinite", DataRateValue (DataRate ("0b/s")), MakeDataRateAccessor (&SimpleNetDevice::m_bps), MakeDataRateChecker ()) .AddTraceSource ("PhyRxDrop", "Trace source indicating a packet has been dropped " "by the device during reception", MakeTraceSourceAccessor (&SimpleNetDevice::m_phyRxDropTrace), "ns3::Packet::TracedCallback") ; return tid; }
只不過我們目前暫且不管這些屬性。
修改DataRate的值,可以發現在NetAnim中最明顯的表現就是用以表示資料包的箭頭的長度,當DataRate為2Mbps時:
當DataRate變為200Kbps時就變成了:
差別還是很明顯的!