IP协议

文章转自:http://www.study-area.org/network/networkfr2.htm

网络之间互联的协议(原文中为网际网路协议 IP Internet Protocal)是整个TCP/IP协议的基础。

大体而言,网络之间互联的协议的功能包括如下:

  • 定义资料在网络中传输的的基本单位。
  • 定义网络的定址方式。
  • 负责网络数据链路层和传输层之间的资料传递。
  • 决定资料传送的路由路径。
  • 执行资料的分解和重组(打包和拆封)。
这层协议主要要做的事情,是将传送层传来的资料准确的送到远端机器上。让我们温习一下刚学过的ARP协定,我们知道当主机获得一个IP后,如果在ARP表格中找不到目的主机的物理地址的时候(因为底层的传送是以实体位置为依据的),那么就利用ARP协议是以广播的方式去询问对方的物理地址。不过,这里有一个限制:广播封包是有限制的,只能在同一个网段(segement)上的结点才能收到广播封包。加入当我们有一个封包从教室传到互联网上地球的另一边主机,这个时候该如何处理呢?
Okay,这就是IP协议要解决的问题了。让我们先看看IP封包的格式吧。

IP封包表头格式:
首先,先让我们看看IP封包的组成部分,以及各部件的长度:

在上图中,括号之内的数字就是各部件的长度(bit),如果您够细心,就会计算出每一行的总长度都是32bit。事实上,真正的封包是由连续的位元依序排列在一起的,之所以分行,完全是因为排版的关系。下面,我们分别对各个部件名称解释一下:
Version:
版本(VER)。表示的是IP规格版本,目前IP规格多为版本4(version 4(IPv4)),所以这里的数值通常为0x4( 注意:封包使用的数字通常都是十六进制的)。
Internet Header Length:
表头长度(IHL)。我们从IP封包规格中看到前面6行均为header(表头),如果Options和Padding没有设定的话,也就只有5行的长度;我们知道每行有32bit,也就是4byte;那么5行就是20byte了。20这个数值换算成16进制就成立0x14。所以,当封包头长度为最短的时候,此处的值就被设定为0x14(单位为byte)。
Type of Service:
服务类型(TOS)。这里指的是IP封包在传送过程中要求的服务类型,其中一共由8bit组成,每租bit组合分别分别代表不同的意思:

Total Length:
封包总长(TL)。通常以byte做单位来表示该封包的总长度,此数值包括表头和数据的总和。
Identifycation:
识别码(ID)。每一个IP封包都有一个16bit的唯一识别码。我们从OSI和TCP/IP的网络层级知识里面知道:当程序产生的数据要通过网络传送时,都会在传送层被拆散成封包形式发送,当封包要进行重组的时候,这个ID就是依据来。

Flage:

标志位(FL)。这个当封包在传输过程中进行最佳组合时使用的3个bit的识别的标识位,请参考下表:


Fragment Offset:

分割定位(FO)。当一个大封包在经过一些传输单位(MTU)较小的路径时,会被切割成碎片(fragment)再进行传送(这个切割和传输层的打包有所不同,它是由网络层决定的)。由于网络情况或其他因素影响,其到达顺序不会和当初切割术需一致的。所以当封包进行切割的时候,会为各片段做好定位记录,所以在重组的时候,就能够依号入座了。如果封包没有被切割,那么FO的值为”0“。

Time To Live:

存活时间(TTL)。这个TTL的概念,在许多网络协议中都会碰到。当一个封包被赋予TTL值(以秒或跳站数目(hop)为单位),之后就会进行倒数计时。在IP协议中,TTL是以hop为单位,每经过一个router就减1,如果封包TTL值被降为0的时候,就会被丢弃。这样,当封包在传送过程中由于某些原因未能到达目的地的时候,就可以避免其一直充斥在网络上面。有一个叫做traceroute的程序,就是一个比较好的利用TTL的实际例子,我们会在后面的章节中讨论。

Protocal:

协议(PROT)。这里指的是该封包所使用的网络协议类型,例如:ICMP或TCP/IP等等。要注意的是:这里使用的协议是网络层的协议,这和上层程序协议(如:FTP、HTTP等)是不同的。您可以从linux的/etc/protocal这个文件中找到协议的和其代号;其内容如下:


Header Chechsum

