在《网络通信1(概念介绍)》文章中了解到网络层用于数据包封装、路由配置、路由选择和差错控制等功能。网络层常使用IP和ICMP等协议。
1.IP协议介绍
IP协议称为网际协议,负责Internet上网络之间的通信,并规定了将数据从一个网络传输到另一个网络所应遵循的规则。IP协议属于网络层,完成数据包封装、路由寻址和消息传递等功能。
1.1.IP协议的分片
在前面的文章中了解到对于过大数据,节点不会传输整个数据,而是将数据分割为一个个数据单元后传输数据单元,但由于受硬件、操作系统、通信协议等因素的影响,每个节点一次能够传输多大的数据单元是不同的,因此当节点收到的数据过大时,会在网络层将数据进行分割,这个分割动作被称为分片。
节点一次能够传输的最大数据单元被称为最大传输单元,简称为MTU,单位为字节。在以太网环境中,MTU的大小通常为1500字节,如下图所示:
MTU本质上限制的是数据包最大可为多少字节(数据包后续介绍),由于数据包是由包头、段头和报文组成,因此报文最大长度=MTU值-包头大小-段头大小。
- 分段和分片的区别
分段是指根据通信双方的MTU值计算获得MSS值,然后根据MSS值在传输层将大报文分割成多个小报文。分段只涉及到发送者和接收者,与两者之间的节点无关。如下图:分段与计算机A和计算机B相关,与路由器A和路由器B无关。
分片是指上一个节点传输的数据大小大于本节点的MTU值时,本节点会根据自己的MTU值对数据进行分割。如下图:若路由器A从计算机A收到的数据大于路由器A的MTU值时,则路由器A在网络层对数据进行分片;若路由器B从路由器A收到的数据大于路由器B的MTU值时,则路由器B在网络层对数据再次进行分片。
- 分片图解
假如上图计算机A发送给计算机B的数据中报文段大小为1370字节,其中报文段的段头大小为20字节和报文大小为1350字节;路由器A的MTU值为640字节;路由器B的MTU值为440字节。
由于分片分割的是报文,而MTU限制的是路由器转发的数据包最大是多大,所以要通过公式计算每个分片报文最大长度(报文最大长度=MTU值-包头大小-段头大小),假设数据包的包头大小为20字节,则路由器A能够转发的最大报文为600字节(600B=640B-20B-20B),路由器B能够转发的最大报文为400字节(400B=440B-20B-20B)。以一个数据段为例,示例如下图:
1.2.IP协议数据包格式
IP协议数据包有首部和数据两部分组成,首部是指下图包头,数据是指下图报/段头+报文。
IP协议数据包格式如下图
字段名称 | 描述 |
---|---|
IP Version | IP协议版本。目前IP协议版本分为IPv4和IPv6,要想使双方能够通信则需要保证双方使用相同的IP协议版本。此字段用于设置通信使用的IP协议版本,设置为4,则表示使用IPv4;设置为6,则表示使用IPv6。 IP协议版本占用4个比特位。 |
Header Length | 首部长度,也可称为数据偏移量。用于记录包头大小(即记录包头占用多少字节),也可理解为用于标记数据是从数据包的第几个字节开始。 首部长度占用4个比特位,但包头大小为20字节至60字节(即2480比特位至61440比特位),可以看出包头大小远远超过首部长度,那么首部长度是如何记录包头大小呢?说明如下: 4个比特位的十进制最大值是15,每个值代表4字节,如1代表4字节,2代表8字节……15代表60字节。可以看出数据包的包头大小必须是4的整数倍。若包头的实际大小不是4的整数倍,则在下面的Padding字段中自动填充一些内容,以满足包头大小是4的整数倍。 |
DS | 区分服务,旧标准中叫做服务类型。该字段定义上层协议对处理当前数据所期望的服务质量,并对数据按照重要性级别进行分配。前3位成为优先位,后面4位成为服务类型,最后1位为保留位。这些8位字段用于分配优先级、延迟、吞吐量以及可靠性。 区分服务占用8个比特位。 |
Total Length | 总长度。是指首部和数据总共占用多少字节。 总长度占用16个比特位。 |
Identification | 标识。数据段/报分片后会生成多个数据包,当接收者收到数据包后如何知道那些数据包源于同一个数据段/报,因此设计出此字段用于标识那些数据包源于同一个数据段/报。 标识过程: 发送者里的IP软件在存储器中维持一个计数器,每产生一个数据段/报,计数器就加1,并将此值赋值给此字段。示例如下图:以两个数据段为例,计数器当前值为1000。 标识占用16个比特位。 |
R | 保留位。目前没有使用,保留后续使用。 保留位占用1个比特位。 |
DF | 用于标记当前数据是否可以分片。 DF占用1个比特位,其值只可是1或0。DF=0时允许分片;DF=1时不允许分片。 如果数据过大且设置DF=1,那么节点将丢弃数据并向发送者发送错误信息。这一功能在网络上常用于测试MTU值。 |
MF | 用于标记当前分片是否为最后一个分片。 MF占用1个比特位,其值只可是1或0。MF=1表示当前分片后面还有分片,MF=0表示当前分片是最后一个分片。如下图前两个数据包的MF=1,最后一个数据包的MF=0。 |
Fragment Offset | 片偏移。上述的标识字段用于标识那些数据包源于同一个数据段/报,但不能标识各个数据包的顺序,还是不能使接收者正确的重组各数据包,因此设计出此字段用于记录数据包中报文的起始位位于源数据段中报文第几个字节,以便标识数据包的顺序。 片偏移占用13个比特位。13个比特位的十进制最大值是8191,由于数据段中报文的字节数可能大于8191,使片偏移无法记录,因此设计出片偏移以8个字节为一个单位,即片偏移每个值代表8字节,如1代表8字节,2代表16字节……8191代表65528字节。需要注意每个数据包的报文大小不仅不可超过报文最大长度且必须使8的倍数。 片偏移标识数据包: |
Time To Live | 生存时间,又称跳数,简称为TTL。用于表示数据包在互联网中最多可经过多少个路由器。数据包每经过一个路由器,TTL值都会减1,当TTL值减为0时,路由器会丢弃该数据包并向发送者发送错误信息。TTL常见值为15、32或64。这种功能为了防止数据包在网络中无休止的传输。 生存时间占用8个比特位。 |
Protocol | 协议。用于接收者的网络层处理过数据后将数据交给那个协议进行处理。协议与Protocol值对应关系如下: 协议占用8个比特位。 |
Header Checksum | 首部校验和。用于校验首部是否在传输过程中出现差错,注意只校验首部,不校验数据部分。数据包每经过一个路由器都会重新计算校验和,这是因为每经过一个路由器,包头中TTL都会减1。 首部校验和占用16个比特位。 |
Source IP Address | 源IP地址。占用32个比特位。 |
Destination IP Address | 目的IP地址。占用32个比特位。 |
Options | 选项。用于传递一些额外的自定义的信息。 选项占用多少比特位由自定义信息的大小决定,最大不超过40字节(即40960个比特位)。 |
Padding | 填充。前面在讲“首部长度”时提到包头大小必须是4的整数倍。若包头的实际大小不是4的整数倍,则会在本字段填充一些内容,填充的内容一般是0。 Padding占用多少比特数由本字段填充多少内容决定。 |
data | 数据段、数据报或ICMP报文。 |
2.ICMP协议介绍
ICMP协议称为网络控制报文协议,用于DTE和路由器之间传递控制信息(控制信息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息)。
ICMP协议特点:
- ICMP协议不传输用户数据,只用于传输控制信息;
- ICMP协议是IP协议的一部分,储存于IP协议的数据部分,IP协议首部的Protocol字段值为1;
- ICMP协议属于网络层协议;
- 自动发送ICMP协议:当发送者向接收者发送数据后,若数据传输过程中出现了问题,导致数据不能到达接收者,则出问题处的设备会自动回复ICMP协议以告诉发送者出现了问题;
- 手动检测网络状态:使用ping命令和tracert命令主动向接收者发送ICMP协议,若传输过程中出现了问题,则出问题处的设备回复ICMP协议;若没有出问题,则接收者也回复IDMP协议。(后续会对ping命令做介绍。tracert命令请查看VRP命令手册)
2.1.ICMP协议格式
ICMP协议结构包括首部和数据部分,首部是指下图ICMP首部,数据是指下图ICMP数据部分。
ICMP协议格式如下图
字段名称 | 描述 |
---|---|
Type | 类型。表示ICMP协议的类型。 类型占用16个比特位。 |
Code | 代码。配合Type字段更深的细分ICMP协议的类型。 代码占用16个比特位。 |
Checksum | 校验和。用于校验数据传输过程中是否出错。 校验和占用32个比特位。 |
Data | 数据。用于记录控制信息。Type和Code不同记录的控制信息不同。 数据占用的比特位有Type和Code决定。 |
Type | Code | 描述 |
---|---|---|
0 | 0 | Echo Reply——回显应答(Ping应答) |
3 | 0 | Network Unreachable——网络不可达 |
1 | Host Unreachable——主机不可达 | |
2 | Protocol Unreachable——协议不可达 | |
3 | Port Unreachable——端口不可达 | |
4 | Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 | |
5 | Source routing failed——源站选路失败 | |
6 | Destination network unknown——目的网络未知 | |
7 | Destination host unknown——目的主机未知 | |
9 | Destination network administratively prohibited——目的网络被强制禁止 | |
10 | Destination host administratively prohibited——目的主机被强制禁止 | |
11 | Network unreachable for TOS——由于服务类型TOS,网络不可达 | |
12 | Host unreachable for TOS——由于服务类型TOS,主机不可达 | |
13 | Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 | |
14 | Host precedence violation——主机越权 | |
15 | Precedence cutoff in effect——优先中止生效 | |
4 | 0 | Source quench——源端被关闭(基本流控制) |
5 | 0 | Redirect for network——对网络重定向 |
1 | Redirect for host——对主机重定向 | |
2 | Redirect for TOS and network——对服务类型和网络重定向 | |
3 | Redirect for TOS and host——对服务类型和主机重定向 | |
8 | 0 | Echo request——回显请求(Ping请求) |
9 | 0 | Router advertisement——路由器通告 |
10 | 0 | Route solicitation——路由器请求 |
11 | 0 | TTL equals 0 during transit——传输期间生存时间为0 |
1 | TTL equals 0 during reassembly——在数据报组装期间生存时间为0 | |
12 | 0 | IP header bad (catchall error)——坏的IP首部(包括各种差错) |
1 | Required options missing——缺少必需的选项 | |
17 | 0 | Address mask request——地址掩码请求 |
18 | 0 | Address mask reply——地址掩码应答 |
2.2.ping命令
名称 | 描述 |
---|---|
命令格式 | ping ip-address |
功能说明 | 用来检测当前节点网络是否可达目的节点 |
ip-address参数 | 目的节点的IP地址 |
所属视图 | 所有视图 |
示例图
设备名称 | 参数配置 |
---|---|
PC1 | IP地址:192.168.1.1 子网掩码:255.255.255.0 网关:192.168.1.254 |
PC2 | IP地址:192.168.2.1 子网掩码:255.255.255.0 网关:192.168.2.254 |
AR1 | system-view interface GigabitEthernet 0/0/0 ip address 192.168.1.254 24 interface GigabitEthernet 0/0/1 ip address 192.168.2.254 24 |
在PC1电脑ping PC2电脑,如下图
出现上图绿圈的ping结果,表明pc1网络可到达pc2,两者通信正常。
ping过程:pc1向pc2发送ICMP Echo Request Message(即ICMP回显请求消息,其中ICMP首部的Type=8,Code=0),若pc1和pc2通信正常,则pc2向pc1回复ICMP Echo Reqly Message(即ICMP回显应答消息,其中ICMP首部的Type=0,Code=0)。
字段 | 描述 |
---|---|
ping 192.168.2.1 | 要ping的目的主机IP地址 |
32 data bytes | 发送ICMP回显请求消息的大小 |
press CTRL_C to break | 剪片操作CTRL+C将终止正在进行的ping测试 |
From 192.168.2.1: byts=32 seq=1 ttl=127 time=16ms | 目的主机对每个ICMP回显请求消息的应答情况:
|
192.168.2.1 ping statistics | 对目的主机进行ping测试的统计结果:
|
3.路由介绍
路由是指将数据从源节点传送到目标节点的行为和动作,执行这个行为动作的设备是路由器。路由的两个基本动作,分别是确定最佳路径(即路由选择)和传输数据。路由选择在《网络通信之基础》文章的“OSI参考模型”章节的“网络层”中介绍到当源节点数据到达目标节点有多个路径时,路由器会选择一个最佳路径进行数据传输。
路由器是如何选择最佳路径的?
每台路由器内会储存一张路由表,如下图所示(每一行都是一个路由),路由选择规则如下:
- 匹配规则1:首先路由器在网络层解封数据包获取目的IP地址,然后目的IP地址的网络地址与下图1处的目的网络地址匹配,若是没有匹配到则丢弃数据,且返回一个目标不可达的 ICMP 信息。若是匹配到且匹配到多个,请查看匹配规则2;
- 匹配规则2:若是目标IP地址的网络地址匹配到多个1处的目标网络地址,则比较2处的子网掩码,子网掩码越大,表示网络号下的主机号越少,匹配越精确,则会选择2处子网掩码大的路由。若是子网掩码相同,请查看匹配规则3;
- 匹配规则3:若是子网掩码相同,则匹配3处的路由类型(路由类型分为直连路由、静态路由和动态路由,后续会详细介绍),优先匹配直连路由,再匹配静态路由,最后匹配动态路由。若是路由类型相同,请查看匹配规则4;
- 匹配规则4:若是路由类型相同,则比较3处的优先级,优先级值越小路由越被优先选择。若是优先级相同,请查看匹配规则5;
- 匹配规则5:若是优先级相同,则比较5处的路由开销值,路由开销值越小路由越被优先选择。
根据上述的匹配规则可以选出一条路由,根据这条路由,路由器从7处可知数据从那个接口输出,从6处获取下一跳IP地址,根据下一跳IP地址从ARP表(ARP表后续详细介绍)中匹配MAC地址,根据MAC地址将数据传输到下一个节点(根据IP地址匹配MAC地址和根据MAC地址将数据传输到下一个节点在后续会详细介绍)。
对于Pre和Cost两个字段的值是根据不同的路由类型和网络配置情况自动计算得出的,也可以由管理员手动设置(后续会详细介绍)。
3.1.路由类型
上文讲到路由类型分为直连路由、静态路由和动态路由。如上图3处Proto字段的Direct、static和ospf,其中Direct表示直连路由,static表示静态路由,ospf是动态路由的一种。