如何识别接入点中UDP数据包的来源?

时间:2015-04-22 15:13:52

标签: c sockets network-programming qos

我正在创建一种接入点。

我根据默认的服务质量(QoS)类,从我的机器中捕获所有类型的所有数据包,以便在转发之前对它们进行优先级排序。

通过使用socket参数调用ETH_P_ALL,我可以获得任何协议类型的所有传入数据包:

    if ((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == ERROR)  {
        perror("socket");
        exit(1);
    }

通过使用ethhdriphdrtcphdrudphdr结构,我无法检索有关哪个应用程序发送每个数据包的信息。

但是,Voip和SNMP都使用UDP,我不知道这两个中的哪一个发送给我UDP包。

我想知道哪些应用程序正在发送UDP数据包,因此我可能会遵循QoS类并将其他数据包(例如会话语音)转发给其他人(例如电子邮件)。

为了识别协议,我应该使用TCP和UDP端口号列表吗?

1 个答案:

答案 0 :(得分:2)

您无法确定确定哪个应用程序发送了数据包 - 只有发件人自己知道这一点。如果我理解正确,您想要的是检测正在使用的协议。那么你有两种可能性:

  1. 假设应用程序基于TCP / UDP数据包上设置的目标端口 - list of TCP/UDP port numbers或您的/etc/services(如果您在Linux / Unix / OSX /等上) )可能有帮助;

  2. 分析数据包内容并将其与已知协议签名进行匹配(如IDS所做的那样 - 例如,请参阅Snort rules)。请注意,您可能需要某种形式的conntrack才能使其可靠地工作;