Hi! A lot of people ask me about how to subnet easily. I hope that this guide will be of some help to you. It sure has been — and still is — to me

Good luck, and as always, feel free to email me if you were to have any questions…

I added a printable version of this guide that you can download here It is in Word2000 format… enjoy

Thanks to my buddy Dave W. who pointed out 2 typos. It should all be correct now! (12/20/00)

**1. What is an IP Address?**

An IP address is made of 4 Octets, or 32 bits. It is usually represented in dotted decimal format like this: 131.107.2.205. Each number represents an octet. An octet is a group of 8 bits. Since we have 4 octets in an IP Address, there are 8*4=32 bits in an IP Address.

Computers do not understand dotted decimal notation, as they only function in binary. All computers understand is 1 and 0. Therefore, we must find a way to transfer an IP Address from dotted decimal format to binary. We do this octet by octet.

Each bit in an octet has an associated decimal value:

Bit 1 2 3 4 5 6 7 8

Bit value 128 64 32 16 8 4 2 1

So you can follow, here is a decimal to binary calculator. However, I advise you to do the math at first to better understand the concepts…

**Insert Number:**

Let’s take an example. I have an IP address of 131.107.2.4. What is that in Binary?

Let’s do this octet by octet:

131:

Bit Value 128 64 32 16 8 4 2 1

Binary 1 0 0 0 0 0 1 1

Column with a “1” in binary mean that we count the corresponding bit value. If you add up all the bit values marked with a one, you get 128+2+1=131.

107:

Bit Value 128 64 32 16 8 4 2 1

Binary 0 1 1 0 1 0 1 1

Column with a “1” in binary mean that we count the corresponding bit value. If you add up all the bit values marked with a one, you get 64+32+8+2+1=107

2:

Bit Value 128 64 32 16 8 4 2 1

Binary 0 0 0 0 0 0 1 0

Column with a “1” in binary mean that we count the corresponding bit value. If you add up all the bit values marked with a one, you get 2

4:

Bit Value 128 64 32 16 8 4 2 1

Binary 0 0 0 0 0 1 0 0

Column with a “1” in binary mean that we count the corresponding bit value. If you add up all the bit values marked with a one, you get 4

Now we know that another way of writing our example IP address of 131.107.2.4 is:

10000011.01101011.00000010.00000100

IP Addresses are made of two distinct parts: the Network ID and the Host ID. When you try to ping an IP address, IP at Layer 3 needs to determine whether the target IP address is local or remote to your subnet. To explain this, I like to ask my students the following question:

“Let’s say I live on Maple Tree Lane. You say that you also live on Maple Tree Lane. Are we neighbors? Well, we may be, or we may not be. We do not have enough information to answer that question. Specifically, we do not know if we live in the same town. If we do live in the same town, and our street addresses are similar, then we are neighbors. If we do not live in the same town, it does not matter whether our street addresses are similar or not: we are not neighbors.”

The same applies to IP addressing. Before I can find out what your Host ID is – i.e. your street address – I have to worry about what your Network ID is – i.e. your town.

So how does IP know what the Host ID and Network IDs are? That is the role of the Subnet Mask.

Please note that neither the network ID, the host ID nor the subnet bit can be all 0s or all ones. More to come about this later…

**2. What is a Subnet Mask?**

A Subnet Mask is used to enable IP at Layer 3 to find out whether the target IP address you are trying to contact is local or remote to your network. That is all it does. It helps you determine which part of an IP Address is the Network ID, and which is the Host ID. So how does it do that?

We have all seen a Subnet Mask before. It usually looks something like this:

255.255.255.0

This subnet mask is obviously displayed in dotted decimal format. As we already know, however, computers do not understand this format. They only understand binary. So let’s apply what we know about binary to our subnet mask:

255

Bit Value 128 64 32 16 8 4 2 1

Binary 1 1 1 1 1 1 1 1

Column with a “1” in binary mean that we count the corresponding bit value. If you add up all the bit values marked with a one, you get 128+64+32+16+8+4+2+1=255

So, 255 is “all ones”, as you may have heard before.

0:

Bit Value 128 64 32 16 8 4 2 1

Binary 0 0 0 0 0 0 0 0

Column with a “1” in binary mean that we count the corresponding bit value. If you add up all the bit values marked with a one, you get 0. So, 0 is “all zeros”, as you may have heard before.

