2012-02-14 86 views
1

在查找多播和廣播數據包的數據包解碼之後,我在創建決策邏輯時遇到了一些困難。從我已閱讀並使用Wireshark的觀察(打量了一番它的來源),這裏是我發現:解碼數據包 - 廣播或多播

廣播:

  • 特殊情況下爲0.0.0.0或相當DST地址255.255 .255.255
  • 本地廣播,其中IG和LG爲DST地址位設置爲1
  • 我不知道什麼子網的數據包是從,所以我不能確定,由於定製子網特定廣播地址。
  • 我應該測試,看看目標地址可能是一個合法的廣播地址(即猜測CIDR?)

這是足夠的?

多點傳送:

  • IG位設置爲1,並且LG位設爲發往224 0
  • DST地址 - 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; 
} 

有什麼想法?

+0

您對僅使用IPv4的解決方案感興趣或對IPv6感興趣嗎? – sarnold 2012-02-14 22:28:28

+0

@sarnold我目前只在尋找IPv4解決方案。我只是在玩組播代碼 - 稍後會更新。 – mcdoomington 2012-02-14 22:35:11

回答

0

在IPv4的情況下,爲了檢查組播,第一個字節的測試應該足夠了。

(224 <= first octect <= 239) 

對於廣播,我不明白你的代碼中的else if()循環。第一個if()循環應該給出預期的結果。

+0

對於其他人來說,答案是最重要的 - 這應該解決已知的多播和廣播問題。需要注意的是,在不知道子網的情況下,您無法知道其他廣播地址 - 您可以根據標準網絡地址類別進行猜測,但最終只能猜測。 – mcdoomington 2012-02-17 20:28:13