It appears to be common practice to not use the first address in a subnet, that is the IP 192.168.0.0/24
, or a more exotic example would be 172.20.20.64/29
.
The ipcalc
tool I frequently use follows the same practice:
$ ipcalc -n -b 172.20.20.64/29
Address: 172.20.20.64
Netmask: 255.255.255.248 = 29
Wildcard: 0.0.0.7
=>
Network: 172.20.20.64/29
HostMin: 172.20.20.65
HostMax: 172.20.20.70
Broadcast: 172.20.20.71
Hosts/Net: 6 Class B, Private Internet
But why is that HostMin
is not simply 64
in this case? The 64
address is a valid address, right? And whatever the answer, does the same apply to IPv6?
Perhaps slightly related: it also appears possible to use a TCP port 0 and an UDP port 0. Are these valid or used anywhere?
I know this is an old thread but I was researching this myself and I didn't stop at "host zero isn't used because it is the network number" because I couldn't see why that mattered. Even if it is the network number it shouldn't stop it being used as a valid address as the mechanism to determine network number (ANDing the netmask) will still work with it to determine the network number.
Not using the all ones host address because it coincides with the broadcast address I was comfortable with, as it is a valid destination address already so when used it would be impossible to distinguish between those.
The more fully explained reason we can't use host zero is that it is also a broadcast address - although RFC1812 section 4.2.3.1 states that a router receiving packets addressed to it "SHOULD silently discard" them (their emphasis - not mine). However the same paragraph does allow those packets to be treated as a broadcast.
Here is the full sub-section
Because the first address in a subnet refers to the subnet itself and is used for routing purposes.
As Wesley, Chopper3, and Willy pointed out modern convention uses the first address (all zeroes host number) for the subnet and the last address (all ones host number) as the broadcast address.
For historical reasons many OSes treat the first address as a broadcast. For example, pinging x.x.x.0 from OS X, Linux, and Solaris on my local (/24) network gets responses. Windows doesn't let you ping the first address by default but you might be able to enable it using the SetIPUseZeroBroadcast WMI method. I wonder if you could get away with using .0 as a host address on an all-Windows network.
Early in the internet days, x.x.x.0 was used as the broadcast address for a network. That was later changed to x.x.x.255. I remember that there were options on SunOS to configure the broadcast either as .0 or .255 during that period. So I guess for safety, .0 and .255 have been always a reserved numbers.
The first number in a subnet is the network's address itself. so 192.168.0.0/24 is the number that is used to refer to that subnet. Of course, the last address is the broadcast address where broadcasts are sent to and then pushed down to all clients on that subnet. In IP networking, you always remove 2 from the broadcast address to find the total amount of addressable IP addresses. 192.168.0.0/24 has a broadcast of 192.168.0.255 and thus 253 addressable addresses. 192.168.0.0/26 has a broadcast of 192.168.0.64 and thus 62 addressable addresses.
(Chop and Willy beat me to it -- but I'm grumpy and don't feel like deleting my post. =) )
Host number 0 in every subnet is reserved primarily because it used to be a broadcast address.
The RFC says, paraphrased, should discard, but alternatively, use as broadcast, but also usable as a host number via some non-default option.
Now, octet 0 as in x.y.z.0 may very well be a perfectly valid non-zero CIDR host number, but in the past it would very occasionally have problems at isolated sites due to implementation bugs (possibly leftover class-full code) in the site's HW or SW.
Today, octet 0 works well enough to be assigned by ISPs and cloud platforms, though no doubt some services deliberately don't hand it out based on past experience.
Interestingly enough, all it would take to support host 0 at any specific site is support by the exact devices present on the local subnet ... once the packet is aggregated upstream it wouldn't even be possible to know that it actually had (CIDR) host number 0 in use. The WAN would not care at all.
Finally, if the local subnet's hosts use the all-1's host number for broadcasts and don't special-case the all-0's host number, you could leave the router in default and have a local-only "hidden" station. That might be useful for protecting embedded systems, like hack-prone cheap consumer routers...
x.x.x.0 (or first address on a subnet) is the network address and is used to identify which traffic is on the same subnet, and which needs to be routed to a different network.
There are two reserved IP addresses per CIDR block. One is "the" network number and it will be even(bit 0) off. The other is the directed braodcast (subnet broadcast) and it will have the host portion of the network set to all ones (odd number). Here is an example from my subnet calculator: