目录
一、上层协议
1、上层协议类型
在剥掉帧的头部和尾部之前,网络设备需要根据帧头中Type 字段确定下一步将帧发送到哪个上层协议进行处理。以太网帧中的Type 字段值为0x0800,表示该帧的网络层协议为IP 协议。
下图案例中的帧头部Type 字段表示该帧需要上送到IP 协议进行处理。以下将介绍帧的头部和尾部被剥掉后,IP协议将如何处理帧中的数据。
2、IP 协议
1. IP 报文头部
IP 报文头部长度为20 到60 字节,报文头中的信息可以用来指导网络设备如何将报文从源设备发送到目的设备。其中,版本字段表示当前支持的IP 协议版本,当前的版本号为4。DS 字段早期用来表示业务类型,现在用于支持QoS 中的差分服务模型,实现网络流量优化。
- 版本到目标地址共计20 字节(固定)
- 可选项最大40 字节(不固定)
- IP 报头最大60 字节
如下图所示:
源和目的IP 地址是分配给主机的逻辑地址,用于在网络层标识报文的发送方和接收方。根据源和目的IP 地址可以判断目的端是否与发送端位于同一网段,如果二者不在同一网段,则需要采用路由机制进行跨网段转发。
IP 报文头字段 | 说明 |
Version (版本) |
告知IP 地址是ipv4(0100)还是IPv6(0110)
|
Header Length(首部长度)
|
告知这个数据包有没有可选项 (由于ip 包头长度不固定,所以要告知长度)
|
DS Field(差异化服务)
|
Differentiated Services Field
一般是运营商使用来控制专线网速,控制不同的服务的网速;
最后一个字节保留。
优先级(QOS) 和服务类型(TOS)
|
Total Length(总长度)
|
上三层的总长度/IP 包的总长度,
当总长度超过1500 字节,需要进行IP 分片
|
Identification(标识符)
|
区分不同的IP 分片数据流
|
Flags(标志位)
|
三个bit 位
第一位未启用为0;
第二位表示是否分片:
* 需要分片第二位为0;
* 不需要分片第二位为1;
第三位比特为1 代表还有后续分片,为0 代表为最后一个分片
标志位三种情况:
{001| 000| 010}
|
Fragment offset(段偏移量)
|
决定了IP 分片的先后顺序。只能是0 或1480 的倍数
|
TTL
|
生存时间,单位为跳数,作用是防止数据包在网络中永久的循环。
TTL 范围:1 - 255;
* windows 系统TTL 一般为128
* Linux 系统一般为1 - 128 之间,如56,64
* 跳点跟踪:tracert
www.baidu.com
|
协议号
|
作用是区分上层协议的;
* 6 代表TCP;
* 17 代表UDP。
|
首部校验和
|
校验三层IP 包头
|
2.IP 分片
网络中转发的IP 报文的长度可以不同,但如果报文长度超过了数据链路所支持的最大长度,则报文就需要分割成若干个较小的片段才能够在链路上传输。将报文分割成多个片段的过程叫做分片。
接收端根据分片报文中的标识符(Identification),标志(Flags),及片偏移量(Fragment Offset)字段对分片报文进行重组。标识符用于识别属于同一个数据包的分片,以区别于同一主机或其他主机发送的其它数据包分片,保证分片被正确的重新组合。标志字段用于判断是否已经收到最后一个分片。最后一个分片的标志字段设置为0,其他分片的标志字段设置为1,目的端在收到标志字段为0 的分片后,开始重组报文。片偏移字段表示每个分片在原始报文中的位置。第一个分片的片偏移为0,第二个分片的片偏移表示紧跟第一个分片后的第一个比特的位置。
列如:
0 今天 001
1480 晚上 001
2960 加班 000
3.生存时间
报文在网段间转发时,如果网络设备上的路由规划不合理,就可能会出现环路,导致报文在网络中无限循环,无法到达目的端。环路发生后,所有发往这个目的地的报文都会被循环转发,随着这种报文逐渐增多,网络将会发生拥塞。
为避免环路导致的网络拥塞,IP 报文头中包含一个生存时间TTL(Time To Live)字段。报文每经过一台三层设备,TTL 值减1。初始TTL 值由源端设备设置。当报文中的TTL 降为0 时,报文会被丢弃。同时,丢弃报文的设备会根据报文头中的源IP 地址向源端发送ICMP 错误消息。
4.协议号
目的端的网络层在接收并处理报文以后,需要决定下一步对报文该做如何处理。IP 报文头中的协议字段标识了将会继续处理报文的协议。与以太帧头中的Type 字段类似,协议字段也是一个十六进制数。该字段可以标识网络层协议,如ICMP(Internet Control Message Protocol,因特网控制报文协议),也可以标识上层协议,如TCP(Transmission Control Protocol,传输控制协议,对应值0x06)、UDP(User Datagram Protocol,用户数据包协议,对应值0x11)。
二、ICMP 协议分析
Internet 控制消息协议ICMP(Internet Control Message Protocol)是网络层的一个重要协议。ICMP 协议用来在网络设备间传递各种差错和控制信息,并对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。
1、ICMP 协议原理
ICMP 是TCP/IP 协议簇的核心协议之一,它用于在IP 网络设备之间发送控制报文,传递差错、控制、查询等信息。
1.ICMP重定向
ICMP Redirect 重定向消息用于支持路由功能。
如下图所示,主机A 希望发送报文到服务器A,于是根据配置的默认网关地址向网关RTB 发送报文。网关RTB 收到报文后,检查报文信息,发现报文应该转发到与源主机在同一网段的另一个网关设备RTA,因为此转发路径是更优的路径,所以RTB 会向主机发送一个Redirect 消息,通知主机直接向另一个网关RTA 发送该报文。主机收到Redirect 消息后,会向RTA 发送报文,然后RTA 会将该报文再转发给服务器A。
2. ICMP 差错检测
ICMP Echo Request 和ICMP Echo Reply 分别用来查询和响应某些信息,进行差错检测。
ICMP Echo 消息常用于诊断源和目的地之间的网络连通性,同时还可以提供其他信息,如报文往返时间等。
3.ICMP 错误报告
当网络设备无法访问目标网络时,会自动发送ICMP 目的不可达报文到发送端设备。
ICMP 定义了各种错误消息,用于诊断网络连接性问题;根据这些错误消息,源设备可以判断出数据传输失败的原因。比如,如果网络中发生了环路,导致报文在网络中循环,且最终TTL 超时,这种情况下网络设备会发送TTL 超时消息给发送端设备。又比如如果目的地不可达,则中间的网络设备会发送目的不可达消息给发送端设备。目的不可达的情况有多种,如果是网络设备无法找到目的网络,则发送目的网络不可达消息;如果网络设备无法找到目的网络中的目的主机,则发送目的主机不可达消息。
4.ICMP 数据包格式
Type 表示ICMP 消息类型,Code 表示同一消息类型中的不同信息。
ICMP 消息封装在IP 报文中。ICMP 消息的格式取决于Type 和Code 字段,其中Type 字段为消息类型,Code 字段包含该消息类型的具体参数。
后面的校验和字段用于检查消息是否完整。消息中包含32 比特的可变参数,这个字段一般不使用,通常设置为0。在ICMP Redirect 消息中,这个字段用来指定网关IP 地址,主机根据这个地址将报文重定向到指定网关。在Echo 请求消息中,这个字段包含标识符和序号,源端根据这两个参数将收到的回复消息与本端发送的Echo 请求消息进行关联。尤其是当源端向目的端发送了多个Echo 请求消息时,需要根据标识符和序号将Echo 请求和回复消息进行一一对应。
5.ICMP 消息类型和编码类型
ICMP 定义了多种消息类型,并用于不同的场景。有些消息不需要Code 字段来描述具体类型参数,仅用Type 字段表示消息类型。比如,ICMP Echo 回复消息的Type 字段设置为0。
有些ICMP 消息使用Type 字段定义消息大类,用Code 字段表示消息的具体类型。比如,类型为3 的消息表示目的不可达,不同的Code 值表示不可达的原因,包括目的网络不可达(Code=0)、目的主机不可达(Code=1)、协议不可达(Code=2)、目的TCP/UDP 端口不可达(Code=3)等。
Type 类型 | Code 编码 | 描述 |
0 | 0 |
Echo Reply
|
3 3 | 0 1 |
网络不可达
主机不可达
|
3 3 | 2 3 |
协议不可达
端口不可达
|
5 8 | 0 0 |
重定向
Echo Request
|
2、ICMP 应用
1. 网络连通性测试
ICMP 的一个典型应用是Ping。Ping 是检测网络连通性的常用工具,同时也能够收集其他相关信息。用户可以在Ping 命令中指定不同参数,如ICMP 报文长度、发送的ICMP 报文个数、等待回复响应的超时时间等,设备根据配置的参数来构造并发送ICMP 报文,进行Ping 测试。
ping 命令参数 | 解释 |
-a
<source-ip-address>
|
指定发送ICMP ECHO-REQUEST 报文的源IP 地址。
如果不指定源IP 地址,
将采用出接口的IP 地址作为ICMP ECHO-REQUEST 报文发送的源地址。
|
-c
<count>
|
指定发送ICMP ECHO-REQUEST 报文次数。
缺省情况下发送5 个ICMP ECHO-REQUEST 报文。
|
-h
<ttl-value>
|
指定TTL 的值。缺省值是255。
|
-t
<timeout>
|
指定发送完ICMP ECHO-REQUEST 后,
等待ICMP ECHO-REPLY 的超时时间
|
2.路由追踪
ICMP 的另一个典型应用是Tracert。Tracert 基于报文头中的TTL 值来逐跳跟踪报文的转发路径。为了跟踪到达某特定目的地址的路径,源端首先将报文的TTL 值设置为1。该报文到达第一个节点后,TTL 超时,于是该节点向源端发送TTL 超时消息,消息中携带时间戳。然后源端将报文的TTL 值设置为2,报文到达第二个节点后超时,该节点同样返回TTL 超时消息,以此类推,直到报文到达目的地。这样,源端根据返回的报文中的信息可以跟踪到报文经过的每一个节点,并根据时间戳信息计算往返时间。Tracert 是检测网络丢包及时延的有效手段,同时可以帮助管理员发现网络中的路由环路。
tracert 常用参数 | 说明 |
-a
<source-ip-address>
|
指定tracert 报文的源地址。
|
-f
<first-ttl>
|
指定初始TTL。缺省值是1。
|
-m
<max-ttl>
|
指定最大TTL。缺省值是30。
|
-name
|
显示每一跳的主机名。
|
-p
<port>
|
指定目的主机的UDP 端口号
|
Type 表示ICMP 消息类型,Code 表示同一消息类型中的不同信息。
源端(RTA)向目的端(主机B)发送一个UDP报文,TTL值为1,目的UDP 端口号是大于30000 的一个数,因为在大多数情况下,大于30000的UDP端口号是任何一个应用程序都不可能使用的端口号。
第一跳(RTB)收到源端发出的UDP 报文后,判断出报文的目的IP 地址不是本机IP 地址,将TTL值减1 后,判断出TTL值等于0,则丢弃报文并向源端发送一个ICMP 超时(Time Exceeded)报文(该报文中含有第一跳的IP地址10.0.0.2),这样源端就得到了RTB 的地址。
源端收到RTB 的ICMP 超时报文后,再次向目的端发送一个UDP 报文,TTL值为2。
第二跳(RTC)收到源端发出的UDP 报文后,回应一个ICMP 超时报文,这样源端就得到了RTC 的地址(20.0.0.2)。
以上过程不断进行,直到目的端收到源端发送的UDP 报文后,判断出目的IP 地址是本机IP 地址,则处理此报文。根据报文中的目的UDP 端口号寻找占用此端口号的上层协议,因目的端没有应用程序使用该UDP端口号,则向源端返回一个ICMP端口不可达(Destination Unreachable)报文。
源端收到ICMP 端口不可达报文后,判断出UDP报文已经到达目的端,则停止Tracert 程序,从而得到数据报文从源端到目的端所经历的路径 (10.0.0.2;20.0.0.2;30.0.0.2)。
如下图案例: