IP地址分类
分类 | 最低 | 最高 | 网络位 | 主机位 |
A | 0.0.0.0 | 127.255.255.255 | 7 | 24 |
B | 128.0.0.0 | 191.255.255.255 | 14 | 16 |
C | 192.0.0.0 | 223.255.255.255 | 21 | 8 |
D | 224.0.0.0 | 239.255.255.255 | 28 | N/A |
E | 240.0.0.0 | 247.255.255.255 | 27 | N/A |
地址从0.0.0.0 --- 247.255.255.255 被分成5 类.
一,如何判断一个IP地址属于哪一类
对于IP地址而言.以 192.168.9.1为例, 最有意义的是 192 , 只有这个数字能反映出这个IP是C类地址,其他的反映不出来.
192. 198. 9. 1 --------- 10 进制表示法
C0 A8 09 01 --------- 16 进制表示法
我们假令这个最有意义的位为msb 那么 :
A : msb ∈ [0, 127] --- [0x00, 0x7F] --- [0000 0000, 0111 1111] 第8位为0 --- 0xxx xxxx
B : msb ∈ [128, 191] --- [0x80, 0xBF] --- [1000 0000, 1011 1111] 第7位为0 --- 10xx xxxx
C : msb ∈ [192, 223] --- [0xC0, 0xDF] --- [1100 0000, 1101 1111] 第6位为0 --- 110x xxxx
D : msb ∈ [224, 239] --- [0xE0, 0xEF] --- [1110 0000, 1110 1111] 第5位为0 --- 1110 xxxx
E : msb ∈ [240, 247] --- [0xF0, 0xF7] --- [1111 0000, 1111 1110] J
通过二进制的规律可以得出以下代码 :
// =================== 判断IP地址所属的分类 =================== //
char class;
if( (msb&0x80) == 0x00) // 1000 0000
{
class = ‘A’;
}
else if( (msb&0xC0) == 0x80) // 1100 0000
{
class = ‘B’;
}
else if ( (msb&0xE0) == 0xC0) // 1110 0000
{
class = ‘C’;
}
else if ( (msb&0xF0) == 0xE0) // 1111 0000
{
class = ‘D’;
}
else
{
class = ‘E’;
}
OK, 那么这个msb如何取得呢? 因为我们所见到的IP都是192.168.9.1 类似这样的格式,我们就必须取得10进制表示方式里头的最有意义的高位。
一个sockaddr的定义是这样的 :
struct sockaddr_in adr_inet;
memset(adr_inet, 0, sizeof(adr_inet)); // 清零
// create sockaddr
adr_inet.sin_family = AF_INET;
adr_inet.sin_port = htons(5500);
adr_inet.sin_addr.s_addr = htons(“192.168.9.1”);
// 这里就是获得这个最有意义的高位!
msb = *(unsigned char*)&adr_inet.sin_addr.s_addr;
IP的存储结构
192 | 168 | 9 | 1 |
&adr_inet.sin_addr.s_addr 开始获得该结构的内存地址 , 即192的地址
192 | 168 | 9 | 1 |
(unsigned char*)&adr_inet.sin_addr.s_addr 把该地址转换为 unsigned char*, 也就是说新的指针是指向单独的 192, 而不再是可以取到整个IP了
192 | 168 | 9 | 1 |
*(unsigned char*)&adr_inet.sin_addr.s_addr 取新指针指向的数据.
192 | 168 | 9 | 1 |
指针真的很神奇J,
二, IP的分割
一个IP地址是32位. 以 192.168.9.1 为例, 它的16进制是 C0 A8 09 01
这个IP地址实际由两个部分组成: 网络地址, 主机地址
A类地址
0 | 7-bits(网络地址) | 24-bits(主机地址) |
B类地址
1 | 0 | 14-bits(网络地址) | 16-bits(主机地址) |
C类地址
1 | 1 | 0 | 21-bits(网络地址) | 8-bits(主机地址) |
这是A,B,C三类地址的组成结构, D,E我不知道J
那么这样提取出来它们的网络地址和主机地址呢?
这里就有个网络掩盖码的概念, 何谓网络掩码? 网络掩码就是一个数字而已, 它的用处是把网络地址从IP里头提取出来。
对于不同的分类有与之对应的不同的网络掩码, 比如说C类IP的网络掩码是 0xFF FF FF 00
那么A,B类IP对应的网络掩码是什么? 我也不知道J
好象是255.0.0.0—-0xFF000000 和 255.255.0.0---0xFFFF0000
网络地址实际是通过IP地址和网络掩码进行与运算得出来的。
192.168.9.1 ---- 0x C0 A8 09 01
(0xC0A80901 & 0xFFFFFF00 ) =====> 0xC0 A8 09 01
网络地址是 0xC0 A8 09
主机地址是 0x 01
L 和前面三个图好象不大一样,晕了,没搞明白!