Ipv4

對 IPv4 地址進行排序

  • January 12, 2011

所以我在排序 IPv4 地址時遇到了難題,不知道在一些晦澀難懂的網路文件中是否有固定規則。我是否只對原始地址進行直接排序(例如將 IP 地址轉換為 32 位數字然後排序),我是否通過一些數學公式將 CIDR 考慮在內,我是否僅通過 CIDR 排序(好像我’ m 比較網路大小而不是直接比較地址)?

即,正常的數學,我們會做一些類似-1 < 0 < 1表示優先順序的事情。假設 , 10.1.0.0/16, 172.16.0.0/12,192.168.1.0/24192.168.1.42, 優先順序是什麼?

上次我這樣做時,我大致是這樣實現的(為了清楚起見,省略了驗證和錯誤檢查):

(addressA, maskA) = split('/', a);
(addressB, maskB) = split('/', b);
ipCmp = inet_aton(addressB) - inet_aton(addressA);
if (ipCmp > 0) {
   return -1;
} else if (ipCmp < 0) {
   return 1;
} else {
   if (maskA < maskB) {
       return 1;
   } else if (maskA > maskB) {
       return -1;
   } else {
       return 0;
   }
}

給定輸入數組{ 10.0.1.0/24, 10.0.0.0/24, 10.0.0.0/8 },這應該產生{ 10.0.0.0/8, 10.0.0.0/24, 10.0.1.0/24 }.

編輯補充:我知道沒有“普遍接受”的方法,以上只是對我必須完成的任務最有用的方法。使用 inet_aton 的原因是 IP 地址只是格式稍有不同的整數。將它們作為整數進行比較,您將獲得有用的排序。

引用自:https://serverfault.com/questions/221510