数据通信与网络技术
上QQ阅读APP看书,第一时间看更新

2.4 网络层协议

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位,该层规定了数据包通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。

2.4.1 网络层协议的两个版本

TCP/IP分层模型中网络层的核心协议有两个版本,即IPv4和IPv6,本书将它们统称为IP。IPv6相对于IPv4进行了改进,但实现的功能是一样的。网络层协议为传输层提供服务,负责把传输层的段发送到接收端。IP协议实现网络层协议的功能,发送端将传输层的段加上IP首部,IP首部包括源IP地址和目标IP地址,加了IP首部的段被称为“数据包”,网络中的路由器根据IP首部转发数据包。

如图2-32所示,TCP/IPv4协议栈的网络层有4个协议:ARP、IPv4、ICMP和IGMP。其中,ARP、ICMP和IGMP为辅助协议。TCP和UDP使用端口号标识应用层协议,TCP段、UDP报文、ICMP报文、IGMP报文都可以封装在IPv4数据包中,使用协议号区分,也就是说IPv4使用协议号标识上层协议,TCP的协议号是6,UDP的协议号是17,ICMP的协议号是1,IGMP的协议号是2。虽然ICMP和IGMP都在网络层,但从关系上来看,ICMP和IGMP在IP协议之上,也就是ICMP和IGMP的报文要封装在IPv4数据包中。

图2-32 TCP/IPv4协议栈

ARP只在以太网中使用,用来将IP地址解析为MAC地址。解析出MAC地址才能将数据包封装成帧发送出去,因此,ARP为IP提供服务。虽然将ARP归属到网络层,但从关系上来看,ARP位于IP协议之下。

图2-33是TCP/IPv6协议栈,网络层协议有了较大变化,但不会影响传输层的协议,也不会影响数据链路层协议。TCP/IPv6协议栈的网络层没有ARP和IGMP协议,对ICMP协议的功能做了很大的扩展,ARP的功能和IGMP协议的功能也被嵌入ICMPv6中,分别是邻居发现(Neighbor Discovery,ND)协议和组播侦听器发现(Multicast Listener Discovery,MLD)协议。

IPv6在本书后面的章节将会进行详细讲解。如果本书不做特别说明,IP协议默认是指IPv4。

图2-33 TCP/IPv6协议栈

2.4.2 IP

IP(Internet Protocol)又称为网际协议,它负责Internet上网络之间的通信,并规定了将数据包从一个网络传输到另一个网络应遵循的规则,是TCP/IP协议的核心。

当采用IP作为网络层协议时,通信的双方都会被分配到一个“独一无二”的IP地址来标识自己。IP地址可被写成32位的二进制形式,但为了方便人们阅读和分析,它通常会被写成点分十进制的形式,即4字节被分开用十进制表示,中间用点分隔,比如192.168.1.1。

IP协议工作时,需要如OSPF、IS-IS、BGP等各种路由协议帮助路由器建立路由表,需要ICMP协助进行网络状态诊断。如果某条链路上涌入的数据包超过了路由器的处理能力,路由器就丢弃来不及处理的数据包,由于每个数据包均单独选择转发路径,因此不能保障数据包按顺序达到接收端。IP协议只负责尽力转发数据包,但不能保证传输的可靠性,有可能丢包,也不保证数据包按顺序达到。

IP数据包的封装与转发过程如下。

(1)网络层收到上层(如传输层)协议传来的数据时,会封装一个IP报文首部,并且把源和目的IP地址都添加到该首部。

(2)中间经过的网络设备(如路由器),会维护一张指导IP报文转发的路由表,通过读取IP数据包的目的地址,根据本地路由表转发IP数据包。

(3)IP数据包最终到达目的主机,目的主机通过读取目的IP地址确定是否接收并做下一步处理。

IP数据包由首部和数据两部分组成。IP协议定义了IP数据包首部,如图2-34所示。IP数据包首部的前一部分是固定长度,共20字节,是所有IP数据包必有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。

图2-34 网络层IP数据包首部格式

下面就网络层IP数据包首部固定部分各个字段进行详细讲解。

