带你读《从实践中学习TCP/IP协议》之三:网际层和IP协议-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

带你读《从实践中学习TCP/IP协议》之三:网际层和IP协议

简介: 传统TCP/IP协议的学习过程漫长而又枯燥乏味。针对这种现状,本书主要结合理论,并通过实际动手实践,带领读者掌握TCP/IP的相关知识。本书结合了Wireshark和netwox工具对TCP/IP协议进行讲解。其中,netwox工具提供了大量模块,允许用户手动创建各种协议的数据包,而Wireshark工具则可以捕获数据包,直观地展现用户创建的数据包。

点击查看第一章
点击查看第二章

第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所示。

image.png

  从图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),这时不使用任何选项。

image.png

  • 区分服务(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。

image.png

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。

image.png

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分片数据包。

image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接