如何优化用于数据包转发的 UDP 套接字

问题描述 投票:0回答:1

我正在通过使用 UDP 套接字进行数据包转发。该设置基于将数据包发送到 UDP 套接字的流量生成器,UDP 套接字然后简单地切换源地址和目标地址并将数据包发送回数据包的来源(流量生成器),然后一些网络指标记录。我将 XL710 用于 40GbE,环境在计算机上,它通过内部虚拟网络发送数据

我已经尝试为此创建最简单的应用程序,它能够在流量生成器每秒向 UDP 套接字发送大约

350 000
数据包时向流量生成器发送回大约
5 000 000
数据包/秒。因此,似乎应该有一些改进的余地。

这是用于回显数据包的 UDP 套接字代码。

#define PORT 12345
#define IP_ADDR "192.168.0.32"

int main(int argc, char *argv[]){
    int socket_fd;
    struct sockaddr_in address, send_address;
    char packet_buffert[2000] = {0};

    if ((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = inet_addr(IP_ADDR);

    if(bind(socket_fd, (struct sockaddr*)&address, sizeof(address))<0){
        return -1;
    }

    socklen_t s = sizeof(send_address);

    while(1){

        if ((n = recvfrom (socket_fd, packet_buffert, sizeof packet_buffert, 0,(struct sockaddr*)&traffic_gen_addr, (socklen_t*)&s)) < 0)
        {
             printf(" %s\n ", strerror(errno));
             return EXIT_FAILURE;
        } 

        if (sendto (socket_fd, packet_buffert, n, 0, (struct sockaddr*)&traffic_gen_addr, (socklen_t)sizeof(traffic_gen_addr)) < 0)
        {
            printf("%s \n", strerror(errno));
            return EXIT_FAILURE;
        }
    } 
} 

到目前为止,我的想法是是否以及如何完成批处理数据包,但到目前为止我还无法正确实施。

可以对 UDP 套接字进行哪些更改以提高或优化吞吐量,从而实现更高的数据包/秒?这个实现是否遗漏了一些可以提高网络性能的重要概念?

networking sockets udp
1个回答
0
投票

为了使您的程序每秒发送更多数据包,您需要使用较小的数据包大小。例如,如果您发送长度大于 500 的数据包,您将产生比每秒数据包更多的流量。

下面的例子显示了发送数据长度为 0 的数据包。

wireshark capture

另外,您可以尝试使用 pthreads 让您的 CPU 线程 fork 生成数据包的函数。这将使用你的大量处理器!

© www.soinside.com 2019 - 2024. All rights reserved.