(1)版本占4位,指IP协议的版本。IP协议目前有两个版本:IPv4和IPv6。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。

(2)首部长度占4位,可表示的最大十进制数值是15。请注意,这个字段所表示数的单位是32位二进制数(即4字节),因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此,数据部分永远从4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度是20字节(即首部长度为0101),这时不使用任何选项。正是因为首部长度有可变部分,才需要有一个字段来指明首部长度,如果首部长度是固定的,也就没有必要有“首部长度”这个字段了。

(3)区分服务(Differentiated Services,DS)占8位,配置计算机给特定应用程序的数据包添加一个标志,然后再配置网络中的路由器优先转发这些带标志的数据包,在网络带宽比较紧张的情况下,也能确保这种应用的带宽有保障,这就是区分服务,为这种服务确保服务质量(Quality of Service,QoS)。这个字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年国际互联网工程任务组(The Internet Engineering Task Force,IETF)把这个字段改名为区分服务。只有在使用区分服务时,这个字段才起作用。

(4)总长度指IP数据包首部和数据之和的长度,也就是数据包的长度,单位为字节。总长度字段为16位,因此,数据包的最大长度为216-1=65535字节。实际上传输这样长的数据包在现实中是极少遇到的。

(5)标识(Identification)占16位。IP软件在存储器中维持一个计数器,每产生一个数据包,计数器就加1,并将此值赋予标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据包不存在按序接收的问题。当数据包由于长度超过网络的最大传输单元(Maximum Transfer Unit,MTU)而必须分片时,同一个数据包被分成多个片,这些片的标识都一样,也就是数据包这个标识字段的值被复制到所有的数据包分片的标识字段中。相同的标识字段的值使分片后的各数据包片最后能正确地重组成原来的数据包。

(6)标志(Flag)占3位,但目前只有两位有意义。标志字段中的最低位记为MF(More Fragment),意思为“更多分片”。MF=1表示后面“还有分片”的数据包,MF=0表示这个分片是若干数据包片中的最后一个。标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

(7)片偏移占13位。片偏移指出较长的分组在分片后,某片在原分组中的相对位置,也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。

(8)生存时间字段常用的英文缩写是TTL(Time To Live),表明数据包在网络中的寿命。由发出数据包的源点设置这个字段。其目的是防止无法交付的数据包无限制地在网络中兜圈子,例如从路由器R1转发到R2,再转发到R3,然后又转发到R1,因而白白消耗网络资源。最初的设计是以秒作为TTL的单位。每经过一个路由器时,就把TTL减去数据包在路由器所消耗掉的一段时间。若数据包在路由器消耗的时间小于1s,就把TTL值减1。当TTL值减为零时,就丢弃这个数据包。然而随着技术的进步,路由器处理数据包所需的时间不断缩短,一般远远小于1s,后来就把TTL字段的功能改为“跳数限制”(但名称不变)。路由器在转发数据包之前就把TTL值减1。若TTL值减小到零,就丢弃这个数据包,不再转发。因此,现在TTL的单位不再是秒,而是跳数。TTL的意义是指明数据包在网络中至多可经过多少个路由器。显然,数据包能在网络中经过的路由器的最大数值是255。若把TTL的初始值设置为1,就表示这个数据包只能在本局域网中传送。因为这个数据包一传送到局域网上的某个路由器,在被转发之前TTL值就减小到零,因而就会被这个路由器丢弃。

(9)协议占8位,协议字段指出此数据包携带的数据使用何种协议,以便使目的主机的网络层知道应将数据部分上交给哪个处理过程。常用的一些协议和相应的协议字段值如图2-35所示。

图2-35 常用的协议及其字段值

(10)首部检验和占16位,这个字段只检验数据包的首部,不包括数据部分。这是因为数据包每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等,都可能发生变化)。不检验数据部分可减少计算的工作量。

(11)源IP地址占32位。

(12)目标IP地址占32位。

2.4.3 ICMP

ICMP(Internet Control Message Protocol)即Internet控制报文协议,是TCP/IPv4网络层的一个协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。