表头检验值(HC)。这个数值主要用来检查错误用的,用以确保封包被正确无误的接收到。当封包开始进行传送后,接受端主机会利用这个检验值来检查剩余的封包,如果一切看起来没有错误,就会发出确认信息,表示接受正常。

Source IP Address

来源地址(SA)。相信这个不用多解释了,就是发送端的IP地址,长度是32bit。

Destination IP Address

目的位地址(DA)。相信这个不用多解释了,就是接收端的IP地址,长度是32bit。

Options&Padding

着两项用的比较少,只有某些特殊的封包需要特定的控制,才会利用到。这里也不做细说了。


IP地址

当我们知道IP封包结构之后,接着我们就要接触一个在TCP/IP网络管理中最重要的一个概念:子网切割(subnetting)。子网络这个名词我们前面不断的碰到过,或许同学们心里都很纳闷它究竟是什么东东?不过,在真正了解子网络的定义之前,我们必须要先了解一个概念是IP地址。

IP地址虽然只有4组用小数点分开的数字(IPv4),然而它却是整个TCP/IP协议的基石。如果我们在讨论TCP/IP网络的时候,不知道IP位址的各个数字代表什么意思,那就什么都免谈论。

那我们如何解读出IP地址所隐含的深层含义的?首先,我们要具备一定的数学和逻辑基础,下面两个概念是一定要知道的:十进制转二进制,以及基本的逻辑运算。这个就不讨论十进制->二进制流。然而,逻辑运算也不打算详细讨论了,下面只把在学习IP子网计算所需要的几个运算,作一些简单的归纳而已(与、或、非):


如果不知道他们的工作原理,那么以后我们在讨论IP地址的子网的时候,您就只能死记硬背了。不过,一旦知道了其原理,那么您在任何IP网络中都不至于迷失,所谓”百变不离其宗“是也。

我们在前面讲述网络存取层(ARP)的时候,曾介绍过ifconfig命令来查找网络物理地址。事实上,在命令的输出结果里面,还包含了一个非常重要的讯息:inet addr 和 Mask:


正如您所见到的IP地址,是四组用”.“分开的十进制数字,这样的格式被称作”Dotted quad“。其实每一组都是一个8-bit的二进制数字(使用十进完全是为了迁就人类的习惯),我们称每组数字为一个”octet“,连起来就是一个32-bit的ip地址,也就是IPv4(Version 4)版本(IPv6使用的是128-bit的ip地址)。好了,我们要如何解读这个32-bit位址呢?其实,每一组IP号码都包括两个识别码信息:Net_ID跟Host_ID(网络ID和主机ID)。不过,我这里还是建议大家先来认识一下IP的class概念(国内说的类别)。

相信许多人都听过什么C Class 和B Class这样的IP了,但究竟什么样的IP属于什么样的Class呢?

如果我们将IP位址全部用二进制位来表示的话,每个octet都是完整的8个bit,如果不够8-bit的话,则往左边填上0,直到补满为止。这时候,你再看看最左边的数字是以什么为开头的:

  • 如果是以”0“开头的,这是一个A类的IP
  • 如果是以”10“开头的,这是一个B类的IP
  • 如果是以”110“开头的,这是一个C类的IP
转化从10进制的描述就是:
  • 由1到126开头的IP是A类
  • 由128到191开头的IP的B类
  • 由192到223开头的则为C类
显而易见,用二进制来表示IP类别容易很多,当我们晓得区别IP的类别后,我们就可以知道IP的Net_ID和Host_ID了:
  • A类IP使用前面的一组数字来作为NetID(前8位),其余三组作为HostID(后24位)
  • B类IP使用前面的两组数字来作为NetID(前16位),其余两组作为HostID(后16位)
  • C类IP使用前面的两组数字来作为NetID(前24位),其余两组作为HostID(后8位)
