丢包只发生在第一个 运行

lost packets only occur in the first run

我正在尝试提高在大型网络上运行的多播应用程序的性能(以减少其数据包丢失)

我的实验表明,在应用程序的第一个 运行 中,有一些丢失的数据包。但是当我 运行 在前一个 运行 之后再次应用时(有时也有一点延迟)没有丢包。虽然当我在长时间延迟(例如 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);

    ////
}

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

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

即使您确实拥有控制访问权限,也并非所有导致 m-cast 数据包丢失的事件都是 "fixed"(其中一些是 m-cast 固有的)。例如,如果您的 m-cast 在 PIM-sparse 模式下是 运行,那么从共享树切换到最短树可能会导致丢失。当集合点(RP 在稀疏模式 m-casts 上找到)完成发送者的注册过程时,一些数据包丢失是不可避免的,等等

请咨询您的网络管理员 - 看看他们是否可以帮助您在发送方(并非总是可行)和接收方之间设置 "static" 路径,或者至少将数据包丢失降至最低(有m-casting 中的某些调整)。

从应用的角度来看:如果您还编写接收方的部分 - 那么最好采用一些反馈机制来指示数据包丢失和可能的内容重传。