ICMP报文是在IP数据包内部被传输的,它封装在IP数据包内。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。

在Windows系统、Linux系统以及网络设备上可以使用ping命令和tracert命令发送ICMP请求报文,以此来测试网络是否畅通或跟踪数据包到达目的IP地址经过的路由器。

如下所示,在Windows 10上利用ping命令查询某网站域名时,发送了4个ICMP请求报文,收到了来自这个地址的4个ICMP回复,说明网络畅通。

C:\Users\hanlg>ping www.huawei.com 
 
正在 ping www.huawei.com.lxdns.com [111.11.0.121] 具有 32 字节的数据: 
来自 111.11.0.121 的回复: 字节=32 时间=10ms TTL=57 
来自 111.11.0.121 的回复: 字节=32 时间=11ms TTL=57 
来自 111.11.0.121 的回复: 字节=32 时间=10ms TTL=57 
来自 111.11.0.121 的回复: 字节=32 时间=11ms TTL=57 
 
111.11.0.121 的 ping 统计信息: 
   数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
   最短 = 10ms,最长 = 11ms,平均 = 10ms

如下所示,使用tracert命令跟踪数据包途径的路由器时,可以看到,沿途经过13个路由器,第14个是目标地址。

C:\Users\hanlg>tracert www.91xueit.com 
 
通过最多 30 个跃点跟踪 
到 www.91xueit.com [129.226.71.87] 的路由: 
 
  1     2 ms     1 ms     3 ms  phicomm.me [192.168.2.1] 
 36  
  2     4 ms     6 ms     8 ms  10.220.0.1 
  3     5 ms     4 ms     4 ms  111.63.220.13 
  4     4 ms     4 ms     5 ms  111.11.64.17 
  5    10 ms     4 ms     5 ms  111.24.8.253 
  6     9 ms     9 ms     8 ms  111.24.3.161 
  7    38 ms    38 ms    59 ms  221.176.24.241 
  8    37 ms    38 ms    39 ms  221.176.22.106 
  9    53 ms    39 ms    42 ms  221.176.19.198 
 10    77 ms    59 ms    48 ms  221.183.55.81 
 11    49 ms    63 ms    65 ms  218.189.5.25 
 12    61 ms    70 ms    71 ms  218.189.29.122 
 13    47 ms    63 ms    46 ms  10.196.94.241 
 14    45 ms    55 ms    47 ms  129.226.71.87 

下面通过抓包来查看ICMP报文的格式。如图2-36所示,PC1 ping 192.168.8.2,ping命令产生一个ICMP请求报文发送给目标地址,用来测试网络是否畅通,如果目标计算机收到ICMP请求报文,就会返回ICMP响应报文。

图2-36 ICMP请求和响应报文

下面介绍如何使用抓包工具捕获链路上ICMP请求报文和ICMP响应报文,并观察这两种报文的区别。

如图2-37所示,捕获AR1和AR2路由器链路上的数据包。图中展示的是ICMP请求报文,请求报文中有ICMP报文类型字段、ICMP报文代码字段、检验和字段以及ICMP数据部分。请求报文类型值为8,报文代码为0。

图2-37 ICMP请求报文

图2-38所示是ICMP响应报文,类型值为0,报文代码为0。

图2-38 ICMP响应报文

ICMP报文可分为3种类型,每种类型又使用代码来进一步指明ICMP报文所代表的不同含义。表2-1列出了常见的ICMP报文类型和代码及其所代表的含义。

表2-1 ICMP报文类型和代码及其所代表的含义

由表2-1可知,ICMP差错报告共有5种,具体介绍如下。

(1)终点不可到达。当路由器或主机没有到达目标地址的路由时,就丢弃该数据包,给源点发送终点不可到达报文。

(2)源点抑制。当路由器或主机由于拥塞而丢弃数据包时,就会向源点发送源点抑制报文,使源点知道应当降低数据包的发送速率。

(3)改变路由(重定向)。路由器把改变路由报文发送给主机,让主机知道下次应将数据包发送给另外的路由器(可通过更好的路由)。

