Logical look at masks
Having done an introduction to wildcard masks and the cool things you can do with them I thought it might be worth writing about the logic behind both subnet masks and wildcard masks. Masks use two of the most basic logical functions that computers can perform, a logical AND and a logical OR.
Logical AND is a comparison of two bits which produces an output of a single bit. It is quite sensibly named because in order to yield a 1 in the output both of the input bits, input 1 and input 2 must be 1. The table below shows the possible outputs for a logical AND.
Input 1 Input 2 Output 0 0 0 1 0 0 0 1 0 1 1 1
In a logical OR comparison the output is a 1 if input 1 or input 2 is set to 1. The comparison will also return 1 if both inputs are 1; this is slightly different from an XOR (exclusive OR) which will return a 0 of both inputs are 1. XOR is used to calculate parity in RAID 5 because it is possible to find one of the inputs if you have the other input and the XOR output; you just do another XOR. This is how RAID 5 controllers use the parity stripe to rebuild a failed volume.
Input 1 Input 2 OR Output XOR Output 0 0 0 0 1 0 1 1 0 1 1 1 1 1 1 0
Logical AND functions are used by networked devices to determine if a host address is in a particular subnet. As the network portion of a subnet mask is all ones the network part of the address is preserved and as the host part of the mask is all zeroes those bits return as zeros. In the example below we have a destination address and a local address and subnet. We will apply the AND to both and see if they match.
Local address 192.168.0.94 Binary address 11000000.10101000.00000000.01011110 Subnet mask 255.255.252.0 Binary mask 11111111.11111111.11111100.00000000
Remote address 192.168.3.52 Binary address 11000000.10101000.00000011.00110100
We’ll AND the local address with the mask first, remember we’re looking down the columns for where there is a 1 in the address and the mask.
Local address 11000000.10101000.00000000.01011110 Binary mask 11111111.11111111.11111100.00000000 Result 11000000.10101000.00000000.00000000
Then the same for the destination address and the same mask.
Local address 11000000.10101000.00000011.00110100 Binary mask 11111111.11111111.11111100.00000000 Result 11000000.10101000.00000000.00000000
As the results match we can conclude that they are in the same network.
The wildcard mask uses the OR function to match two addresses using a wildcard mask. Where the subnet mask effectively changes the host portion of the address to zeroes the wildcard mask changes the wildcard bits to ones so that we can match the rest of the address.
In the first example we’ll use 192.168.0.1 0.0.0.64 and see if the address 192.168.0.65 matches it.
Wildcard mask 00000000.00000000.00000000.01000000
Match address 11000000.10101000.00000000.01000001
We’ll start with the address and mask combination followed by the address we want to match and the mask.
Address 11000000.10101000.00000000.00000001 Wildcard mask 00000000.00000000.00000000.01000000 Result 11000000.10101000.00000000.01000001
Match address 11000000.10101000.00000000.01000001 Wildcard mask 00000000.00000000.00000000.01000000 Result 11000000.10101000.00000000.01000001
The results both match so the address would match the ACL.
In the second example the ACL is 0.0.0.0 255.255.255.254 and we’ll try matching 10.0.0.1 and 10.0.0.2
ACL 00000000.00000000.00000000.00000000 Wildcard mask 11111111.11111111.11111111.11111110 Result 11111111.11111111.11111111.11111110
10.0.0.1 00001010.00000000.00000000.00000001 Wildcard mask 11111111.11111111.11111111.11111110 Result 11111111.11111111.11111111.11111111
10.0.0.2 00001010.00000000.00000000.00000010 Wildcard mask 11111111.11111111.11111111.11111110 Result 11111111.11111111.11111111.11111110
First address doesn’t match but the second one does.