从下图中,您可以轻易的区分三个不同的IP Class:
您获取问:为什么我们需要为IP划分等级呢?这是当初在IP应用早期,为了管理需要设计的:
如果您要组建一个单一的网络,那么您得分配相同的Net ID给所有主机,而各主机的Host ID却必须是唯一的,也就是说没有任何两个Host Id会是一样的。您的网络还要连上internet或其他网络的话,那么您使用的NetId也必须是唯一的,也就是必须经过注册才能获得否则就会造成冲突了。若以比较接近现实生活的例子比喻,就好比您家的电话号码,如果是123456(HostID)的话,那么在相同的区域(NetID)里,其他人将不会再使用这个号码,然而,您不能保证在其他区域里没有1234567这个号码;北京市用来区号010的话,上海就不能使用010了,就只能使用其他的如021.这里,有一个很特别的NetID:127(即二进制的01111111)需要特别一提:它是保留给本机回路测试使用的,它不可以运用于实际的网络中,其中的127.0.0.1即代表任何一台IP主机本身。
此外,还有一个规则我们必须遵守:在指定HostId的时候,换成二进制位的话,不可以是全部为0,也不可以全部为1。当HostId全部为0的时候,指的是网络本身识别码;而全部为1的时候,则为该网络的广播位址,代表的是该网络上的所有主机( 注意:别将IP的广播和Ethernet的广播稿混淆了,两种广播是不同层级的(百度了下:以太网广播就是第二层数据链路层的ARP广播,不对的话请您指正,谢谢!))。
很明显,A类网络可以分配的HostID要比C类的多好多好多倍。让我们算算可以划分的NetID数目和各等级里面的HostID数目就知道了:
因为A类第一个bit必须为0,所以我们在头一个otect的8个bit就只有8个bit是可变话的。那么2^7 = 128,再减去127这个特殊的NetID不能使用,那么我们实际上最多只能划分127A类网络。而每个A类的网络之下,可以分配2^24次方(能够使用的HostID的bit数目),也就是16777216个HostID,但因为二进位数字不可以全部为0或1,所以再扣掉两个,那么实际能用来分配给主机使用的地址只有16777214个。
okay,用同样的公式去算算C类好了:因为C类以110开头,所以从24bit的NetID中减去3个bit,因此可以划分的C类网络则为2^21(24-3),也就是2097152个NetID,然后每个C类网络下面可以划分2^8 = 256 -4 = 254个HostID。
好了,接下来请自己计算试试看,计算出B类可以划分多少个NetID,以及每个NetID之下的可用HostID数目。
IP类别划分
Net Mask(掩码) 
此处作者的Net Mask是我们所说的子 subnet mask(子网掩码)?不正确,请指正
到这里,我必须要向大家交代清楚一件事情:在我们进行IP地址划分的时候,IP和Net Mask都必须一对使用的,两者缺一不可!不过,当我们使用分等级的IP地址的时候,我们也可以使用预设的mask:
  • A类的mask是255.0.0.0
  • B类的mask是255.255.0.0
  • C类的mask是255.255.255.0
获取您又有问题了:这是什么意思啊?看255比较难理解,如果您将之换算为二进制就容易理解多了:255 = 11111111(8个1),刚好是一个全部为1的octet。然后您把这些NetMask和各等级IP对应看看。。聪明的您就会发现:凡是被1所对应的IP部分就是NetID;凡是被0所对应的部分就是HostID!


实际的情形是:当电脑获得了一对IP和Mask(都是二进制数字)之后,电脑会使用一个AND的二进制逻辑运算,来求出NetID。我们可以随便拿一个IP来做例子:
139.175.152.254换成二进制是:
10001011.10101111.10011000.11111110
因为它是以10开头的,所以是一个B类IP,这个Class的预设mask就是255.255.0.0,换成二进制就是
11111111.11111111.00000000.00000000
然后将IP和mask加以AND(与)运算:
10001011.10101111.00000000.00000000
换算成十进制的就是139.175.0.0,这个就是Net ID了。
那么,怎么求Host ID呢,也很简单:
先将Net Mask取Not(非)运算,然后再与IP做AND(与)运算,就可以得到HostID了。

当我们设定网络环境的时候,除了要输入IP位址、netmask、网络地址外,还需要指定广播地址(broadcast)。我们已经知道如果Host ID全部为0是网络地址(网段地址),而全部为1则是广播地址。其实广播地址也可以通过一个简单运算来获得:
先将net mask做一个非运算,可以得到:
00000000.00000000.11111111.11111111
然后再和IP做一次OR运算,就可以得到广播地址栏:
10001011.10101111.10011000.11111110
OR
00000000.00000000.11111111.11111111
得:
10001011.10101111.11111111.11111111
换成十进制就是139.175.255.255