In other words, our 255.255.255.0 subnet masks in binary looks like this:

11111111.11111111.11111111.00000000

Note that a subnet mask is also a 32 bit, 4 octet entity that matches the structure of our IP addresses…

If I were to superimpose the IP address and subnet mask we have translated so far, I would get this:

131.107.2.4 10000011. 01101011. 00000010. 00000100

255.255.255.0 11111111. 11111111. 11111111. 00000000

I highlighted the Network bits in Red, and the Host bits in Blue. Notice anything? All the network bits are the bits that had a value of “1” in the subnet mask, and all the host bits are the bits that had a value of “0” in the subnet mask. Easy, isn’t it? In our example, the Network ID is 131.107.2, and the host ID is 4. If I change the subnet mask to 255.255.0.0, what happens? Well, let’s apply the same logic:

131.107.2.4 10000011. 01101011. 00000010 00000100

255.255.0.0 11111111. 11111111. 00000000 00000000

What happens now? My network ID is now 131.107 and my host ID is 2.4! That is why an IP address on its own cannot exist! That is why a host on a network needs at least an IP address AND a subnet mask!

Let’s say that I tell you that I have 2 IP addresses:

131.107.2.4 and 131.107.5.6

Are they local to each other, or remote?

You cannot answer that question, because it is incomplete! I need to give you the subnet mask as well! Let’s see why…

Let’s say that the subnet mask is 255.255.255.0. Then we have:

131.107.2.4 10000011. 01101011. 00000010. 00000100

131.107.5.6 10000011. 01101011. 00000101. 00000110

255.255.255.0 11111111. 11111111. 11111111. 00000000

Do the Network IDs match? No! Look at the third octect:

0 0 0 0 0 0 1 0

0 0 0 0 0 1 0 1

If the network IDs do not match, then the two IP addresses are remote from each other. They are on different subnets, and you will need a router to go from one to the other.

Let’s take the same example with a different subnet mask of 255.255.0.0:

131.107.2.4 10000011. 01101011. 00000010. 00000100

131.107.5.6 10000011. 01101011. 00000101. 00000110

255.255.0.0 11111111. 11111111. 00000000. 00000000

Do the Network IDs match now? Yes!

If the network IDs match, then the two IP addresses will be on the same network. You do not need a router to go from one to the other in this scenario.

Let’s sum this up: we have seen how only having an IP address is not sufficient, and how the same two IP addresses can be either remote or local to each other depending on which subnet mask you are using. This is at the basis of IP troubleshooting.

**3. What are IP classes?**

You may have heard of the different classes for IP addresses, namely, class A, B and C. How does that work? Let’s look at the following table:

Class A 1-127* 0xxxxxxx.

Class B 128-191 10xxxxxx.

Class C 192-223 110xxxxx.

*127 is part of the class A range, but you cannot assign any 127.x.x.x IP addresses to hosts as the entire range is reserved by InterNIC for the loop back address…

What does this mean? When talking about a Class of IP addresses, you only look at the first octet to determine what class this IP address belongs to.

For class A, InterNIC decided that the 1st octet would start with a bit value of 0. Therefore, the lowest binary of the 1st octet is 0000001, and the highest is 01111111 (in decimal, that would be from 1 to 127)

For class B, InterNIC decided that the 1st octet would start with a bit value of 10.

Therefore, the lowest binary of the 1st octet is 1000000, and the highest is 10111111 (in decimal, that would be from 128 to 191)

For class C, InterNIC decided that the 1st octet would start with a bit value of 110.

Therefore, the lowest binary of the 1st octet is 1100000, and the highest is 11011111 (in decimal, that would be from 192 to 223)

There are other classes, D and E, but they are not used right now and are illegal on the Internet.

Also, note that you can use any subnet mask classes with any IP address classes. Subnet mask classes are as follows:

Class A 255.0.0.0

Class B 255.255.0.0

Class C 255.255.255.0

In other words, it is totally possible to have a Class B IP address and a class C subnet mask… hang on… isn’t that what we have been taking as an example all along? Remember our 131.107.2.4 w/ a subnet mask of 255.255.255.0?

**4. What is subnetting?**

Subnetting is the action of taking an IP range where all IP addresses are local to each other and dividing it into different ranges – or subnets – where IP addresses from one range will be remote from any other IP addresses from any other range.