(4)时间超时。当路由器收到生存时间为零的数据包时,除丢弃该数据包外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据包的全部数据包片时,就把已收到的数据包片都丢弃,并向源点发送时间超过报文。

(5)参数问题。当路由器或目的主机收到的数据包的首部中有的字段的值不正确时,就丢弃该数据包,并向源点发送参数问题报文。

2.4.4 ARP

地址解析协议(Address Resolution Protocol,ARP)是IPv4中必不可少的一种协议,它的主要功能是将IP地址解析为MAC地址,维护IP地址与MAC地址的映射关系的缓存,即ARP表项,实现网段内重复IP地址的检测。

1.以太网和MAC地址

为了更好地说明问题,在讲ARP之前,先介绍一下以太网和MAC地址。

(1)以太网。以太网就是一种广播式数据链路层协议,支持多点接入。交换机组建的网络就是典型的以太网,计算机的网卡遵循的就是以太网标准。在以太网中,每个计算机网卡和网络设备接口(比如路由器接口和三层交换机的虚拟接口)都有一个MAC地址。

(2)MAC地址。MAC地址也叫物理地址、硬件地址,由网络设备制造商生产时烧录在网卡(Network lnterface Card,NC)的闪存芯片中。MAC地址在计算机里都是以二进制表示的,由48位二进制组成。以太网中的计算机通信必须指明目标MAC地址和源MAC地址。

在Windows系统上查看计算机网卡的MAC地址,输入“ipconfig /all”可以看到网卡的MAC地址,如下所示。在Windows中其被称为“物理地址”,这里看到的是十六进制的MAC地址。

C:\Users\hanlg>ipconfig /all 
Windows IP 配置 
   
   连接特定的 DNS 后缀 . . . . . . .   : lan 
   描述. . . . . . . . . . . . . . . : Intel(R) Dual Band Wireless-AC 3165 
   物理地址. . . . . . . . . . . . . : 00-DB-DF-F9-D2-51 
   DHCP 已启用 . . . . . . . . . . . : 是 
   自动配置已启用. . . . . . . . . .  : 是 
   本地链接 IPv6 地址. . . . . . . .  : fe80::65d6:9e31:63a0:9dd1%11(首选) 
   IPv4 地址 . . . . . . . . . . . . : 192.168.2.161(首选) 
   子网掩码  . . . . . . . . . . . .  : 255.255.255.0 
   获得租约的时间  . . . . . . . . .  : 2020年8月3日 15:46:18 
   租约过期的时间  . . . . . . . . .  : 2020年8月4日 16:43:43 
   默认网关. . . . . . . . . . . . . : 192.168.2.1 

网络设备一般有一个ARP缓存(ARP Cache)。ARP缓存用来存放IP地址和MAC地址的关联信息。

在发送数据前,设备会先找ARP缓存表。如果缓存表中存在对方设备的ARP表顶,则直接采用该表项中的MAC地址来封装帧,然后将帧发送出去。如果缓存表中不存在相应信息,则通过发送ARP Request报文来获得它。

IP地址和MAC地址的映射关系会被放入ARP缓存表中存放一段时间。在有效期内(默认:180s),设备可以直接从这个表中查找目标MAC地址来进行数据封装,而无须进行ARP查询。过了这段有效期,ARP表项会被自动删除。

如果目标IP地址位于其他网络,则源设备会在ARP缓存表中查找网关(本网络中路由器接口)的MAC地址,然后将数据发送给网关。路由器收到数据包后再为数据包选择转发路径。

2.ARP工作过程

ARP的工作过程如图2-39所示,计算机A发送ARP请求报文,请求解析192.168.1.20的目标MAC地址,因为计算机A不知道192.168.1.20的目标MAC地址,所以该请求将目标MAC地址写成广播地址,即FF-FF-FF-FF-FF-FF,交换机收到后会将该请求转发到全部端口。

图2-39 ARP请求使用广播帧