子网划分
网络都是有一定的结点极限的,比如Ethernet通常最多只能连接1.200台主机,如果您获得一个B类的Net ID,岂不是浪费了很多HostID了吗?要是A类的话就更惊人了,土豪都干不起。当您遇到这种“有钱人的困扰”的时候,Sub net mask就派上用场了。如果您刚才还认为预设的Net Mask是多余的话,那当您知道Sub net Mask的功能后,我敢保证您不会在忽略Net Mask了。
Sub-net Mask的使用手法就是靠“借”,或者可以说靠“抢”:就是从左往右按需要将本来属于Host ID的一些连续的bit转为Sub-net ID来使用。也就是将预设的Net Mask的“1”逐渐的往右增加,相对的,Net Mask的“0”

其情形会是:当您借用1个bit的hostID来做Sub-net ID的时候,会将网络切割开两个子网络(2^1 = 2);如果借用2个bit的时候则4个子网络;3个bit则8个;4个bit则16个。。。当所有的Host ID都借出去之后,您就可以得到最多数量的子网络,但这是毫无意义的,因为没有Host ID了,您怎么分配IP给主机呢?要是您的HOst ID只剩下一个bit没有借出去的话,那么您在每个网络只能得到0和1来作为Host ID,这也是不行的,因为这两个ID也不可以用来分配给主机。
因此,当您分割网络的时候,您得最少留下2个bit来做Host ID,这时候,每个网络最多只能连接2台主机。2^2不是为4么,为什么只有两个主机呢?别忘了Host ID不能两个都为0或者两个都为1哦。这样的网络通常会用在WAN与WAN之间的路由器连接。而在LAN中的应用,通常最少要保留3个bit来做HostID。
为了更好的理解Sub net Mask的功能,我们还是以刚才的IP(139.175.152.254)为例子,再来一番推算:
我们知道它在预设之下的NetMask是:
11111111.11111111.00000000.00000000
如果我们借用了Host ID的其中三个bit来做sub net ID的话,将原来的Net Mask 和Sub-net Mask做一个OR的运算
11111111.11111111.00000000.00000000
OR
00000000.00000000.11100000.00000000
得出:
11111111.11111111.11100000.00000000
换成十进制后,实际的net mask 为255.255.224.0
因为借用到的ID只有3个bit,所以我们可以将原来的B class网络分割为8个子网络,而他们的sub-net ID则分别是从000到111这8个组合,再加上原来的Net ID(10001011.10101111.00000000.00000000),各子网络的实际net ID为:
10001011.10101111.00000000.00000000(139.175.0.0)
10001011.10101111.00100000.00000000(139.175.32.0)
10001011.10101111.01000000.00000000(139.175.64.0)
10001011.10101111.01100000.00000000(139.175.96.0)
10001011.10101111.10000000.00000000(139.175.128.0)
10001011.10101111.10100000.00000000(139.175.160.0)
10001011.10101111.11000000.00000000(139.175.192.0)
10001011.10101111.11100000.00000000(139.175.224.0)
这时候,本来16个bit的Host ID只剩下13个bit了,也就是:每个子网络里面,最多有2^13 -2 = 8192 - 2 = 8190台主机,而他们可以分配的号码分别由
00000.000000001到11111.111111110之间。
然而,我们并不能简单的他们以十进制的0.1到31.254这样表示,因为我们在表示一个完整的IP必须是4个完整的Octet,因此我们还的与各个不同的Sub-net ID再相加一起才能得到最终的IP地址,例如:
在Sub-net ID001之下的主机号码(子网001中的主机号码),将会是
00100000.00000001到0011111111.111111110之间,整个IP地址则是从139.175.32.1到139.175.63.254之间。
同样的,在sub-net ID在100之下的主机号码,将会是
10000000.00000001到1001111111.111111110之间,整个IP地址则是从139.175.128.1到139.175.159.254之间。
明白了?还是自己动手算算在110这个sub-net ID之下的主机号码范围是多少?还有这个子网的net-id和广播地址分别是什么?还有这个子网的net-id(网络id)和广播位址分别是什么?

不同等级的IP
思考一下,如果我的IP是139.175.152.254,而net mask则为255.255.255.0。你认为是否用错net mask呢?而203.56.6.18使用255.255.0.0做mask又如何?
这里,我们将较大的IP等级切割成许多小网络,可以说是“有钱人的烦恼”;但难道“穷人”就没有烦恼吗?当然是有啦。例如:您的公司有接近600台主机,想连成一个IP网络,若申请一个BClass网络似乎太浪费。而且说是在,也未必可以申请得到!那么申请3个C类的网络总可以吧?当然没问题啦。
然而,因为3个C类网络他们的Net ID都各自独立的,如果要旗下的电脑都能沟通的话,就要router的参与了。但是router一点都不便宜哦!就算您老板不在乎,要设定和维护好几个网路的routing也不是一件容易的事情。
好消息是:你可以将这三个C类网络整合一起来使用。使用的是CIDR(Classless Inter-Domain Routing)技术,也就是所谓的不分等级的IP了。使用CIDR的时候,你大可不必理会IP的开头字段,可以随便设定您的Net Mask长度。也就是说,一个原本属于C类网络也可以用255.255.0.0这样的mask,我们称这样的网络为“Supernet”,跟subnet正好相反就是了。


