第 4 章 网络层(上)
基本概念
-
网络层要设计得尽量简单,向上层只提供简单灵活的、无连接的、尽最大努力交付的数据报服务,不提供服务质量的承诺。若需要可靠的通信,就由更上层(例如运输层)完成负责
-
网络层逻辑上可以分为两个层次:数据层面(也称转发层面)、控制层面,数据层面转发主机之间要传送的数据,控制层面传送路由信息
-
路由器在数据层面转发分组时,是各自独立工作的,往往使用硬件方式,非常快(纳秒级);但是由于控制信息需要协同多个路由器进行,通常使用软件方式完成,速度比较慢(秒级)
-
一般来说,各路由器均集成了控制层面与数据层面。但在新兴的软件定义网络SDN中,控制层面由一个远程控制器(物理上可以是分布式的)完成,在计算完成后会直接在每个路由器中生成转发表,此时路由器中只有数据层面了,速度快、造价低
-
一些中间设备
-
物理层:转发器repeater
-
数据链路层:网桥bridge、交换机switch
-
网络层:路由器router
-
网络层以上:网关gateway
-
-
参与互连的计算机都使用网际协议IP,这使得可以将他们看成一个虚拟互连网络,不在一个网络上的主机通信起来就像是在同一网络上,多种异构网络可以构成同一个互联网。在这种覆盖全球的IP网上层使用TCP协议,就成为了当今的互联网
要通信的主机之间建立一条逻辑上的虚电路连接(不建立物理连接),沿这条逻辑连接按存储转发方式传送数据报
IP地址
以下的叙述中,未特别说明处的IP地址都认为是IPv4的地址
基本概念
-
对于路由器,其每个端口都有一个IP地址,由于路由器是用来连接多个网络的,也就是会使用至少两个端口,即一个路由器至少会有两个不同的IP地址
-
用转发器或网桥连接起来的网络仍为同一网络,使用同样的网络号
IP地址结构
IPv4地址长度为32bit,以x.x.x.x
的格式来表示,每个x
为8bit,即每个x
的十进制值为0-255,这种表示方法称为点分十进制表示。另外,IP地址可以分为网络号和主机号两部分
在任何网络段中,主机号全为0的称为网络地址、主机号全为1的称为广播地址,不能分配给网络中的主机使用
ABC三类IP地址
A类
A类地址的二进制第一位为0,网络号共8位也就是网络号区间为$ [0,127]$,分别为
0.0.0.0 … 0.255.255.255 1.0.0.0 … 1.255.255.255 … 127.0.0.0 … 127.255.255.255 0.0.0.0\ \dots\ 0.255.255.255\\ 1.0.0.0\ \dots\ 1.255.255.255\\ \dots\\ 127.0.0.0\ \dots\ 127.255.255.255\\ 0.0.0.0 … 0.255.255.2551.0.0.0 … 1.255.255.255…127.0.0.0 … 127.255.255.255
其中,网络号为0的作为A类地址的网络地址,网络号为127的作为回送地址,用于网络软件测试和本地进程间的通信。也就是说,A类地址中的网络数最多为 2 7 − 2 = 126 2^7-2=126 27−2=126个
在A类地址中,网络号为10的一般作为专用地址,给局域网中的主机使用
B类
B类地址二进制以10开头,网络号区间为 [ 128 , 191 ] [128, 191] [128,191]
128.0.0.0 … 128.255.255.255 129.0.0.0 … 129.255.255.255 … 191.0.0.0 … 191.255.255.255 128.0.0.0\ \dots\ 128.255.255.255\\ 129.0.0.0\ \dots\ 129.255.255.255\\ \dots\\ 191.0.0.0\ \dots\ 191.255.255.255\\ 128.0.0.0 … 128.255.255.255129.0.0.0 … 129.255.255.255…191.0.0.0 … 191.255.255.255
其中,网络号为128.0的作为B类地址的网络地址,也就是说,B类地址中的网络数最多为 2 14 − 1 2^{14}-1 214−1个
在B类地址中,网络号172.16~172.31一般作为专用地址,给局域网中的主机使用
C类
C类地址以110开头,网络号区间为 [ 192 , 223 ] [192,223] [192,223]
192.0.0.0 … 192.255.255.255 193.0.0.0 … 193.255.255.255 … 223.0.0.0 … 223.255.255.255 192.0.0.0\ \dots\ 192.255.255.255\\ 193.0.0.0\ \dots\ 193.255.255.255\\ \dots\\ 223.0.0.0\ \dots\ 223.255.255.255\\ 192.0.0.0 … 192.255.255.255193.0.0.0 … 193.255.255.255…223.0.0.0 … 223.255.255.255
其中,网络号为192.0.0的作为B类地址的网络地址,也就是说,B类地址中的网络数最多为 2 21 − 1 2^{21}-1 221−1个
在B类地址中,网络号192.168.0~192.168.255一般作为专用地址,给局域网中的主机使用
子网及子网掩码
使用子网概念的目的是为了将网络划分为多个部分供内部使用,但对于外部来说,仍像一个网络一样
子网地址的结构
子网地址是三级的地址结构,即网络号+子网号+主机号,可以应用于A、B、C三类IP地址。同一个网络中的几个子网在外部看来,仍为一个网络,即子网对外部网络透明
子网掩码
子网掩码也称为子网屏蔽码,可以用来从三级IP地址中提取出网络号。
通过子网掩码计算出本机的网络号和欲通信的目标主机的网络号比较这两个网络号,就可以知道接受方主机是否在本网络上。
如果网络号相同,表明接受方在本网络上,那么可以通过相关的协议把数据包直接发送到目标主机;如果网络号不同,表明目标主机在远程网络上,那么数据包将会发送给本网络上的路由器,由路由器将数据包发送到其他网络,直至到达目的地。
将IP地址和对应的子网掩码,做二进制“与运算”即可得到网络号。也就是说,A类地址的子网掩码为255.0.0.0
(即1111111100000...000(24个0)
);B类地址的子网掩码为255.255.0.0
;C类地址的子网掩码为255.255.255.0
另外,还可以使用/网络号长度+子网号长度
的形式来表示子网掩码,例如对于子网掩码255.255.252.0
也可以表示为/22
对于划分了子网的三级结构,一般为A、B、C类地址中的一种,通过三类地址前1-3bit判断是哪一种标准IP地址,再结合对应的子网掩码就可以得到子网号的部分。
需要注意的是,IP地址本身始终保持32bit的长度,并且三类标准IP地址自身的网络号长度也不改变,子网号占用的是原本主机号部分的长度
例如,对一个需要分64个子网的B类地址,结构为
二进制10开头的16bit网络号+6bit长的子网号+10bit长的主机号
共32bit长
无类域间路由技术CIDR
CIDR使用网络前缀代替标准分类的IP地址的网络号与主机号,不再使用子网的概念,也就是说IP地址是一个二级结构。这个二级结构以网络前缀 主机号
的形式表示。同样的,对于掩码也可以使用斜杠形式表示。
在CIDR中,将网络前缀相同的连续IP地址组成一个 “CIDR地址块”,这个块的大小是可变的,可以将某块地址分配给包括ISP在内的各个机构。
CIDR地址块
一个CIDR地址块由块起始地址与块地址数来表示,以200.16.23.0/20
为例,其起始地址为200.16.23.0
,即网络前缀。这个CIDR地址块中有$ 2{32-20}=2{12}
个
地
址
,
将
这
些
地
址
分
配
给
各
个
主
机
,
也
就
是
说
能
给
个地址,将这些地址分配给各个主机,也就是说能给
个地址,将这些地址分配给各个主机,也就是说能给 2^{12}$个主机分配地址。200.16.23.0/20
对应了20bit长的网络前缀+12bit长的主机号
同样的,对于CIDR来说,主机号全为1的地址为(直接)广播地址
广播地址举例
156.25.0.0/16
:16bit网络前缀+16bit主机号,广播地址为156.25.255.255
156.25.0.0/28
:28bit网络前缀+4bit主机号,广播地址为156.25.0.15
195.1.22.64/27
:27bit网络前缀+5bit主机号,广播地址为195.1.22.95
理论上来说,掩码不一定由连续的1组成,例如掩码255.255.254.112
,但这样非常难以管理,一般不使用
CIDR地址规划方法
也是通过向主机号“借位”用于网络号,达到子网划分的效果
以
200.16.23.0/20
为例,要将该地址块均分为4个更小的地址块,需要向地址块借用2bit,分好的4个地址为:200.16.23.0/22
、200.16.27.0/22
、200.16.31.0/22
、200.16.35.0/22
例子中分好的4个地址的前20bit是相同的,由此说明CIDR有地址聚合与路由聚合的能力,将多个地址归并到单一的网络中(构造超网),并且在转发表中只使用一项来表示这些地址,可以减少路由表的压力
最长前缀匹配
使用CIDR进行路由聚合之后,转发表中可能会同时存在好几个可以与目的IP地址匹配的项,此时应选择具有最长网络前缀的路由表项,这就是最长前缀匹配,这样的选择可以使得转发的位置更具体
IP地址相关的解题步骤
IP地址规划方法
一般来说,网络地址规划分6步进行:判断用户对网络与主机数的需求,计算满足用户需求的基本网络地址结构,计算地址掩码,计算网络地址,计算网络广播地址,计算网络主机地址
1.判断网络与主机数的需求
即需要得到网络中最多可能使用的子网数量 N_{net}、网络中最大网段的最多主机数量 N_{host}
2.确定合适的基本网络地址结构
根据 N_{net}确定子网号段的长度 X,使得 N_{net} \le 2^X;根据 N_{host}确定主机号段的长度 Y,使得 N_{host} \le 2^Y
X+Y即为除去网络号段后的长度,据此可确定需要使用的IP地址标准
例如当 X=4,Y=6时,共需要10bit的主机号,则需要使用一块B类地址或两块C类地址
3.计算地址掩码
结合需要的子网号段长度 X确定具体的IP地址结构,确保通过掩码计算出的结果为主机号即可。
也就是说,对于具体的地址结构,开头是所选IP类别对应长度的网络号,接着是 Xbit的子网号,剩下的都给主机号使用
例如当 X=4,Y=6时,选用一块B类地址,其掩码应为
255.255.240.0
,即16+4个1与12个0的组合
4.计算网络地址
需要注意的是,主机号全为0或1的作特殊用途,因此每个子网中实际上最多有 2^Y-2个主机。在二进制下可以计算各个子网的网络号。最初有规定不使用第一个和最后一个子网的地址
例如若第一个网络号为
128.5.0.0
,则各子网的网络号为128.5.0.0
、128.5.16.0
、128.5.32.0
、…、128.5.240.0
5.计算网络广播地址
每个子网的网络广播地址,为各子网的网络号加上主机号全置1,也就是下一个子网网络号减1
继上例,各子网的定向广播地址为
128.5.15.255
、128.5.31.255
、128.5.63.255
、…、128.5.255.255
6.计算各子网中的主机IP地址
显然,主机IP地址不能使用子网的网络地址、也不能使用子网的定向广播地址,介于这两者之间的IP地址就是可用的主机IP地址
继上例,各子网的主机IP地址范围为
128.5.0.1-128.5.15.254
、128.5.16.1-128.5.31.254
、128.5.32.1-128.5.63.254
…、128.5.240.1-128.5.255.254
可变长度子网掩码VLSM地址规划方法
可变长度子网掩码VLSM(Variable Length Subnet Mask)对子网进行层次化编址,以便最有效的利用现有的地址空间。这种技术适用于网络内部不同网段需要不同大小子网的情形。
直观地来说,就是把子网继续分割为若干更小的子网
一般分为3步:根据用户需求确定子网数、计算各子网掩码、确定各子网的IP地址区间
1.确定子网数
调查实际需求,获取需要分的子网数及各子网将要添加的主机数
例子中需要分5个子网,3个子网中需要的主机数分别为25、12、10、6、2
上级分配的网络地址为
192.168.10.0
2.计算子网掩码
VLSM的核心思想就是向主机号头部“借位”,使得出现更小的子网,但是对于整体来说,各个子网仍然是逐个递增的样子
分子网时,一般按主机数从大到小来分
第一个子网
25个主机,需要长为5bit的主机号,则借用主机号作为网络号的是3bit,那么该子网的网络地址为192.168.10.0/27
第二个子网
在第一个子网分完的基础上,从192.168.10.32/27
开始继续分。12个主机,主机号需要4bit,网络号增加4bit,该子网的网络地址为192.168.10.32/28
第三个子网
从192.168.10.48/28
开始。10个主机,主机号需要4bit,网络号增加4bit,该子网的网络地址为192.168.10.48/28
第四个子网
从192.168.10.64/28
开始。6个主机,主机号需要3bit,网络号增加5bit,该子网的网络地址为192.168.10.64/29
第五个子网
从192.168.10.72/29
开始。2个主机,主机号需要2bit,网络号增加6bit,该子网的网络地址为192.168.10.72/30
3.确定IP区间
子网 | 子网地址 | 广播地址 | 可用主机IP区间 |
---|---|---|---|
子网1 | 192.168.10.0/27 | 192.168.10.31 | 192.168.10.1-192.168.10.30 |
子网2 | 192.168.10.32/28 | 192.168.10.47 | 192.168.10.33-192.168.10.46 |
子网3 | 192.168.10.48/28 | 192.168.10.63 | 192.168.10.49-192.168.10.62 |
子网4 | 192.168.10.64/29 | 192.168.10.71 | 192.168.10.65-192.168.10.70 |
子网5 | 192.168.10.72/30 | 192.168.10.75 | 192.168.10.73-192.168.10.74 |
CIDR地址规划方法
也是通过向主机号“借位”用于网络号,达到子网划分的效果
以
200.16.23.0/20
为例,要将该地址块均分为4个更小的地址块,需要向地址块借用2bit,分好的4个地址为:200.16.23.0/22
、200.16.27.0/22
、200.16.31.0/22
、200.16.35.0/22
例子中分好的4个地址的前20bit是相同的,由此说明CIDR有地址聚合与路由聚合的能力。CIDR通常用在将多个C类地址归并到单一的网络中,并且在路由表中只使用一项来表示这些C类IP地址,可以减少路由表的压力
网际协议——IP
基本概念
-
IP是TCP/IP体系中的两个主要协议之一
-
常与IP协议配套使用的其他三个协议
-
地址解析协议ARP(Address Resolution Protocol)
-
互联网控制报文协议ICMP(Internet Control Message Protocol)
-
互联网组管理协议IGMP(Internet GROUP Management Protocol)
在RFC标准中,ARP协议是放在数据链路层中的,其作用是处理IP和MAC之间的转换,与各种网络接口相关;而ICMP和IGMP使用了IP协议
-
-
不同网络之间差异是非常大的(例如在用户接入控制、管理控制方式、差错恢复方法上),需要一些中间设备将不同网络连接
-
物理层中间设备:转发器Repeater
-
数据链路层中间设备:网桥/桥接器Bridge
-
网络层中间设备:路由器Router
-
网络层以上中间设备:网关Gateway
-
-
当研究网络层时,可以将IP数据报视为在不同主机的网络层之间传送
路由转发
路由器是处于第三层网络层的设备,它可以看到数据报首部包含的IP地址。在要转发数据报时,它会将IP数据报重新封装成MAC帧,修改MAC帧首部的源MAC和目的MAC地址,从而实现转发。事实上,路由器还会继续把MAC帧转变为物理层的比特流,以在物理链路上传送,上图中为了便于说明未画出物理层
以上图为例,说明整个转发过程
-
⭐️路由器R1左侧接口收到IP数据报后,逐项查找路由表,将数据报头部的目的IP地址IP2与各表项的子网掩码按位与,发现要到达IP2的网段,不是直连的网络,需要转发到下个路由,且下一跳地址为IP5
-
路由器R1查看ARP缓存表,是否存在IP5对应的表项
若存在,则将表项中的MAC地址(HA5)作为MAC帧的目的MAC地址,将表项中指出的自身接口的MAC地址(HA4)作为MAC帧的源MAC地址,最后从该接口发出即可
若不存在,则发起ARP请求,通过ARP协议获得相关表项
-
⭐️路由器R2左侧接口收到IP数据报后,同样逐项查找路由表,发现IP2对应的网段是直连的,不需要转发到下个路由了
-
路由器R2查看ARP缓存表,是否存在IP2对应的表项
同样通过ARP协议相关操作,将IP数据报封装成MAC帧,源MAC地址为HA6,目的MAC地址为HA2
需要注意的是,从始至终IP数据报首部的源IP和目的IP地址都不会变化,而MAC帧中的源MAC和目的MAC地址不断变化
地址解析协议ARP
在路由转发的过程中,我们得到了一个主机/路由器的IP地址,但是实际上需要知道相应的MAC地址,才能够使用MAC对数据进行传送。ARP的功能就是通过IP地址获得对应的MAC地址
需要注意的是,ARP协议完成的IP到MAC的转换仅限于同一局域网,也就是说,若要找的IP对应的主机和源主机不在同一局域网上,就无法成功进行转换
ARP高速缓存
即ARP表,其中的表项记录着IP地址、MAC地址、生存时间、类型等信息,主机和路由器都会有ARP高速缓存
存在时间超过生存时间(一般为10~20分钟)的表项会自动从ARP表中删除
ARP分组类型
ARP请求分组
想要知道IP对应MAC的主机/路由器在本局域网内广播ARP请求。显然,请求分组中需要明确发送方的IP和MAC地址、目标方的IP地址
ARP响应(应答)分组
目标方收到广播的ARP请求分组后,发现其中的IP和自己的一样,就会向发送方单播ARP响应分组。显然,这其中包括了自己的MAC地址
ARP报文格式
ARP报文承载在数据链路层上,因此其报文是一个MAC帧,格式如下图
其中标蓝色部分的内容是ARP协议中重点关注的内容
-
前14字节是MAC帧的首部,对于ARP来说,帧类型字段值为
0x0806
对于ARP请求分组,MAC地址为广播地址,即
0xFFFF-FFFF-FFFF
-
硬件类型:对于以太网来说,本字段值为1
-
协议类型:发送方要映射的协议地址类型。ARP显然要映射IP为MAC地址,对于IP地址,本字段值为
0x0800
-
硬件地址长度:即MAC地址长度,为6(字节)
-
协议地址长度:即IP地址长度(IPv4),为4(字节)
-
操作类型:1表示ARP请求报文,2表示ARP响应报文
-
源MAC:与帧头部中的以太网源MAC相同
-
目的MAC:ARP请求分组中还不知道目的MAC,此时本字段全为0,即
0x0000-0000-0000
❓诶,为什么IP字段只有4字节呢?IPv6怎么办?
🚩其实IPv6中不使用ARP协议😂
ARP协议工作流程
-
A想要知道IP为209.0.0.6主机的MAC地址,A在局域网上广播ARP请求
-
本局域网中的所有主机上运行的ARP进程都收到这个请求分组
-
主机B发现这个ARP请求中的IP字段是自己的IP,先将这个请求分组中的源MAC和源IP地址放到自己的ARP缓存中,然后在目的MAC中填入自己的MAC地址,向主机A单播ARP响应分组
-
A收到响应分组,将其中的目的MAC和目的IP放入自己的ARP缓存中
ARP使用场景
-
发送方是主机,目标方是同一网络中的另一台主机,就是上面例子中的场景,可以获得目标方主机的MAC地址
-
发送方是主机,目标方是另一网络中的一台主机,此时发送方会获得本网络上某路由器的MAC地址,而这台路由器需要执行下面3、4场景的工作
-
发送方是路由器,目标方是与该路由直接相连网络中的某台主机,这个路由器会向对应网络上广播ARP请求分组,以找到目标主机的MAC
-
发送方是路由器,目标方是不与该路由直连网络中的某台主机,这个路由器会向直连网络广播ARP请求,会获得某个与本路由器相邻网络相连的另一台路由器的MAC
网际互连协议IP
IP协议中的分组就是IP数据报,一个数据报由首部和数据两部分构成,而首部也分为两个部分,前一部分固定为20字节,后一部分有一些可选的字段。也就是说,IP数据报首部的长度是可变的
下面的IP报文格式使用的是IPv4下的格式
IP报文格式
-
版本:占4bit,指明IP协议的版本,IPv4时值为4、IPv6时值为6
-
首部长度:占4bit,由于首部有可选字段,因此需要指出首部的长度
-
区分服务:占8bit,也称为服务类型,当有区分服务要求时这个字段才有意义
-
总长度:占16bit,整个IP数据报的长度,包括首部和数据,单位为字节,显然最大为65535,但往往不会发这么大的数据报,不能超过数据链路层的MTU大小要求
-
标识(identification):占16bit,主机在发送数据报的过程中会维持一个计数器,当IP数据报需要分片时,会将计数器的值复制到所有IP分片中,标识这些分片是同一组的
-
标志(flag):占3bit,从低位到高位分别为0、DF(Don’t Fragment)、MF(More Fragment)
若DF为1,表示不能分片;若MF为0,表示当前是分片的最后一片
显然,只有当DF为0时,MF才有意义
-
片偏移:占13bit,指出了分片在原分组中的相对位置,以8个字节为一个单位
-
生存时间:占8bit,当前这个生存时间事实上应理解为可经过的最多路由数,即跳数限制,显然,生存时间的单位为跳数
路由在转发数据报前会将此字段减1,若此时减到了0,路由器会丢弃这个数据报
-
协议:占8bit,指明当前的IP数据报的数据部分使用的协议,以便收到的主机判断应将此数据交到上层的哪个协议进行处理
下表中是一些常见值
协议名 对应号码 协议名 对应号码 ICMP 1 IGP 9 IGMP 2 UDP 17 IP in IP 4 OSPF 89 TCP 6 MPLS in IP 137 EGP 8 RIP 520 -
首部校验和:占16bit,用于校验数据报的首部(不包括数据部分)。每经过一个路由器,路由器都会重新计算下首部检验和
-
源IP和目的IP地址均为32bit
-
可选部分:长度可变,用于支持排错、测量以及安全等措施,长度1~40字节不等
-
填充字段:长度可变,全部填充0,需要将首部填充为32bit的倍数
首部校验和
需要注意的是,这是“首部”校验和,也就是数据部分不参与校验和的运算
IP数据报分片
受数据链路层规定的MTU的限制,IP数据报不能太大(显然最大不能大于65535,否则总长度段无法标识)。对于超过了MTU的IP数据报,需要进行分片。会将原数据报的首部复制到各片段中,并修改总长度、片偏移、标志、标识
片偏移指的是分片的数据部分在原数据报的数据部分中的相对位置,也就是说,起始0位置是原数据报中数据部分开始的位置
需要特别特别注意的是,由于片偏移字段是以8字节为单位的,也就是说,除了最后一个分片外(后面没有分片不用写片偏移了)每个分片数据部分的大小必须是8字节的整数倍
🌰分片例子1
有个数据报的总长度为3820B,但MTU只有1420B,并且首部只使用固定部分的20B,不使用可选部分,要求分片尽可能大,问如何分片
-
除去首部的20B,每个以太网帧上可以承载1400B的IP数据报数据部分,是8的整数倍,可以以此进行分片
-
原数据报的数据部分有3820-20=3800B,分为1400、1400、1000三段
-
决定三个分片首部要修改的部分,注意要给每个分片加上首部的长度
总长度 | 标识 | MF | DF | 片偏移 | |
---|---|---|---|---|---|
原数据报 | 3820 | 666 | 0 | 0 | 0 |
分片1 | 1420 | 666 | 1 | 0 | 0 |
分片2 | 1420 | 666 | 1 | 0 | 1400/8=175 |
分片3 | 1020 | 666 | 0 | 0 | 2800/8=350 |
分片示意图如下所示
🌰分片例子2
有个数据报的总长度为1580B,但MTU只有800B,并且首部只使用固定部分的20B,不使用可选部分,要求分片尽可能大,问如何分片
-
除去首部的20B,每个以太网帧上可以承载780B的IP数据报数据部分,不是8的整数倍,计算小于780的能被8整除的数,得到776
-
原数据报的数据部分有1580-20=1560B,分为776、776、8三段
-
决定三个分片首部要修改的部分,注意要给每个分片加上首部的长度
总长度 | 标识 | MF | DF | 片偏移 | |
---|---|---|---|---|---|
原数据报 | 1580 | 555 | 0 | 0 | 0 |
分片1 | 796 | 555 | 1 | 0 | 0 |
分片2 | 796 | 555 | 1 | 0 | 776/8=97 |
分片3 | 28 | 555 | 0 | 0 | 1552/8=194 |
网际控制报文协议ICMP
ICMP的使得主机或路由器可以报告差错情况,并可以提供有关异常情况的报告。ICMP事实上是封装在IP数据报中的,也就是说把ICMP的报文作为IP数据报的数据部分
ICMP报文分类
差错报告报文
作用是通知主机、路由器网络中发生了什么情况
这一分类下常用的报文类型有终点不可达(3)、超时(11)、参数问题(12)、改变路由重定向(5)
询问报文
用于进行ping请求以及一些其他的信息请求
这一分类下常用的报文类型有回显请求(8)、回显应答(0)、时间戳请求(13)、时间戳应答(14),前两种是ping命令用到的报文类型,后两种目前已经废弃不使用了
ICMP报文格式
-
类型:占8bit,用来标识报文的类型
-
代码:占8bit,进一步指出某类型中的信息
-
校验和:占16bit,与IP数据报中的首部校验和计算方法相同,校验的范围是整个ICMP报文(包括ICMP数据部分)
-
首部其他部分:占32bit,根据不同的报文类型,有不同的作用
-
后面的字段根据不同类型的报文有不同的格式约定,长度是可变的
ICMP差错报告报文
数据部分
以下四种类型的ICMP报文的数据部分的结构是相同的,都是由原IP数据报首部和原IP数据报数据部分的前8字节组成
终点不可达
类型编号为3,当路由器或主机不能交付数据报时,向源点发送ICMP终点不可达报文
在此类型下,对应的代码包括0~15,常见的有:网络不可达(0)、主机不可达(1)、端口不可达(3)、目的网络不认识(6)
超时
类型编号为11
-
当生存时间TTL减为0时,路由器会丢弃该数据报,并向源点发送ICMP超时报文,对应代码为0
-
当终点在约定时间内未收到一个数据报中所有数据报片时,会将已收到的报片全部丢弃,并向源点发送ICMP超时报文,对应代码为1
用于路由跟踪的tracert这样的命令,都是利用了ICMP超时报文,其发送一串TTL字段不同的IP数据报,发出TTL字段为1的,收到的ICMP超时报文就是接触到的第一个路由返回的;TTL字段为2的,就是第二个路由返回的,以此类推
参数问题
路由器或主机发现收到的数据报首部中有些字段的指明不正确时,会丢弃该数据报,并向源点发送ICMP参数问题报文
这个类型的只有一个代码0
改变路由重定向
当路由器检测到有主机或网络设备使用非优化路由时,向该主机或网络设备发送一个ICMP重定向报文,请求其改变路由
此类型包括四个代码:对网络重定向(0)、对主机重定向(1)、对服务类型和网络重定向(2)、对服务类型和主机重定向(3)
不发送ICMP差错报告报文的情况
-
对于ICMP报文差错报告报文本身,不再发送
-
对于分片了的数据报,只针对第一个分片发送,对后续的报片都不发送
-
对具有多播地址的数据报不发送
-
对于特殊地址的数据报不发送
ICMP询问报文
回显请求与应答报文
ping命令使用的报文,类型编号分别为8和0,用于测试网络站点的状态。主机或路由器向某特定目的主机ICMP回送请求报文询问,目的主机收到该询问后必须给源主机或路由器发送ICMP回送应答报文
时间戳请求与应答报文
ICMP时间戳报文中附带了请求发送和应答发送的时间,可以据此计算出当前的网络往返时延
ICMP的应用
Ping命令
分组网间探测PING(Packet InterNet Groper),可用于测试两台主机之间的连通性
ping命令会直接发送ICMP回显请求报文,由于回显请求与应答报文中都带有时间戳,因此可以计算得到网络的往返时间
Traceroute命令
通过这一类跟踪路由的命令可以得到数据报在网络中从源点到终点的路径
traceroute命令发送的是一串IP数据报,其中封装的是无法交付的UDP用户数据报(通过使用非法端口号实现),通过上面提到过的设置不同TTL字段的方法得到经过的路径。
最终发送的IP数据报会到达目的主机,该主机发现该数据报中封装的UDP用户数据报是无法交付的,就会向源主机发送ICMP终点不可达报文
址的数据报不发送
- 对于特殊地址的数据报不发送
ICMP询问报文
回显请求与应答报文
ping命令使用的报文,类型编号分别为8和0,用于测试网络站点的状态。主机或路由器向某特定目的主机ICMP回送请求报文询问,目的主机收到该询问后必须给源主机或路由器发送ICMP回送应答报文
时间戳请求与应答报文
ICMP时间戳报文中附带了请求发送和应答发送的时间,可以据此计算出当前的网络往返时延
ICMP的应用
Ping命令
分组网间探测PING(Packet InterNet Groper),可用于测试两台主机之间的连通性
ping命令会直接发送ICMP回显请求报文,由于回显请求与应答报文中都带有时间戳,因此可以计算得到网络的往返时间
Traceroute命令
通过这一类跟踪路由的命令可以得到数据报在网络中从源点到终点的路径
traceroute命令发送的是一串IP数据报,其中封装的是无法交付的UDP用户数据报(通过使用非法端口号实现),通过上面提到过的设置不同TTL字段的方法得到经过的路径。
最终发送的IP数据报会到达目的主机,该主机发现该数据报中封装的UDP用户数据报是无法交付的,就会向源主机发送ICMP终点不可达报文