一、IPv4地址

IPv4地址为32bit地址,分为5类(ABCDE,这里不讨论特殊用途的D和E类)。

通常我们八位一看,写成4个部分,例如:00000000 00000000 00000000 00000000,用点分十进制法就写成0.0.0.0;

11111111 11111111 11111111 11111111,可写成255.255.255.255。

下面统一用紫色标注IP地址中的网络部分,蓝色表示主机部分。下面的说法中基本上“网络段=网络号=IP地址的网络部分”,就不一个个修改了:)

A类地址

A类地址必须以一个‘0’开头,紧接着的7位代表网络段,剩余24位表示主机段。

先不看主机段,网络段的7位全为0或全为1分别表示最小或最大的网络段,即:

0000000  00000000 00000000 00000000

它代表的地址是0.0.0.0;

1111111 00000000 00000000 00000000

也即127.0.0.0。但实际上网络位不能全为0或者全为1,全为0表示所有网络,全位1用作网络回路测试。

剩下24位是主机位,那么一共可以有2^24-2个主机,它也要减2是因为主机位同样不能全为0或1,全为0表示网络地址,全为1表示本地广播,在子网掩码部分还会讲到。

因此A类地址的范围是0.0.0.0-127.255.255.255。可用网络段1.X.X.X - 126.X.X.X共126(2^7-2)个,可用主机段X.0.0.1 - X.255.255.254共2^24 - 2个。

B类地址

B类地址必须以一个‘10’开头,后面的14位表示网络段,剩余16位表示主机段。

同样的,先不看主机段:

10 000000  00000000 00000000 00000000

即128.0.0.0;128.0为最小网络段

10 111111  11111111 00000000 00000000

即191.255.0.0;191.255为最大网络段。因此一共是2^14个网络段。

最大地址是191.255.255.255,当然主机号还是不能全为0或1,有2^16-2个主机段。

C类地址

C类地址必须以一个‘110’开头,后面的21位表示网络段,剩余8位表示主机段。

110 00000  00000000 00000000 00000000

即192.0.0.0;

110 11111  11111111 11111111 00000000

即223.255.255.0;共有2^21个网络段;

最大地址是223.255.255.255,有2^8-2个主机段。

二、子网掩码

利用IP地址的网络段,我们可以唯一的标识一个物理网络。现在考虑我们要将一些网络(Network)连接到Internet上来,对于一个Network,无论它拥有的主机数多小,它至少都需要一个C类网络地址,如果它拥有超过255个的主机(或者有拓展到超过255个主机数的可能),那就需要一个B类网络,但对于我们的IPv4地址,它的地址数是有限的(大约40多亿个),如果是有300个主机的小网络,却不得不使用B类网络(一个B类网络有65534个主机段),那就浪费了6万多个地址,这使得地址的消耗变得非常快(事实上,早在2011年IPv4地址就分配完了……)

而网络段同样也是IPv4地址的一个掣肘,学习路由的相关概念我们知道,路由器通常要建立一个转发表(Forwarding table)来告知自己怎样到达不同的主机,因此主机数越多,转发表也越庞大,大的转发表给路由器又带来了性能负担……

为了给IPv4地址“续命”,或者说为了更高效地使用IP地址,人们想出了一种叫做子网(Subnet)的办法。

子网的想法是将一个IP地址分配给一系列的物理网络。当然,这些物理网络是有要求的,它们在距离上应该比较接近,对于一个远程端点来说,它往往会被视作一个独立的网络(有独立的网络号)。比较理想的子网情景是有某个大公司或者学校内部,它们有很多个物理网络,并且最终作为某个网络(主网络)的子网,外界与它们内部的网络打交道时只要知道主网络与Internet的连接点就行了。

实现子网的方式是使用子网掩码。子网掩码与IP地址相同,也是32位,也分为网络段和主机段,而且它的网络段都是1,主机段都是0(为什么是1和0下面解释)。对于简单的IP地址来说,所有同一个网络下的主机IP都有相同的网络段,而子网掩码则说:所有同一物理网络下的主机都属于相同的子网,这些子网又可能属于同一个主网络,这就使得不同物理网络下的主机可能拥有相同的网络号。

以一个B类地址128.96.34.15为例,我们使用按位与运算,将子网掩码的前几位都设置为1,X & 1 = X,而X & 0 = 0,这样我们将IP地址与子网掩码按位与时,主机部分的信息都被“遮蔽”了。现在假设它的子网掩码是11111111 11111111 11111111 100000000,即255.255.255.128,将它与128.96.34.15按位与,得到128.96.34.0,这就可以获知自己所在的子网号。

考虑如下两个主机:;