所有的主机接收到该ARP Request报文后,都会检查它的目的端IP地址字段与自身的IP地址是否匹配。如果不匹配,则主机不会响应该ARP Request报文。如果匹配,则主机会将ARP请求报文中的发送端MAC地址和发送端IP地址信息记录到自己的ARP缓存表中,然后通过ARP Reply报文进行响应,如图2-40所示。ARP响应帧目标MAC地址是计算机A的MAC地址。

图2-40 ARP响应使用单播帧

3.同一网段通信和跨网段通信

如图2-41所示,网络中有两个以太网和一个点到点链路,计算机和路由器接口的地址如图中所示,图中的MA、MB直至MF,代表对应接口的MAC地址。计算机A和同一网段计算机B通信,计算机A发送ARP广播解析目标IP地址的MAC地址,以后通信的帧封装目标IP地址和MAC地址。

图2-41 同一网段通信计算机发送ARP广播解析目标IP地址的MAC地址

计算机A和不同网段计算机F通信,计算机A需解析网关的MAC地址,计算机A发送给计算机F的帧如图2-42所示,注意观察该数据包在两个以太网中封装的IP地址和MAC地址。在传输过程中数据包的源IP地址和目标IP地址是不变的,数据包要从计算机A发送到计算机F,需要转发路由器R1的C接口的MAC地址,因此,在以太网1中数据包封装的源MAC地址是MA,而目标MAC地址是MC。数据包到达路由器R2,就要从R2的D接口发送到计算机F,数据包要重新封装数据链路层,源MAC地址为MD,目标MAC地址是MF。

图2-42 跨网段通信计算机发送ARP广播解析网关MAC地址

从跨网段通信帧的封装来看,数据包的目标IP地址决定数据包的终点,帧的目标MAC地址决定数据包下一跳给哪个接口。ARP只能解析同一网段的MAC地址。来自其他网段计算机的数据包,源MAC地址都是路由器接口的MAC地址。本例中计算机F不能知道计算机A的MAC地址,计算机F看到来自计算机A的数据包源MAC地址是路由器R2接口D的MAC地址。

ARP只是在以太网中使用,点到点链路在数据链路层通常使用PPP,PPP定义的帧格式没有MAC地址字段,所以不用ARP解析MAC地址。

通过ARP解析到MAC地址后以太网接口会缓存解析的MAC地址,在Windows系统中运行“arp -a”可以查看ARP表项。“动态”类型的条目表明是ARP解析得到的,过一段时间不使用,其就会从缓存中被清除。

C:\Users\hanlg>arp -a 
接口: 192.168.2.161 --- 0xb 
  Internet 地址          物理地址               类型 
  192.168.2.1           d8-c8-e9-96-a4-61      动态 
  192.168.2.255         ff-ff-ff-ff-ff-ff      静态 
  224.0.0.22             01-00-5e-00-00-16      静态 
  224.0.0.251            01-00-5e-00-00-fb      静态 
  224.0.0.252            01-00-5e-00-00-fc      静态 
  255.255.255.255      ff-ff-ff-ff-ff-ff      静态 

4.抓包分析ARP帧

图2-43所示是使用抓包工具捕获的ARP请求数据包,第27帧是计算机192.168.80.20解析192.168.80.30的MAC地址发送的ARP请求数据包。注意观察目标MAC地址为ff: ff: ff: ff: ff: ff,它表示网络中的所有设备都能收到这个ARP请求信息。opcode是选项代码,指示当前包是请求报文还是应答报文,ARP请求报文的值是0x0001,ARP应答报文的值是0x0002,应答报文是单播帧。

第28帧是ARP应答帧,可以看到该帧的目标MAC地址不是广播地址,而是192.168.80.20的MAC地址。

图2-43 ARP请求帧

ARP是建立在网络中各个主机互相信任的基础上的,计算机A发送ARP广播帧解析计算机C的MAC地址,同一个网段中的计算机都能够收到这个ARP请求消息,任何一个主机都可以给计算机A发送ARP应答消息,可能告诉计算机A一个错误的MAC地址,计算机A收到ARP应答报文时并不会检测该报文的真实性,而是会将其直接记入本机ARP缓存,这样就存在ARP欺骗的安全隐患。