第3章 网际层和IP协议
网际层是TCP/IP协议的第二层。它提供独立于硬件的逻辑寻址,从而让数据能够在具有不同物理结构的子网之间传递。这种传递基于IP协议提供的IP地址实现。本章将详细介绍网际层中的IP地址规范及IP协议。
3.1 IP地址
IP地址(Internet Protocol Address)是互联网协议特有的一种地址。它是IP协议提供的一种统一的地址格式。它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。本节将详细讲解IP地址的构成和划分。
3.1.1 为什么使用IP地址
在单个局域网网段中,计算机与计算机之间可以使用网络访问层提供的MAC地址进行通信。如果在路由式网络中,计算机之间进行通信就不能利用MAC地址实现数据传输了。因为MAC地址不能跨路由接口运行;即使强行实现跨越,使用MAC地址传输数据也是非常麻烦的。这是由于内置在网卡里的固定MAC地址不能在地址空间上引入逻辑结构,使其无法具备真正的地址来表示国家、省、市、区、街道、路、号这类层次。因此,要进行数据传输,必须使用一种逻辑化、层次化的寻址方案对网络进行组织。这就是IP地址。
网络中的每个计算机都有对应的IP地址。用户可以使用netwox工具探测目标主机。
【实例3-1】显示目标主机的相关信息。
(1)探测局域网中所有主机的IP地址、主机名和MAC地址信息。
root@daxueba:~# netwox 3 -a 192.168.59.0/24
显示的所有主机信息如下;
IP address: 192.168.59.0
Hostname: localhost
Hostnames: localhost
Eth address: unresolved
IP address: 192.168.59.1 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:50:56:C0:00:08 #MAC地址
IP address: 192.168.59.2 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:50:56:EA:F3:A1 #MAC地址
… #省略其他信息
IP address: 192.168.59.131 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:0C:29:CA:E4:66 #MAC地址
IP address: 192.168.59.132 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:0C:29:C4:8A:DE #MAC地址
… #省略其他信息
IP address: 192.168.59.254 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: 00:50:56:F7:32:70 #MAC地址
IP address: 192.168.59.255 #主机IP地址
Hostname: localhost
Hostnames: localhost
Eth address: unresolved
以上输出信息依次显示了局域网中的所有主机信息,主机IP地址为192.168.59.0到192.168.59.255。如果主机存在,就在Eth address部分中显示对应的MAC地址,如果主机不存在,则显示为unresolved。从输出信息中可以了解到,主机192.168.59.131存在,其MAC地址为00:0C:29:CA:E4:66。
(2)主机可以被用做服务器,探测域名为www.163.com的所有主机的IP地址、主机名,以及MAC地址信息。
root@daxueba:~# netwox 3 -a www.163.com
输出信息如下:
IP address: 220.194.153.86
Hostname: unresolved
Hostnames: unresolved
Eth address: unresolved
IP address: 218.26.75.208 #IPv4地址
Hostname: 208.75.26.218.internet.sx.cn #主机名
Hostnames: 208.75.26.218.internet.sx.cn
Eth address: unresolved
IP address: 124.163.192.254 #IPv4地址
Hostname: 254.192.163.124.adsl-pool.sx.cn #主机名
Hostnames: 254.192.163.124.adsl-pool.sx.cn
Eth address: unresolved
IP address: 2408:80f1:201:1::7 #IPv6地址
Hostname: unresolved
Hostnames: unresolved
Eth address: 00:50:56:EA:F3:A1 #MAC地址
IP address: 2408:80f1:201:1::6 #IPv6地址
Hostname: unresolved
Hostnames: unresolved
Eth address: 00:50:56:EA:F3:A1 #MAC地址
以上输出信息显示了域名www.163.com的主机所使用的IP地址、主机名,以及MAC地址信息。
3.1.2 IP地址构成
在网际层中,利用IP地址将数据传输到目的地。为了能够使数据正确地发送到目标主机上,网络上的IP地址必须有一定的规则来识别主机的位置。下面介绍IP地址的构成。
1.基本构成
为了便于寻址,了解目标主机的位置,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上的工作站、服务器和路由器等)有一个主机ID与其对应。网络ID和主机ID含义如下:
网络ID:用于识别主机所在的网络,网络ID的位数直接决定了可以分配的网络数量。
主机ID:用于识别该网络中的主机,主机ID的位数则决定了网络中最大的主机数量。
2.基本分类
大型网络包含大量的主机,而小型网络包含少量的主机。根据用户需求不同,一个网络包含的主机数量也会不同。为了满足不同场景的需要,网络必须使用一种方式来判断IP地址中哪一部分是网络ID,哪一部分是主机ID。IP地址为32位地址,被分为4个8位段。为了方便对IP地址的管理,将IP地址基本分为三大类,每类地址的分类与含义如下:
A类:前8位表示网络ID,后24位表示主机ID;该地址分配给政府机关单位使用。
B类:前16位表示网络ID,后16位表示主机ID;该地址分配给中等规模的企业使用。
C类:前24位表示网络ID,后8位表示主机ID;该地址分配给任何需要的人使用。
除了上述的A、B、C三类地址以外,还有两类隐藏地址,即D类地址和E类地址:
D类:不分网络ID和主机ID;该地址用于多播。
E类:不分网络ID和主机ID;该地址用于实验。
3.地址区分
IP地址被分类以后,如何判断一个IP地址是A类、B类还是C类地址呢?为了更好地进行区分,将每类地址的开头部分设置为固定数值,如图3.1所示。
从图3.1中可以看出,每类IP地址都是以32位的二进制格式显示的,每类地址的区别如下:
A类:网络ID的第一位以0开始的地址。
B类:网络ID的第一位以10开始的地址。
C类:网络ID的第一位以110开始的地址。
D类:地址以1110开始的地址。
E类:地址以11110开始的地址。
4.地址范围
由于每类地址的开头是固定的,因此每类地址都有自己的范围:
A类:IP地址范围为0.0.0.0~127.255.255.255。
B类:IP地址范围为128.0.0.0~191.255.255.255。
C类:IP地址范围为192.0.0.0~223.255.255.255。
D类:IP地址范围为224.0.0.0~239.255.255.255。
E类:IP地址范围为240.0.0.0~255.255.255.254。
5.特殊IP地址
在进行IP地址分配时,有一些IP地址具有特殊含义,不会分配给互联网的主机。例如,保留了一些IP地址范围,用于私有网络,这些地址被称为私有地址。再如,保留一部分地址用于测试,被称为保留地址。A类、B类、C类地址的地址范围及含义如下:
(1)A类地址
私有地址范围为10.0.0.0~10.255.255.255。
保留地址范围为127.0.0.0~127.255.255.255.
(2)B类地址
私有地址范围为172.16.0.0~172.31.255.255。
保留地址为169.254.X.X。
(3)C类地址
私有地址范围为192.168.0.0~192.168.255.255。
3.1.3 子网划分
数据在网络中进行传输是通过识别IP地址中的网络ID,从而将数据发送到正确的网络中。然后再根据主机ID将数据发送到目标主机上。如果一个网络中包含了百万台主机,数据通过网关找到对应的网络后,很难快速地发送到目标主机上。为了能够在大型网络中实现更高效的数据传输,需要进行子网划分,将网络划分为更小的网络。
子网划分是将IP地址的主机ID部分划分为子网ID和主机ID。其中,子网ID用来寻找网络内的子网;主机ID用来寻找子网中的主机。子网掩码则是用来指明地址中多少位用于子网ID,保留多少位用于实际的主机ID。
3.1.4 CIDR格式
将IP地址分为A类、B类、C类后,会造成IP地址的部分浪费。例如,一些连续的IP地址,一部分属于A类地址,另一部分属于B类地址。为了使这些地址聚合以方便管理,出现了CIDR(无类域间路由)。
无类域间路由(Classless Inter-Domain Routing,CIDR)可以将路由集中起来,在路由表中更灵活地定义地址。它不区分A类、B类、C类地址,而是使用CIDR前缀的值指定地址中作为网络ID的位数。这个前缀可以位于地址空间的任何位置,让管理者能够以更灵活的方式定义子网,以简便的形式指定地址中网络ID部分和主机ID部分。
CIDR标记使用一个斜线(/)分隔符,后面跟一个十进制数值表示地址中网络部分所占的位数。例如,205.123.196.183/25中的25表示地址中25位用于网络ID,相应的掩码为255.255.255.128。
【实例3-2】已知CIDR格式地址为192.168.1.32/27,计算该地址的掩码,并显示包含了多少台主机。
(1)列出包含的所有主机。
root@daxueba:~# netwox 213 -i 192.168.1.32/27
输出信息如下:
192.168.1.32
192.168.1.33
192.168.1.34
192.168.1.35
192.168.1.36
192.168.1.37
192.168.1.38
… #省略其他信息
192.168.1.57
192.168.1.58
192.168.1.59
192.168.1.60
192.168.1.61
192.168.1.62
192.168.1.63
上述输出信息显示该CIDR地址中包含了32台主机,IP地址为192.168.1.32~192.168.1.63。
(2)计算IP地址192.168.1.32/27的掩码。
root@daxueba:~# netwox 24 -i 192.168.1.32/27
输出信息如下:
192.168.1.32-192.168.1.63 #IP地址范围
192.168.1.32/27 #IP地址段
192.168.1.32/255.255.255.224 #掩码
localhost=localhost #主机名
上述输出信息显示掩码为255.255.255.224。
3.2 IP协议
IP协议提供了一种分层的、与硬件无关的寻址系统,它可以在复杂的路由式网络中传递数据所需的服务。IP协议可以将多个交换网络连接起来,在源地址和目的地址之间传送数据包。同时,它还提供数据重新组装功能,以适应不同网络对数据包大小的要求。本节将详细讲解IP协议的使用。
3.2.1 IP协议工作方式
在一个路由式网络中,源地址主机向目标地址主机发送数据时,IP协议是如何将数据成功发送到目标主机上的呢?由于网络分同网段和不同网段两种情况,工作方式如下:
1.同网段
如果源地址主机和目标地址主机在同一网段,目标IP地址被ARP协议解析为MAC地址,然后根据MAC地址,源主机直接把数据包发给目标主机。
2.不同网段
如果源地址主机和目标地址主机在不同网段,数据包发送过程如下:
(1)网关(一般为路由器)的IP地址被ARP协议解析为MAC地址。根据该MAC地址,源主机将数据包发送到网关。
(2)网关根据数据包中的网段ID寻找目标网络。如果找到,将数据包发送到目标网段;如果没找到,重复步骤(1)将数据包发送到上一级网关。
(3)数据包经过网关被发送到正确的网段中。目标IP地址被ARP协议解析为MAC地址。根据该MAC地址,数据包被发送给目标地址的主机。
3.2.2 IP协议包结构
在TCP/IP协议中,使用IP协议传输数据的包被称为IP数据包。每个数据包都包含IP协议规定的内容。IP协议规定的这些内容被称为IP数据报文(IP Datagram)或者IP数据报。IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
每个IP数据报都以一个IP报头开始。源计算机构造这个IP报头,而目的计算机利用IP报头中封装的信息处理数据。IP报头中包含大量的信息,如源IP地址、目的IP地址、数据报长度、IP版本号等。每个信息都被称为一个字段。IP数据报头字段如图3.2所示。
IP报头的最小长度为20字节,图3.2中每个字段的含义如下:
版本(version):占4位,表示IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4,即IPv4。
首部长度(网际报头长度IHL):占4位,可表示的最大十进制数值是15。这个字段所表示数的单位是32位字长(1个32位字长是4字节)。因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是,长度有时可能不够用,之所以限制长度为60字节,是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
区分服务(tos):也被称为服务类型,占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务(Differentiated Services,DS)。只有在使用区分服务时,这个字段才起作用。
总长度(totlen):首部和数据之和,单位为字节。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
标识(identification):用来标识数据报,占16位。IP协议在存储器中维持一个计数器。每产生一个数据报,计数器就加1,并将此值赋给标识字段。当数据报的长度超过网络的MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。
标志(flag):占3位。第一位未使用,其值为0。第二位称为DF(不分片),表示是否允许分片。取值为0时,表示允许分片;取值为1时,表示不允许分片。第三位称为MF(更多分片),表示是否还有分片正在传输,设置为0时,表示没有更多分片需要发送,或数据报没有分片。
片偏移(offsetfrag):占13位。当报文被分片后,该字段标记该分片在原报文中的相对位置。片偏移以8个字节为偏移单位。所以,除了最后一个分片,其他分片的偏移值都是8字节(64位)的整数倍。
生存时间(TTL):表示数据报在网络中的寿命,占8位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。路由器在转发数据报之前,先把TTL值减1。若TTL值减少到0,则丢弃这个数据报,不再转发。因此,TTL指明数据报在网络中最多可经过多少个路由器。TTL的最大数值为255。若把TTL的初始值设为1,则表示这个数据报只能在本局域网中传送。
协议:表示该数据报文所携带的数据所使用的协议类型,占8位。该字段可以方便目的主机的IP层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。例如,TCP的协议号为6,UDP的协议号为17,ICMP的协议号为1。
首部检验和(checksum):用于校验数据报的首部,占16位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。
源地址:表示数据报的源IP地址,占32位。
目的地址:表示数据报的目的IP地址,占32位。该字段用于校验发送是否正确。
可选字段:该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。
填充:由于可选字段中的长度不是固定的,使用若干个0填充该字段,可以保证整个报头的长度是32位的整数倍。
数据部分:表示传输层的数据,如保存TCP、UDP、ICMP或IGMP的数据。数据部分的长度不固定。
3.3 构造IP数据包
为了更好地掌握IP协议,下面使用netwox工具提供的模块来构建各种IP数据包。
3.3.1 构建IP数据包
netwox工具提供编号为38的模块,用来构造IP数据包。用户不仅可以设置源IP地址和目标IP地址,还可以设置TTL、数据分片等字段。
【实例3-3】构造IP数据包。
(1)不指定选项,直接运行该模块。执行命令如下:
root@daxueba:~# netwox 38
输出信息如下:
IP______________________________________________________________.
|version | ihl | tos | totlen |
|___4___ |___5___|____0x00=0_____|___________0x0014=20___________|
| id |r|D|M| offsetfrag |
|_________0x87D6=34774__________|0|0|0|________0x0000=0_________|
| ttl | protocol | checksum |
|____0x00=0_____ |____0x00=0_____|____________0x2ADB_____________|
| source |
|________________________192.168.59.131_________________________|
| destination |
|____________________________5.6.7.8____________________________|
在输出信息中,第一行IP表示当前数据包是基于IP协议的。包中的字段值均为默认值。例如,源IP地址为192.168.59.131,目的IP地址为5.6.7.8。
(2)指定源IP地址为192.168.59.132,目标IP地址为192.168.12.101。执行命令如下:
root@daxueba:~# netwox 38 -l 192.168.59.132 -m 192.168.12.101
输出信息如下:
IP______________________________________________________________.
|version | ihl | tos | totlen |
|___4___ |___5___|____0x00=0_____ |___________0x0014=20___________ |
| id |r|D|M| offsetfrag |
|__________0x1B26=6950__________ |0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|____0x00=0_____ |____0x00=0_____ |____________0xD68A_____________ |
| source |
|________________________192.168.59.132_________________________ |
| destination |
|________________________192.168.12.101_________________________ |
从上述输出信息中可看出,源IP地址由原来的192.168.59.131变为了192.168.59.132,目的IP地址由原来的5.6.7.8变为了192.168.12.101。
(3)通过抓包,验证构造的IP数据包。捕获到的数据包如图3.3所示。其中,第2个数据包为构造的数据包。源IP地址为192.168.59.132,目标IP地址为192.168.12.101,协议为IPv4。
3.3.2 基于Ethernet层构造IP数据包
netwox工具提供编号为34的模块,用于指定IP数据报的以太层字段信息。
【实例3-4】指定IP数据报的以太层字段信息。
(1)不指定选项,直接运行该模块,查看默认设置。执行命令如下:
root@daxueba:~# netwox 34
输出信息如下:
Ethernet________________________________________________________.
| 00:0C:29:CA:E4:66->00:08:09:0A:0B:0C type:0x0800 |
|_______________________________________________________________ |
IP______________________________________________________________.
|version | ihl | tos | totlen |
|___4___ |___5___|____0x00=0_____|___________0x0014=20___________ |
| id |r|D|M| offsetfrag |
|_________0xE1C2=57794__________ |0|0|0|________0x0000=0_________|
| ttl | protocol | checksum |
|____0x00=0_____ |____0x00=0_____|____________0xD0EE_____________ |
| source |
|________________________192.168.59.131_________________________ |
| destination |
|____________________________5.6.7.8____________________________ |
在输出信息中,第一行Ethernet表示当前数据包的以太网层字段信息。这些字段值均为默认值。例如,当前以太网的源MAC地址为00:0C:29:CA:E4:66,目标MAC地址为00:08:09:0A:0B:0C。
(2)指定以太网的源MAC地址和目标MAC地址。设置源MAC地址为00:0C:29:C4:8A:DE,目标MAC地址为00:0C:29:D0:21:23,目标IP地址为192.168.59.156。执行命令如下:
root@daxueba:~# netwox 34 -a 00:0C:29:C4:8A:DE -b 00:0C:29:D0:21:23
输出信息如下:
Ethernet________________________________________________________.
| 00:0C:29:C4:8A:DE->00:0C:29:D0:21:23 type:0x0800 |
|_______________________________________________________________ |
IP______________________________________________________________.
|version | ihl | tos | totlen |
|___4___ |___5___|____0x00=0_____|___________0x0014=20___________ |
| id |r|D|M| offsetfrag |
|_________0x6983=27011__________|0|0|0|________0x0000=0_________ |
| ttl | protocol | checksum |
|____0x00=0_____ |____0x00=0_____|____________0x492E_____________ |
| source |
|____________________________192.168.59.131_________________________ |
| destination |
|____________________________192.168.59.156__________________________|
从输出信息可以看到,以太网的MAC地址由原来的00:0C:29:CA:E4:66变为了00:0C: 29:C4:8A:DE,目标MAC地址由原来的00:08:09:0A:0B:0C变为了00:0C:29:D0:21:23。
(3)验证构造的数据包,使用Wireshark工具捕获数据包,如图3.4所示。其中,第2个数据包为构造的IPv4数据包。在Ethernet II部分中,源MAC地址为指定的00:0C:29: c4:8a:de,目标MAC地址为指定的00:0c:29:d0:21:23。
3.3.3 利用分片实施洪水攻击
IP协议在传输数据包时,经常会进行分片传输。例如,当一个设备准备传输一个IP数据包时,它将首先获取这个数据包的大小,然后获取发送数据包所使用的网络接口的最大传输单元值(MTU)。如果数据包的大小大于MTU,则该数据包将被分片。将一个数据包分片包括下面几步:
(1)设备将数据包分为若干个可成功进行传输的数据包。
(2)每个IP数据包的首部的总长度域会被设置为每个分片的片段长度。
(3)更多分片标志将会在数据流的所有数据包中设置为1,除了最后一个数据包。
(4)IP数据包头中分片部分的分片偏移将会被设置。
(5)数据包被发送出去。
目标主机收到分片包后,会根据分片信息重组报文。如果发送大量的无效IP分片包,会造成洪水攻击。用户可以使用netwox工具中编号为74的模块实施洪水攻击。
【实例3-5】已知目标主机IP地址为192.168.59.135,使用netwox工具向目标主机发送大量的IP分片实施洪水攻击,执行命令如下:
root@daxueba:~# netwox 74 -i 192.168.59.135
执行命令后没有任何输出信息,但是会向目标主机发送大量的IP分片数据包。如果使用Wireshark工具抓包,可以捕获到大量的IP分片数据包,如图3.5所示。图中显示了大量的IPv4数据包,Info列中的Fragmented IP protocol信息表示数据包为IP分片数据包。