H1:所在子网128.96.34.0,子网掩码255.255.255.128,IP是128.96.34.15

H2:所在子网128.96.34.128,子网掩码255.255.255.128,IP是128.96.34.139

如果H1要发东西给H2,那么H1要将H2的地址与自己的子网掩码按位与,发现结果是128.96.32.128,而自己所在子网是129.96.32.0,这说明H1与H2不在同一子网中,因此H1将数据包发送给路由器,由路由器转发给H2.

子网掩码使得我们将一个IP地址“升格”了,例如128.96.34.0,使用子网掩码255.255.255.128它可以表示从128.96.34.0-128.96.34.127的128个地址(0到127与128按位与都得0),而在外界的目光看来,这些网络其实都是一个网络,是128.96.34.0(主网号),这就大大减少了路由器的负担。

子网掩码的设计:

上面已经讨论过使用按位与运算来保留网络部分的信息而过滤掉主机部分的信息,对于A类网络,它的网络部分(这里也算上开头的‘0’)是前8位,因此A类网络的子网掩码一定是255.X.X.X,类似的B类是255.255.X.X,C类网络是255.255.255.X。

假设我们申请到一个B类网络段168.195,需要27个子网,要怎么设计子网掩码呢?

27 < 32 = 2^5,意味着我们至少需要5个二进制位来区分这些子网,即对于“原装的”B类子网掩码255.255.0.0,我们需要额外的5个二进制位来保存子网网络号信息,而网络段排在主机段前面,因此将255.255.0.0的主机段前5位置1就行了,得到255.255.248.0,11111111 11111111 11111 000 00000000。这样我们可以保证一个主网IP旗下的IP与子网掩码按位与之后能够得到它。

类似的给定网络段,要求依据每个子网内的主机数来设计子网掩码,先将原装的子网掩码全部置1,然后从右往左置需要过滤的主机位数个0就行了。每个子网700个主机就置10个0(512 < 700 < 1024)。

使用子网掩码,我们一定程度上解决了路由器转发表的问题,但还没有解决上述的IP浪费问题。此外,子网掩码也带来了新的问题,以某B类主网号128.96.0.0为例,如果使用子网掩码255.255.0.0,那么它所指代的网络IP就是从128.96.0.0到128.96.255.255的所有IP,我们可以发现主网号与旗下的一个网络地址128.96.0.0重叠。这时如果外界说要发送给129.96.0.0,主网就会感到疑惑,它不知道这是要发给自己的还是要发给旗下的128.96.0.0。

三、CIDR

CIDR的全称是Classless Interdomain Routing,即无类别域间路由。

CIDR表示方法:IP地址/网络ID的位数(网段的划分更加灵活)

我们知道确定一个子网需要知道主机地址和子网掩码,但用CIDR的形式,可以简单得到两个数值。举例说吧,192.168.0.0/24”就表示,这个网段的IP地址从192.168.0.1开始,到192.168.0.254结束(192.168.0.0和192.168.0.255有特殊含义,不能用作IP地址);子网掩码是255.255.255.0。  
      上面的子网掩码怎么来的呢?其实关键就在“24”上。我们知道IP地址是四个十进制数组成的,相当于32位二进制。用CIDR表示形式,后一个数字将这32位进行了间隔(以24为例):前24位用"1"表示,后面8位用0表示,得到一个二进制数: 
11111111 11111111 11111111 00000000。将其转化为十进制,就是:255.255.255.0了。   
      例如:192.168.1.0/24表示网段是192.168.1.0,子网掩码是24位,子网掩码为:255.255.255.0,用二进制表示为:11111111 11111111 11111111 00000000 ,这里为什么是24呢,就是因为子网掩码里面的前面连续的“1”的个数为24个,一定要连续的才行。  
      再给你举个例子,192.168.1.0/28表示的意思是网段是192.168.1.0,子网掩码为:255.255.255.240,用二进制表示为:11111111 11111111 11111111 11110000。  
      这时候你也许就疑惑了,就是24和28两个字不一样,为什么网段是一样的呢?  
      24位说明网络位是24位,那么主机位就是32-24=8位了,则子网的IP个数是254个,即是从00000001到11111110.   
      28位说明网络位是28位,那么主机位4位,则子网的IP个数是14个,即是从00000001到00001110.

