how calculate the number of ip addresses in a range?

Kimmo Paasiala kpaasial at gmail.com
Fri Aug 9 23:13:19 UTC 2013


On Sat, Aug 10, 2013 at 2:07 AM, Kimmo Paasiala <kpaasial at gmail.com> wrote:
> On Sat, Aug 10, 2013 at 1:44 AM, Peter Wemm <peter at wemm.org> wrote:
>> On Fri, Aug 9, 2013 at 9:34 AM, Fleuriot Damien <ml at my.gd> wrote:
>>>
>>> On Aug 8, 2013, at 10:27 AM, Peter Wemm <peter at wemm.org> wrote:
>>>
>>>> On Thu, Aug 8, 2013 at 12:04 AM, s m <sam.gh1986 at gmail.com> wrote:
>>>>> hello guys,
>>>>>
>>>>> i have a question about ip addresses. i know my question is not related to
>>>>> freebsd but i googled a lot and found nothing useful and don't know where i
>>>>> should ask my question.
>>>>>
>>>>> i want to know how can i calculate the number of ip addresses in a range?
>>>>> for example if i have 192.0.0.1 192.100.255.254 with mask 8, how many ip
>>>>> addresses are available in this range? is there any formula to calculate
>>>>> the number of ip addresses for any range?
>>>>>
>>>>> i'm confusing about it. please help me to clear my mind.
>>>>> thanks in advance,
>>>>
>>>> My immediate reaction is.. is this a homework / classwork / assignment?
>>>>
>>>> Anyway, you can think of it by converting your start and end addresses
>>>> to an integer.  Over simplified:
>>>>
>>>> $ cat homework.c
>>>> main()
>>>> {
>>>> int start =  (192 << 24) | (0 << 16) | (0 << 8) | 1;
>>>> int end =  (192 << 24) | (100 << 16) | (255 << 8) | 254;
>>>> printf("start %d end %d range %d\n", start, end, (end - start) + 1);
>>>> }
>>>> $ ./homework
>>>> start -1073741823 end -1067122690 range 6619134
>>>>
>>>> The +1 is correcting for base zero. 192.0.0.1 - 192.0.0.2 is two
>>>> usable addresses.
>>>>
>>>> I'm not sure what you want to do with the mask of 8.
>>>>
>>>> You can also do it with ntohl(inet_addr("address")) as well and a
>>>> multitude of other ways.
>>>
>>>
>>> Hold on a second, why would you correct the base zero ?
>>> It can be a valid IP address.
>>
>> There is one usable address in a range of 10.0.0.1 - 10.0.0.1.
>> Converting to an integer and subtracting would be zero.  Hence +1.
>>
>> --
>
> To elaborate on this, for every subnet regardless of the address/mask
> combination there are two unusable addresses: The first address aka
> the "network address" and the last address aka the "broadcast
> address". There may be usable address in between the two that end in
> one of more zeros but those addresses are still valid. Some operating
> systems got this horribly wrong and marked any address ending with a
> single zero as invalid, windows 2000 was one of them.
>
> -Kimmo

Of course I should have mentioned that there are special cases to
address/mask combinations, /31 and /32 masks have to be treated
specially or there are no usable addresses at all.

-Kimmo


More information about the freebsd-net mailing list