解码数据包 - 广播或多播

时间:2012-02-14 22:07:37

标签: c ip ethernet packet-sniffers

在查找多播和广播数据包的数据包解码后,我在创建决策逻辑时遇到了一些困难。从我所看到的和使用wireshark观察(并查看它的一些来源)这里是我发现的:

广播:

  • 0.0.0.0的特殊情况,或者更确切地说是dst addr 255.255.255.255
  • 本地广播,其中dst addr的IG和LG位设置为1
  • 我不知道数据包来自哪个子网,因此我无法确定由于自定义子网而导致的特定广播地址。
  • 我应该测试并查看dest addr是否是合法的广播地址(即猜猜cidr?)

这还够吗?

多点传送:

  • IG位设置为1,LG位设置为0
  • dst地址发往224 - 239子网(第一个八位字节)

到目前为止我有什么?

/*
* Is packet destined for a multicast address?
*/
int is_multicast(CONNECTION temp)
{

char *save;
save = strtok(inet_ntoa(temp.ip_dst), ".");

int firstOct = 0;
firstOct = atoi(save);

if((temp.ether_dhost[0] == 1 ) && 
   (temp.ether_dhost[1] == 0 ) &&
   ((firstOct >= 224) && 
   (firstOct <= 239))) 
{
    return 1;

}

return 0;
}

/*
* Is packet destined for a broadcast address?
*/
int is_broadcast(CONNECTION temp)
{

    if ((temp.ether_dhost[0] == 0xFF) &&
        (temp.ether_dhost[1] == 0xFF) &&
        (temp.ether_dhost[2] == 0xFF) &&
        (temp.ether_dhost[3] == 0xFF) &&
        (temp.ether_dhost[4] == 0xFF) &&
        (temp.ether_dhost[5] == 0xFF)) {
        return 1;   // DHCP or ARP 
    } else if ((temp.ether_dhost[0] == 0xFF) &&
           (temp.ether_dhost[1] == 0xFF))
        && (temp.ether_dhost[2] != 0xFF) {
        return 1;   // Other local broadcast
    }

    return 0;
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在IPv4的情况下,为了检查多播,第一个octect的测试应该是足够的。

(224 <= first octect <= 239)

对于广播,我不理解代码中的else if()循环。第一个if()循环应该给出期望的结果。