网络协议学习(2)---IP地址的更多相关文章

  1. iOS网络协议 HTTP/TCP/IP浅析

    一.TCP/IP协议       话说两台电脑要通讯就必须遵守共同的规则,就好比两个人要沟通就必须使用共同的语言一样.一个只懂英语的人,和一个只懂中文的人由于没有共同的语言(规则)就没办法沟通.两台电 ...

  2. c/c++ 网络编程 UDP 改变IP地址

    网络编程 UDP 改变IP地址 在程序里动态改变主机的IP地址 1,改变ipv4的地址 #include <stdio.h> #include <string.h> #incl ...

  3. 网络编程概述和IP地址的获取方法

    java网络通信概述 一.网络通信步骤: 主机1 主机2 QQ-------QQ FEIQ-----FEIQ 1.找到对方IP. 2.找到对方端口号.数据要发送到对方的应用程序上.为了标识这些应用程序 ...

  4. 网络协议: TCP/IP 和UDP/IP

    网络协议: TCP/IP 和UDP/IP TCP/IP TCP/IP(Transmission Control Protocol/Internet Protocol)是一种可靠的网络数据传输控制协议. ...

  5. CentOS 网络设置修改 指定IP地址 DNS 网关(转)

    CentOS 网络设置修改 指定IP地址 DNS 网关(实测 笔记)   环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G) 系统版本:Centos-6.5-x86_64 ...

  6. 【网络编程一】主机字节序与网络字节序以及ip地址转换函数

    在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然后 ...

  7. tcp/ip网络协议学习

    链路层介绍 网络层协议的数据单元是 IP 数据报 ,而数据链路层的工作就是把网络层交下来的 IP 数据报 封装为 帧(frame)发送到链路上,以及把接收到的帧中的数据取出并上交给网络层. 以太网 以 ...

  8. 网络编程学习笔记-MAC地址和IP地址的关系

    简单地说:ip地址是服务商给你的,mac地址是你的网卡物理地址. 一.IP地址 对于IP地址,相信大家都很熟悉,即指使用TCP/IP协议指定给主机的32位地址.IP地址由用点分隔开的4个8八位组构成, ...

  9. 路由器、交换机学习之IP地址、使用网络掩码划分子网

    局域网子网划分 对于C类IP地址来说(192.168.1.X,其中前面的192.168.1为网络号,后面的X为主机号,这样的网络中可以有254台主机,其中.0为局域网地址,.255为广播地址)进行子网 ...

随机推荐

  1. POJ 2299 Ultra-QuickSort (离散化)+【树状数组】

    <题目链接> 题目大意: 给你一段序列,问你如果每次只交换该序列相邻的两个元素,最少需要交换多少步才能够使该序列变为升序排列. 解题分析: 不难发现,其实本题就是让我们求原始序列的逆序对, ...

  2. POJ 1321-棋盘问题【DFS+递归】

    题目链接 题目大意: Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大 ...

  3. 在ArchLinux中安装MySQL

    最近前端学习用到数据库的知识.鉴于MySQL被甲骨文收购的情况,我从MariaDB开始学习.操作系统Manjaro 17.1, 数据库版本MariaDB 10.1. 1. 安装MariaDb和其客户端 ...

  4. The more, The Better

    The more, The Better依赖背包+树形dpf[x][j+1]=max(f[x][j+1],f[x][j+1-k]+f[i->n][k]);我的一个疑问就是这k个节点会不会选重复, ...

  5. html5手势操作与多指操作封装与Canvas图片裁切实战

    当前情况,移动端的开发占比越来越高,单指的拖拽触碰等操作是常规需要.特殊的多指操作与手势操作还需另做处理,而且还涉及到兼容性问题. // 屏幕上存在两根或两根以上的手指 时触发 仅IOS存在手势事件, ...

  6. ServiceNow在中国还有没有模仿者?

    美国版的“ServiceNow”:https://www.servicenow.com 中国版的“ServiceHot” :http://www.itsmcn.com

  7. Hessian的使用以及理解

    官网 http://hessian.caucho.com/ Hessian的使用以及理解Hessian版本:3.1.5将包括如下的内容: Hessian的基本使用Hessian的原理Hessian和S ...

  8. SpringBoot统一处理异常

    在springboot项目,报错有着默认的提示,这篇文章介绍一下如何统一处理异常. 新建项目,pom文件如下: <?xml version="1.0" encoding=&q ...

  9. VMware5.5-添加数据中心,集群及主机

    首先介绍下硬盘的三种设置格式,这个要搞清楚 虚机硬盘的三种格式 厚置备延迟置零 厚置备,分配10g空间,虚拟机没开机时就分配了: 延迟置零,没开机之前只分配空间,里面的数据不抹零,当开机写入数据时再抹 ...

  10. BZOJ.3926.[ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)

    题目链接 要对多个串同时建立SAM,有两种方法: 1.将所有串拼起来,中间用分隔符隔开,插入字符正常插入即可. 2.在这些串的Trie上建SAM.实际上并不需要建Trie,还是只需要正常插入(因为本来 ...