您现在的位置是:首页 > 正文

NS3数据包时延计算-插入时间戳Tag

2024-04-01 00:29:25阅读 7

如果要在接收端得到数据包的传输时延,那么就需要在接收端得到数据包的发送时间和数据包到达时间,后者非常简单,直接在收到包的时候

Simulator::Now ().GetSeconds ()

即可,而怎样得到数据包的发送时间呢。有三种方法:

  1. 创建跟踪源并使用回调来获取每个数据包的创建/发送时间和发送/接收时间。 然后你可以计算延迟
  2. 使用标签来标记数据包的创建/发送时间,并在收到时读取此标签并计算延迟
  3. 使用包头(或仅包头中的字段)包含创建/发送的时间,并在收到包头时读取该包头

这里介绍第二种方法,第三种方法见:NS3数据包时延计算-数据包头
第二种方法在examples/stats/wifi-example-apps.cc中使用过,其建立了一个TimestampTag的标签类。单独拿出来的话是这样的:

一、建立TimestampTag.h文件

#ifndef TIMESTAMPTAG_H
#define TIMESTAMPTAG_H



#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/application.h"

#include "ns3/stats-module.h"
#include <ostream>

using namespace  ns3;

class TimestampTag : public Tag {
public:
  static TypeId GetTypeId (void);
  virtual TypeId GetInstanceTypeId (void) const;

  virtual uint32_t GetSerializedSize (void) const;
  virtual void Serialize (TagBuffer i) const;
  virtual void Deserialize (TagBuffer i);

  // these are our accessors to our tag structure
  void SetTimestamp (Time time);
  Time GetTimestamp (void) const;

  void Print (std::ostream &os) const;

private:
  Time m_timestamp;

  // end class TimestampTag
};

#endif

二、建立TimestampTag.cc


#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include   "ns3/internet-module.h"
#include "ns3/application.h"
#include "ns3/stats-module.h"

#include "TimestampTag.h"

#include <ostream>

using namespace  ns3;

TypeId 
TimestampTag::GetTypeId (void)
{
  static TypeId tid = TypeId ("TimestampTag")
    .SetParent<Tag> ()
    .AddConstructor<TimestampTag> ()
    .AddAttribute ("Timestamp",
                   "Some momentous point in time!",
                   EmptyAttributeValue (),
                   MakeTimeAccessor (&TimestampTag::GetTimestamp),
                   MakeTimeChecker ())
  ;
  return tid;
}
TypeId 
TimestampTag::GetInstanceTypeId (void) const
{
  return GetTypeId ();
}

uint32_t 
TimestampTag::GetSerializedSize (void) const
{
  return 8;
}
void 
TimestampTag::Serialize (TagBuffer i) const
{
  int64_t t = m_timestamp.GetNanoSeconds ();
  i.Write ((const uint8_t *)&t, 8);
}
void 
TimestampTag::Deserialize (TagBuffer i)
{
  int64_t t;
  i.Read ((uint8_t *)&t, 8);
  m_timestamp = NanoSeconds (t);
}

void
TimestampTag::SetTimestamp (Time time)
{
  m_timestamp = time;
}
Time
TimestampTag::GetTimestamp (void) const
{
  return m_timestamp;
}

void 
TimestampTag::Print (std::ostream &os) const
{
  os << "t=" << m_timestamp;
}

三、建立wscript文件

def build(bld):
    obj = bld.create_ns3_module('BwProb', ['core','network','internet'])
    obj.source = [
        'model/TimestampTag.cc',
        ]
    headers = bld(features='ns3header')
    headers.module = 'BwProb'
    headers.source = [
        'model/TimestampTag.h',
        ]

然后将TimestampTag.cc和TimestampTag.h放在model文件夹下,建立个文件夹,文件夹的名字要与wscript文件中的create_ns3_module的一致,我这里是BwProb,将model文件夹和wscript文件放在进去,如:
在这里插入图片描述
然后

./waf  configure
./waf build

之后就能一直用了

四、计算时延