事实上,早起的IP开发并没有预期到IP消耗量的爆炸性成长,结果网络类的设计在后来大大的遏制了IP网络的扩充和灵活性。例如上例中一个横跨好几个C类的站点,因为不能取得B类而造成网络数目的急剧成长,同时也导致路由维护的负担与成本。因此在1993年IEEE NetWork的提案增加了CIDR的扩充,打破了Class的局限。如果您的系统支持CIDR协议,就可以抛开网络等级的极限,使用可变长度的netmask(VLSM)灵活的设计IP网络的范围与路由。当然,如果要和其他网络沟通,您使用的router也必须支持CIDR才可以,不过,现在router基本都支持CIDR。
在CIDR引入之后,如果您觉得139.175.152.254/255.255.0.0和192.168.1.1/255.255.255.255这样的IP表现方法实在太麻烦了,这里有一个更好的表示法:使用mask的bit数目长度表示Net Mask。这养我们就可以将前面两个IP写成192.175.152.254/16和203.56.6.18/24。加入,这里我们使用了3个bit的sub-net,我们只要将19,将24改为27就可以了;如果是使用了三个bit的Supernet,我们将之改成13和21就可以了。

“公共IP”和“私有IP”
当我们要将网络连上Internet的时候,我们必须先注册好Net ID,如果该ID已经被使用了,您就必须选用另外的ID了。负责Internet IP注册的机构叫做InterNIC(Network Information Center)。不过,实际上一般机构或个人是不太可能直接从InterNIC上注册IP的,而是经您的ISP分配下来。这些经过合法授权使用的IP,我们称为公共IP(Public IP)。
然而,由于Internet的爆炸性成长,IP的地址越来越少,而且在很多机构,也不是所有的机器都必要使用注册是IP地址。于是我们就在A、B、C这三个类里面,各自划出一些地址范围保留给私有地址所用,他们是:
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
当您使用这些地址的时候,当然是有所限制的:
  • 私有地址的路由不能将数据包对外散播
  • 使用私有地址作为来源或目的地址的封包,不能透过Internet来传送。
  • 关于私有地址的参考记录,只能限于内部网络使用
正式由于这些限制,当我们使用这些私有地址来设定网络的时偶,就无需担心会和其他也使用相同地址的网络冲突。而这些无需注册就能自由使用的IP,我们称为私有IP(Private IP)。当我们假设IP网络的时候,私有IP给我们很大的方便。比方说:您目前的公司还没有连上Internet,且也没有获得公共IP的注册。倘若使用公共IP的话,等到以后真正要连上网络的时候,就很可能和别人冲突了。其患处就是:由于您的IP不是合法授权使用的,别人根本连不进来,而且与您冲突的IP您却永远没办法连上去(如果对方是你的大客户就慘了)。若是那时候再重新规划IP的话,将是件非常头痛的问题!
解决的办法是:我们可以先利用私有地址来假设网络,等到真正要连上internet的时候,我们可以使用代理服务器(proxy)或IP转换(NAT--Network Address Translation)等技术,配合新注册的IP就可以了。
由于私有地址在internet上是不能路由的,用来架设企业内部网络,在安全上面也是有所帮助的。当然了,如果在课堂上活在家里假设IP网络,使用私有地址也是个不错的注意哦。



习题:
1.请简述网络层的主要功能。
2.请描述IP封包的格式,以及各部件的功能。
3.请讲述如何判断一个IP地址的Class属性,以及如何判别各Class的NetID和HostID。请用生活实例来模拟netID和HostID的作用。
4.请运用IP地址实例来讲述Net Mask的作用,然后以课堂的实际需求以分组原则来分割教育网。
5.请问什么是CIDR?请用实例来探讨CIDR的作用。
6.请讲述私有IP的作用,以及他们的范围。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值