If you want to find out how many hosts you have in an IP range, first you need to determine how many host bits there are. Let’s take our previous example of 131.107.2.4 and 255.255.255.0. We already established previously that the Network ID was 131.107.2 and the Host ID was 4. In other words, we have 3 octets for the Network ID and one octet – or 8 bits – for the Host ID. Now that you have determined the amount of host bits you had, apply that number to the following formula:

(2^N)-2)=number of hosts, where N is your number of host bits

That gives us: ((2^8)-2)=254 hosts.

That means that in our example, we have the 131.107.2.x network, which contains 254 possible IP addresses, all local to each other.

What if I chose a class A subnet mask? I would then have:

(2^24)-2)=16,777,214 valid IP addresses in that range!

What if I do not need that many – heck, who does J — and decided to divide that range in to several other, more manageable ranges? Well, I need to subnet.

Note: we have to subtract 2 because we lose the all ones and all zeroes values.

If I only had 2 bits to play with, in binary, I would have 2^2=4 possibilities:

00

01

10

11

However, all zeros in IP means the whole network, and all ones is the broadcast ID, neither one being valid IP addresses that can be assigned to a host. That is why we always lose 2 and have to subtract two from (2^N)…

Let’s look at the following table:

Bit Value 128 64 32 16 8 4 2 1

Subnet Mask 192 224 240 248 252 254 255

Number of Subnets 2 6 14 30 62 126 254

This table is the only table you need to learn to understand IP subnetting and IP addressing! Three little lines!

Let’s look at it line by line. The first line we are already acquainted with, so I will not spend more time on it.

The second line tells you what your subnet mask will be. How do we get those results? If you look at the bit value line, and add up the bit values, you will see that:

128+64=192

192+32=224

224+16=240

240+8=248

248+4=252

252+2=254

254+1=255

Easy? J

Now to the third line. This one tells you how many subnets will get if you use the corresponding subnet mask. In other words: if you use the 192 in your subnet mask, you will get 2 subnets. If you use 224, you will get 6 subnets, etc… So how did I get those numbers? Well, let’s take 192 as an example. How many bits did I use to get 192? Well, I added 128 and 64, so that would be two bits, right? Let’s look at our well-known formula:

((2^2)-2)= 2

That is where the values in the third line come from. Want to check another one? Let’s look at 248. How many bits did I use to get to 248? 128+64+32+16+8=248, or a total of 5 bits. ((2^5)-2)=30

So now, we know how to build that table, and we understand how it is built. We are almost done with subnetting!

Let’s say my boss shows up one morning and says:

“Dave, I have an IP range of 131.107.0.0 and a subnet mask of 255.255.0.0. I want 6 subnets out of this.” What do I do now?

I look at my chart, and I see that to get 6 subnets, I need a subnet mask of 224. I already have an existing subnet of 255.255.0.0, which in binary looks like this:

11111111.11111111.00000000.00000000

I cannot “borrow” any more bits from the first 2 octets, as they are already network bits – represented by a binary value of 1. So the only I can add this “224” to my subnet mask is to borrow from the host ID. I take the next available octec – the third in our example – and end up with a subnet mask of 255.255.224.0, which looks like this in binary:

11111111.11111111.11100000.00000000

Note that we “borrowed” 3 host bits – binary value of 0 — in the third octet and made them network bits – binary value of 1. Note as well that 3 bits is what I need to make 224: 128+64+32=224.

Now that I have a subnet mask, I can tell that I have 13 host bits, meaning that I will have ((2^13)-2)=8190 valid IP addresses per range J

So I can go back to my boss and say “Boss, your new subnet mask for the 131.107.x.x network will be 255.255.224.0, and you will have 6 subnets with 8190 IP addresses in each range.” What’s my boss’ next question?

“Dave, what are those ranges?” Oh yeah… maybe I forgot that part J

**5. Calculating IP ranges in subnetted environments**

Bit Value 128 64 32 16 8 4 2 1

Subnet Mask 192 224 240 248 252 254 255

Number of Subnets 2 6 14 30 62 126 254

Here is our little subnetting chart again. In this section, we will learn how to derive the actual IP ranges from the network address and subnet mask.

In our example, we had:

Original IP range: 131.107.x.x

Original Subnet Mask: 255.255.0.0

Subnetted subnet mask: 255.255.224.0

