thoughts/net/subnets.md

2.9 KiB

IP Addresses, Subnet Masks, and CIDR.

Disclaimer: Most, if not all, information in this article applies to both IPv4 and IPv6. However, an IPv6 address is 4 times the size of an IPv4 address, which is a lot more math that the author isn't willing to do. Due to this, all examples will only be in the context of IPv4.


Cloudflare owns the number 16843009. At least, as far as networks are concerned they do. You'd be more likely to recognize it in the form 1.1.1.1. So how does the number 16843009 relate to the IP address 1.1.1.1? Let's start with what an IP address really is.

An IPv4 address is normally expressed as A.B.C.D, where each letter represents an octet in decimal form. Since there are 4 octets, an IPv4 address is exactly 32-bits long. If you take the IP address 10.42.7.19 and write it in binary form, you get 00001010.00101010.00000111.00010011. This is referred to as a bit string, which you'll notice contains exactly 32 bits as expected. Since an octet will always be 8 bits, the dot separators aren't needed in a bit string. This means that the bit string should really be written as 00001010001010100000011100010011. These bit strings can also be referred to as a 32-bit integer. In other words, they are whole numbers that take up exactly 32 bits of memory. The example bit string in this case could be written in decimal form as the number 170526483. We now have 3 ways to describe the same IP address:

  • 10.42.7.19
  • 00001010001010100000011100010011
  • 170526483

You'll likely never need to write an IP address in any other form besides the first one (commonly referred to as dotted decimal form), so why is this important? For computers, it is fast and straight-forward to operate on IP addresses when they are bit strings. The most common operations are determining if an IP address is within a given range of IP addresses, finding the start of the range, and finding the end of the range. To do this, they use a special tool known as a subnet mask.

A subnet mask is a 32-bit string, similar to an IPv4 address, with the added constraint that it must be an initial series of 1 bits immediately followed by a series of 0 bits. This means that as soon as the first 0 bit appears, all remaining bits must be 0. The following bit string is a valid subnet mask: 11111111111111111111111100000000. If you split up the 32 bits into 4 groups of octets, and convert those groups to decimal form, you get 255, 255, 255, and 0. We would write this as 255.255.255.0. Another way of writing a subnet mask is CIDR notation, which is of the form /N, where N represents the number of 1 bits at the beginning of the mask. This means that writing 10.42.7.19/24 indicates you have the IP address 10.42.7.19 with the subnet mask of 11111111111111111111111100000000 (or 255.255.255.0). You'll notice the mask has 24 1 bits, the value of N.

How does a computer apply a subnet mask to an IP address?