丢失的数据包仅在第一次运行中发生

时间:2019-04-30 07:41:46

标签: c++ linux sockets networking multicast

我正在努力改善正在庞大网络上运行的多播应用程序的性能(以减少其数据包丢失)

我的实验表明,在应用程序的第一次运行中,会丢失一些数据包。但是,当我在上一次运行后再次运行该应用程序时(有时也会稍有延迟),则不会丢失数据包。尽管经过很长的延迟(例如20分钟左右)后重新运行应用程序时,我仍然看到数据包丢失。

当我检查它们的时间戳时,我看到丢失的数据包主要是开始时发送的数据包。因此,看来交换机或路由器需要一些热身!之类的(我不知道怎么称呼这种现象)。

我检查了tcpdump结果,并且接收方应用程序接收到的数据包数量与网络购物车接收到的数据包数量完全相同。

我已经尝试了以下技巧: 1-更改进程在不同CPU内核和调度策略上的亲和力 2-更改套接字描述符的优先级

更改套接字描述符的优先级已经使它变得更好(减少了丢失的数据包数量),但是在将优先级设置为高之后,再次有一些丢失的数据包)

// For example
MulticastSender multicast_sender;
multicast_sender.init();

// Here I need a function in order to find out the switch is already warmed up or not


while (some condition)
{
    ////

    multicast_sender.send(something);

    ////
}

我想知道是否没有任何方法可以添加一些代码来确定交换机(或路由器)是否已经预热!足够吗?

1 个答案:

答案 0 :(得分:1)

好吧,如果您的交换机和路由器是动态多播网络的一部分(例如,基于PIMIGMP),则它们确实需要进行一定的路径设置(取决于m的类型) -cast网络的各种过程可能会影响发送者和接收者之间的路径设置,并且您无法控制m-cast网络的配置(以便您可以对其进行修复或设置静态路径),因此没有太多你可以的。

即使您具有控制访问权限,也并非所有导致m-cast数据包丢失的事件都可以被“修复”(其中某些事件是m-casting固有的)。例如,就像您的M-cast在PIM-sparse模式下运行一样,那么从共享树到最短树的切换可能会造成损失。当交会点(在稀疏模式m-cast上找到RP)完成发送方的注册过程时,不可避免地会丢失某些数据包,等等。

与您的网络管理员联系-查看他们是否可以帮助您在发送方(并非总是可能)和接收方之间建立“静态”路径,或者至少使数据包丢失最小化(在m中有某些调整) -广播)。

从应用程序的角度来看:如果您还编写接收方的内容,那么最好采用某种反馈机制来指示丢包和内容可能的重传。