Come posso calcolare quanti indirizzi IP ci sono in un determinato intervallo?

3

Mi chiedo se esiste una formula per calcolare la quantità di indirizzi IP in un determinato intervallo.

Ho un sistema che accetta un singolo indirizzo IP o un indirizzo IP iniziale e finale:

  • Un singolo potrebbe essere: 145.16.23.241
  • Un intervallo potrebbe essere: 145.16.23.122 - 145.16.23.144

Le persone che inseriscono questi dati non sono tecnici, né ricevono questi dettagli da tecnici, quindi suggerire di usare la notazione CIDR non è una risposta per me.

Voglio essere in grado di evidenziare che quando si entra in un intervallo come: 122.100.10.12 - 128.10.200.140 potrebbe non essere effettivamente un intervallo e piuttosto 2 indirizzi IP singolari poiché tale intervallo comprenderebbe x (numero elevato di) IP indirizzi.

C'è una formula di base che mi aiuti a evidenziarlo?

    
posta Jarede 29.05.2014 - 13:54
fonte

4 risposte

20

Gli indirizzi IP sono un numero intero a 32 bit che tipicamente esprimiamo come quattro ottetti a scopi umani. È possibile ottenere il numero di indirizzi in un intervallo trasformando entrambi nelle loro rappresentazioni di numeri interi a 32 bit e sottrazione.

    
risposta data 29.05.2014 - 15:02
fonte
11

Non sarà possibile ottenere un conteggio preciso senza alcuna informazione sul fatto che l'intervallo attraversi i limiti della sottorete e quali siano quelle sottoreti. Ad esempio, 10.10.7.0 - 10.10.8.255 è un intervallo contiguo di 512 indirizzi nel contesto di /16 . Se l'intervallo copre due blocchi /24 , il conteggio è 508 perché ogni blocco ha un indirizzo di rete e un indirizzo di trasmissione.

Assicurarsi che il limite superiore immesso sia maggiore o uguale al limite inferiore e che la sottrazione per misurare la distanza tra di essi sia utile per un rapido controllo di integrità. Dovrai decidere quale sia una differenza ragionevole prima di alzare la bandiera rossa.

Dopo aver convertito ogni ottetto in un numero intero a 8 bit, la conversione di molti di essi in un singolo numero intero a 32 bit dipende dal seguente:

(octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4
    
risposta data 29.05.2014 - 15:49
fonte
0

Devi essere chiaro come stai definendo questi intervalli. Forse intendevi tutti gli indirizzi le cui rappresentazioni a 32 bit rientrano tra i due numeri, e questo è quello che le altre risposte sembrano assumere. Ad esempio, 1.0.0.0 - 1.0.2.0 include tutti i seguenti indirizzi IP:

1.0.0.0 - 1.0.0.255
1.0.1.0 - 1.0.1.255
1.0.2.0

Tuttavia, quando ho letto per la prima volta la tua domanda, quello che pensavo intendessi fosse definire intervalli separati per ogni byte, nel qual caso l'intervallo 1.0.0.0 - 1.0.2.0 significherebbe solo i seguenti tre indirizzi:

1.0.0.0
1.0.1.0
1.0.2.0

Per il primo caso, come altri hanno affermato che la risposta corretta è

abs(ip2-ip1)+1 

Ma nel secondo caso, la risposta corretta sarebbe

product(abs(ip2[i] - ip1[i]) + 1) 

dove [i] indica il numero di byte di quell'IP e il prodotto viene preso sui quattro byte.

Assicurati che sia chiaro ai tuoi utenti quale di questi intendi.

    
risposta data 30.05.2014 - 00:57
fonte
0

Si noti che per convertire correttamente gli indirizzi IP puntati in un numero a 32 bit e fare cose di math su di essi in modo affidabile, è necessario utilizzare un tipo intero senza segno . Se i soli tipi interi a tua disposizione sono firmati, allora ...

Un altro modo per calcolarlo è questo: a partire dal primo ottetto che è diverso, moltiplicare la differenza di ogni ottetto da quel punto in avanti con i seguenti numeri, e quindi aggiungere queste differenze insieme:

1: 16777216
2: 65536
3: 256
4: 1

Ad esempio, utilizzando il tuo intervallo 122.100.10.12 - 128.10.200.140:

  128  10   200  140
- 122  100   10   12
=   6 -90   190  128

= 16777216 * 6 
+ 65536 * -90
+ 256 * 190
+ 1 * 128
= 94813824

Questo è lo stesso valore con cui avresti ottenuto l'intera conversione di

0x800AC88C = 2148190348
0x7A640A0C = 2053376524

e quindi sottrarre.

Inoltre, puoi anche eseguire la stessa operazione in questo modo:

((a[0] - b[0]) * 256 + a[1] - b[1]) * 256 + a[2] - b[2]) * 256 + a[3] - b[3]

Questo è facilmente suscettibile a un reduce che collassa ripetutamente ogni coppia successiva di valori.

    
risposta data 29.05.2014 - 23:58
fonte

Leggi altre domande sui tag