在发送数据包和接收数据包的文件中引用头文件#include "ns3/TimestampTags.h"
发出数据包之前:

      p = Create<Packet> (m_size);
   
      TimestampTag timestamp;
      timestamp.SetTimestamp(Simulator::Now());
      p->AddByteTag(timestamp);

接受数据包时:

TimestampTag timestamp;
packet->FindFirstMatchingByteTag (timestamp);
Time tx = timestamp.GetTimestamp();

//计算时延,并转换为double类型,方便计算
Time txdelay = Simulator::Now() - tx;
double delay = txdelay.ToDouble(Time::MS);

参考:https://groups.google.com/g/ns-3-users/c/4ZIBw4O0UfQ

网站文章

  • 山东大学计算机技术复试体验

    博主7月开始的准备考研,现在比较难受,希望大家早做准备,暑假开始复习,慎重择校。 博主是初试375分,70名,双非二本。一志愿收27个,400以上的20+,复试比接近4:1,复试线360,抱着我已经录...

    2024-04-01 00:29:18
  • LeetCode 125.验证回文串 C++

    题目描述 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。 示例 1: 输入: &quot;A man, a plan...

    2024-04-01 00:28:55
  • java中byte[]、buffer、string转换 热门推荐

    将原数组数据拷贝到目的数组 System.arraycopy(src, Srcposition, dst, DstPosition,dstLength); 将字节数组转换成字节缓冲区 ByteBuffer buffer = ByteBuffer.wrap(Bytes[]); 目前buffer存在的位置与buffer的容量 buffer.position() 将buffer读取

    2024-04-01 00:28:47
  • springmvc(3) 使用注解的处理器映射器和处理器适配器

    springmvc(3) 使用注解的处理器映射器和处理器适配器

    在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。 在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注...

    2024-04-01 00:28:15
  • EFCore-5 Migration操作

    EFCore-5 Migration操作

    migration相关说明:使用迁移脚本,可以对当前连接的数据库执行编号更高的迁移,这个操作叫做“向上迁移”(Up),也可以执行把数据库回退到旧版本的迁移,这个操作叫做“向下迁移”(Down)。 除非...

    2024-04-01 00:28:10
  • k8s基础篇-服务发布入门

    k8s基础篇-服务发布入门

    该示例为 my-service:80 即可访问到具有 app=myapp 标签的 Pod 的 80 端口上。需要注意的是,Service 能够将一个接收端口映射到任意的 targetPort,如果 t...

    2024-04-01 00:28:04
  • 深入理解Java内存模型

      深入理解Java内存模型(一)——基础深入理解Java内存模型(二)——重排序深入理解Java内存模型(三)——顺序一致性深入理解Java内存模型(四)——volatile深入理解Java内存模型(五)——锁深入理解Java内存模型(六)——final深入理解Java内存模型(七)——总结...

    2024-04-01 00:27:57
  • Python中的内置装饰器之property

    装饰器是Python中很重要的一个概念,但是这篇文档不介绍装饰器的实现,我们只需要知道装饰器可以实现一些功能; Python中也包含一些自带的装饰器,这次就说一下属性装饰器property 装饰器是P...

    2024-04-01 00:27:30
  • TextMeshPro使用说明 热门推荐

    TextMeshPro使用说明 热门推荐

    TextMeshPro使用说明创建字体所以对于中文环境建议Font Creator窗口属性注意要包含空格字符,除非确定你不需要它设置全局默认字体第一种方法第二种方法精灵字体动态字体扩展原理使用方法组件...

    2024-04-01 00:27:20
  • 大数据中的hbase是什么?有哪些特点?

    大数据中的hbase是什么?有哪些特点?

    与2018年夏季天气同样火爆的就属大数据了,作为一个可以敢和太阳肩并肩的新事物,大数据火爆、受人关注,在各个领域都有实际的应用。如今,无论是企业、商家还是个人对于大数据的关注都丝毫没有降低,那么对于大数据这个新兴高科技产物,你对hbase的了解有多少呢? 首先,我们从概念上了解什么是hbase HBase其实一个缩写,是Hadoop Database的简称,从问世之初,就为了解决用大量廉价...

    2024-04-01 00:26:56