如何模拟网络中的时延

how to simulate time delay in network

本文关键字:网络 时延 模拟 何模拟      更新时间:2023-10-16

假设我们需要在两台AB之间使用UDP协议发送此消息Hellow World。计算机A将以一定的时间延迟(恒定或时变)向B发送消息。现在,为了模拟这个场景,我的第一次尝试是使用sleep函数,但这个解决方案将冻结整个应用程序。另一种解决方案是实现mutlithreads,并将sleep()与负责获取数据的线程一起使用,并将其存储在全局变量中,然后从另一个线程访问该变量。在这种解决方案中,线程之间的同步可能会遇到困难。为了克服这个问题,我将把收到的数据写在txt文件中,然后从另一个线程中读取我的问题是进行这个琐碎实验的正确方法是什么?如果答案有一些C++伪代码,我将不胜感激。


编辑:

我的解决方法如下,对于主端(客户端),

Master masterObj
int main()
{
    masterObj.initialize();
    masterObj.connect();
    while( masterObj.isConnected() == true ){
        get currentTime and data; // currentTime here is sendTime
        datagram = currentTime + data;
        masterObj.send( datagram );
    }
}

对于从端(服务器),伪代码为

Slave  slaveObj
int main()
{
    slaveObj.initialize();
    slaveObj.connect();
    slaveObj.slaveThreadInit();
    while( slaveObj.isConnected() == true ){
        slaveObj.getData();
    }
}
Slave::recieve()
{
    get currentTime and call it recievedTime
    get datagram from Master;
    this->slaveThread( recievedTime + datagram );   
}
Slave::slaveThread( info )
{
    sleep( 1 msec );
    info = recievedTime + datagram ;
    get time delay;
        time delay = sendTime - recievedTime;
    extract data from datagram; 
    insert data and time delay in txt file ( call it txtSlaveData);
}
Slave::getData()
{
    read from txtSlaveData;
}

正如你所看到的,我使用的是一个独立的线程,在它里面,我使用sleep()。我不确定这种方法是否适用。

模拟将UDP数据报从一台计算机发送到另一台计算机的一种简单方法是通过环回接口将数据报发送到同一台计算机上的另一个或同一进程。除了延迟之外,它的功能将与实际情况完全相同。

您可以在发送或接收时模拟延迟。一旦你以一种方式实现了它,另一种方式就应该微不足道了。我认为推迟派遣方是更自然的选择。这里有一种解决更普遍的网络延迟模拟问题的方法。关于只发送一个数据报的琐碎实验,请参阅最后一段。

如果你选择延迟发送,你可以做的是,而不是发送,将数据报和它应该发送的时间一起存储在队列中(目标=现在+延迟)。

然后,在另一个线程中,等待数据报可用,然后休眠max(target-now,0)。睡眠后,发送数据报,然后继续下一个数据报。如果队列为空,请等待。

若要模拟抖动,请随机化延迟。要让抖动模拟以非顺序发送数据报,请使用按目标发送时间排序的优先级队列。

请记住同步对队列的访问。

对于单个数据报,您可以做得简单得多。只需启动一个新线程,为延迟休眠,发送并结束线程。无需同步。这是一个c++代码:

std::thread([]{
    std::this_thread::sleep_for(delay);
    send("foo");
}).detach();