一、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. Dataset:利用Python将已有mnist数据集通过移动像素上下左右的方法来扩大数据集为初始数据集的5倍—Jason niu

    from __future__ import print_function import cPickle import gzip import os.path import random import ...

  2. Hexo博客yilia主题添加Gitment评论系统

    一开始搭建hexo+yilia博客使用的评论功能是通过来必力实现的.来必力免费,功能多,一开始的体验效果很好,但是后来打开网站发现来必力加载的越来越慢(来必力是韩国的公司,可能是国内限制),遂打算换一 ...

  3. POJ 3020 Antenna Placement (二分图最小路径覆盖)

    <题目链接> 题目大意:一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,每放置一个基站,至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使得所有的城市都覆盖无线? 解题分析: ...

  4. Vagrant 管理部署 VirtualBox (推荐使用)

    学习一段时间的大数据和容器技术,使用虚拟机搭建实验环境还是挺耗时耗力的. 一旦虚拟机坏掉了,还要重新开始. 最近发现了Vagrant, 简直好用上天,方便快捷,易用. 下面介绍如何在Windows中安 ...

  5. java8 Stream的实现原理 (从零开始实现一个stream流)

    1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2  ...

  6. Unity容器中AOP应用示例程序

    转发请注明出处:https://www.cnblogs.com/zhiyong-ITNote/p/9127001.html 实在没有找到Unity容器的AOP应用程序示例的说明,在微软官网找到了教程( ...

  7. 记录下这几天使用 GitHub 碰到的问题

    1.在 GitHub 上为新项目创建一个库时,默认是不使能主页功能的 如果你想要使用 GitHub 的主页功能做一个博客或一份简历,需要人为设置一下.如下图: 制作简历,这里有一份更详细的参考:如何在 ...

  8. iOS中 H5的input输入框focus()无法自动拉起键盘(解决方法)

    ios的hybird APP 无法使用focus()获取焦点和键盘的问题. 解决方案 原来,在App的配置文件(config.xml),里面默认会有一句 1 <preference name=& ...

  9. No compiler is provided in this environment.Perhaps you are running on a JRE rather than a JDK?报错解决

    Maven install 时出现如上错误. Eclipse-->Window-->preferences-->Java-->Installed JREs 查看jdk: 发现此 ...

  10. python序列类型字符串的方法L.index()与L.find()区别

    首先官方解释 S.index(sub[, start[, end]]) -> int Like S.find() but raise ValueError when the substring ...