Amount of subnets: 6

The first valid range will be 131.107.32.1 to 131.107.63.254. How did I get there? I used the above chart.

Once I determined that 224 was my subnet bit, I asked myself: what is the lowest bit value needed to make 224?” The answer is: 32 (128+64+32=224, and 32 is the lowest of all 3 bit values.) If you look at the chart, you can see this:

Bit value 32

Subnet Mask 224

Number of subnets 6

Visually, it is easy to see that to have 6 subnets, I will use 224 as a subnet bit and will start my first range at 32. I will then increment each range by that same value of 32. I love this chart!

My 6 ranges will be:

131.107.32.1 to 131.107.63.254

131.107.64.1 to 131.107.95.254

131.107.96.1 to 131.107.127.254

131.107.128.1 to 131.107.159.254

131.107.160.1 to 131.107.191.254

131.107.192.1 to 131.107.223.254

As you can see, to get the next range, I simply incremented my original value by the same value (look at the numbers in RED) I started at 32, then incremented 5 times by that same value of 32.

If you look at the values in BLUE you will see that they always are the next red value minus 1. For example, if I look at the first range x.x.32.1 to x.x.63.254, I looked at the next line’s red value, here 64, and subtracted 1 to get to 63. That is all there is to it!

By the way, note that my last octet on the start of range is always 1 – it cannot be 0, or else my host ID would be all 0s – and that the last octet is always 254 in the last IP of each range – it cannot be 255, or else it would be all 1s, which we know is the broadcast address, and is therefore not available for hosts to have.

In this example, we subnetted a Class B network into 6 subnets. Note that it is somewhat different if you subnet a Class A and a Class C. Let’s do a Class A example.

Original IP range: 10.x.x.x

Original Subnet mask: 255.0.0.0

Amount of subnets needed: 14

To get 14 subnets I need a subnet bit of 240, therefore my new subnet mask becomes 255.240.0.0. Note that my subnet bit is now the second octet, not the third as in the previous example. This will have its importance when we create our ranges.

What is the smallest bit value needed to make 240? 16. Therefore I will start my ranges at 16 and will increment by that same value of 16.

My ranges are:

10.16.0.1 to 10.31.255.254 10.128.0.1 to 10.143.255.254

10.32.0.1 to 10.47.255.254 10.144.0.1 to 10.159.255.254

10.48.0.1 to 10.63.255.254 10.160.0.1 to 10.175.255.254

10.64.0.1 to 10.79.255.254 10.176.0.1 to 10.191.255.254

10.80.0.1 to 10.95.255.254 10.192.0.1 to 10.207.255.254

10.96.0.1 to 10.111.255.254 10.208.0.1 to 10.223.255.254

10.112.0.1 to 10.127.255.254 10.224.0.1 to 10.239.255.254

Now let’s do this with a class C. Remember, class C is the hardest, so follow this carefully!

Original IP range: 192.168.2.x

Original Subnet mask: 255.255.255.0

Amount of subnets needed: 6

To get 6 subnets I need a subnet bit of 224, therefore my new subnet mask becomes 255.255.255.224. Note that my subnet bit is now the 4th octet, not the third or second as in the previous examples. This will have its importance when we create our ranges.

What is the smallest bit value needed to make 224? 32. Therefore I will start my ranges at 32 and will increment by that same value of 32. (Are you getting the hang of it by now?)

**My ranges are:**

192.168.2.33 to 192.168.2.62 192.168.2.129 to 192.168.2.158

192.168.2.65 to 192.168.2.94 192.168.2.161 to 192.168.2.190

192.168.2.97 to 192.168.2.126 192.168.2.193 to 192.168.2.222

But, you say, I thought I was starting at 32?!? My first range is starting at 33! Well, remember the other examples? We always started at .1, didn’t we? Except that here, because we are already subnetting at the fourth octet, we don’t have room for a fifth to add the .1, so we have to incorporate it in the last octet.

So why can we not use 192.168.2.32 w/ a subnet mask of 255.255.255.224? Let’s see why:

192.168.2.32 11000000. 10101000. 00000010. 00100000

255.255.255.224 11111111. 11111111. 11111111. 11100000

Looking at it in binary, it is obvious that the Host ID is all zeroes, which we know is not possible…

That is it. If you know and understand this, you can subnet! Enjoy practicing…