IP分类及网络掩码

 

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 只有这个数字能反映出这个IPC类地址,其他的反映不出来.

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(主机地址)

 

这是ABC三类地址的组成结构, DE我不知道J

那么这样提取出来它们的网络地址和主机地址呢?

这里就有个网络掩盖码的概念, 何谓网络掩码? 网络掩码就是一个数字而已, 它的用处是把网络地址从IP里头提取出来。

对于不同的分类有与之对应的不同的网络掩码, 比如说CIP的网络掩码是 0xFF FF FF 00

那么ABIP对应的网络掩码是什么? 我也不知道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 和前面三个图好象不大一样,晕了,没搞明白!

 

 

 

 

 

 

 

 

 

 

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值