内容正文:
IP协议栈
大家好,本节课我们开始学习IP协议栈的知识。
前期课程中,我们学习到IP协议(Internet Protocol,互联网协议),是TCP/IP协议栈中最核心的协议之一,通过IP地址,保证了联网设备的唯一性,实现了网络通信的面向无连接和不可靠的传输功能。
那么本节课,我们将继续深入了解下
1
IP协议
01
ICMP协议
02
目录
CONTENTS
本节课,我们将会讲授IP协议和ICMP协议
2
01 IP协议
以太网帧中的Type字段值为0x0800,表示该帧的网络层协议为IP协议。
上层协议类型
DMAC
Data
SMAC
Type
FCS
6 B
6 B
2 B
46-1500 B
4 B
0x0800
IP
灵石县第一职业高级中学
前期课程中,我们学习到IP协议(Internet Protocol,互联网协议),是TCP/IP协议栈中最核心的协议之一,通过IP地址,保证了联网设备的唯一性,实现了网络通信的面向无连接和不可靠的传输功能。
IP协议位于TCP/IP模型中的网络层,位于数据链路层之上,请大家回想下,在数据链路层中,是如何标识上层协议的?如PPT所示,协议规定帧头部中的Type字段表示该帧需要上送到IP协议进行处理。IP协议的标识的0x0800.
IP报文头部
Version
DS Field
Total Length
Identification
Flags
Fragment Offset
Time to Live
Protocol
Header Checksum
Source IP Address
Destination IP Address
IP Options
0 16 31
20 Bytes
固定长度
20-60 B
Data
IP
Header
Length
灵石县第一职业高级中学
IP报文头部信息用于指导网络设备对报文进行路由和分片。同一个网段内的数据转发通过链路层即可实现,而跨网段的数据转发需要使用网络设备的路由功能。
接下来,我们先看第一行的内容:
IP报文头部长度为20到60字节,默认为20字节,报文头中的信息可以用来指导网络设备如何将报文从源设备发送到目的设备。其中,版本字段表示当前支持的IP协议版本,当前的版本号为4。DS字段早期用来表示业务类型,现在用于支持QoS中的差分服务模型,实现网络流量优化。
源和目的IP地址是分配给主机的逻辑地址,用于在网络层标识报文的发送方和接收方。根据源和目的IP地址可以判断目的端是否与发送端位于同一网段,如果二者不在同一网段,则需要采用路由机制进行跨网段转发。
IP包分片
主机 A
主机 B
Version
DS Field
Total Length
Header Checksum
Source IP Address
Destination IP Address
IP Options
Header
Length
Protocol
Time to Live
Fragment Offset
Flags
Identification
灵石县第一职业高级中学
第二行的三个字段主要用于IP分片。
网络中转发的IP报文的长度可以不同,但如果报文长度超过了数据链路所支持的最大长度,则报文就需要分割成若干个较小的片段才能够在链路上传输。将报文分割成多个片段的过程叫做分片。
接收端根据分片报文中的标识符(Identification),标志(Flags),及片偏移(Fragment Offset)字段对分片报文进行重组。标识符用于识别属于同一个数据包的分片,以区别于同一主机或其他主机发送的其它数据包分片,保证分片被正确的重新组合。标志字段用于判断是否已经收到最后一个分片。最后一个分片的标志字段设置为0,其他分片的标志字段设置为1,目的端在收到标志字段为0的分片后,开始重组报文。片偏移字段表示每个分片在原始报文中的位置。第一个分片的片偏移为0,第二个分片的片偏移表示紧跟第一个分片后的第一个比特的位置。比如,如果首片报文包含1259比特,那么第二分片报文的片偏移字段值就应该为1260。
生存时间
主机 A
TTL=255
TTL=254
TTL=253
主机 B
Version
DS Field
Total Length
Header Checksum
Source IP Address
Destination IP Address
IP Options
Header
Length
Fragment Offset
Flags
Identification
Protocol
Time to Live
灵石县第一职业高级中学
报文在网段间转发时,如果网络设备上的路由规划不合理,就可能会出现环路,导致报文在网络中无限循环,无法到达目的端。环路发生后,所有发往这个目的地的报文都会被循环转发,随着这种报文逐渐增多,网络将会发生拥塞。
为避免环路导致的网络拥塞,IP报文头中包含一个生存时间TTL(Time To Live)字段。报文每经过一台三层设备,TTL值减1。初始TTL值由源端设备设置。当报文中的TTL降为0时,报文会被丢弃。同时,丢弃报文的设备会根据报文头中的源IP地址向源端发送ICMP错误消息。
协议号
IP
Data
Protocol
6/17
TCP/UDP
1
ICMP
Version
DS Field
Total Length
Header Checksum
Source IP Address
Destination IP Address
IP Options
Header
Length
Fragment Offset
Flags
Identification
Time to Live
Protocol
灵石县第一职业高级中学
目的端的网络层在接收并处理报文以后,需要决定下一步对报文该做如何处理。IP报文头中的协议字段标识了将会继续处理报文的协议。与以太帧头中的Type字段类似,协议字段也是一个十六进制数。该字段可以标识网络层协议,如ICMP(Internet Control Message Protocol,因特网控制报文协议),也可以标识上层协议,如TCP(Transmission Control Protocol,传输控制协议,对应值0x06)、UDP(User Datagram Protocol,用户数据包协议,对应值0x11)。
header checksum(头部效验):用于效验IPV4报文头部的完整性,防止IP包在传输中被破坏或者篡改
02 ICMP协议
接下来,我们学习另一个网络层的一个重要协议,就是Internet控制消息协议ICMP(Internet Control Message Protocol)。
9
ICMP用来传递差错、控制、查询等信息。
ICMP
Message
Return Message
主机 A
灵石县第一职业高级中学
ICMP协议用来在网络设备间传递各种差错和控制信息,并对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。
ICMP是TCP/IP协议簇的核心协议之一,它用于在IP网络设备之间发送控制报文,传递差错、控制、查询等信息。
ICMP Echo Request和ICMP Echo Reply分别用来查询和响应某些信息,进行差错检测。
ICMP差错检测
ICMP Echo Request
ICMP Echo Reply
主机 A
服务器 A
灵石县第一职业高级中学
ICMP Echo消息常用于诊断源和目的地之间的网络连通性,同时还可以提供其他信息,如报文往返时间等。
当网络设备无法访问目标网络时,会自动发送ICMP目的不可达报文到发送端设备。
ICMP错误报告
10.0.0.0/24
.1
20.0.0.0/24
数据包
ICMP目的不可达
主机 A
服务器 A
.2
.1
.2
RTA
RTB
灵石县第一职业高级中学
ICMP定义了各种错误消息,用于诊断网络连接性问题;根据这些错误消息,源设备可以判断出数据传输失败的原因。比如,如果网络中发生了环路,导致报文在网络中循环,且最终TTL超时,这种情况下网络设备会发送TTL超时消息给发送端设备。又比如如果目的地不可达,则中间的网络设备会发送目的不可达消息给发送端设备。目的不可达的情况有多种,如果是网络设备无法找到目的网络,则发送目的网络不可达消息;如果网络设备无法找到目的网络中的目的主机,则发送目的主机不可达消息。
Type表示ICMP消息类型,Code表示同一消息类型中的不同信息。
ICMP数据包格式
0
7
15
31
IP Header
ICMP
Type
Code
Checksum
ICMP的报文内容(不同类型和代码标识不同的内容)
FCS
Ethernet_II Header
灵石县第一职业高级中学
ICMP消息封装在IP报文中。ICMP消息的格式取决于Type和Code字段,其中Type字段为消息类型,Code字段包含该消息类型的具体参数。后面的校验和字段用于检查消息是否完整。消息中包含32比特的可变参数,这个字段一般不使用,通常设置为0。在ICMP Redirect消息中,这个字段用来指定网关IP地址,主机根据这个地址将报文重定向到指定网关。在Echo请求消息中,这个字段包含标识符和序号,源端根据这两个参数将收到的回复消息与本端发送的Echo请求消息进行关联。尤其是当源端向目的端发送了多个Echo请求消息时,需要根据标识符和序号将Echo请求和回复消息进行一一对应。
ICMP消息类型和编码类型
类型 编码 描述
0 0 Echo Reply
3 0 网络不可达
3 1 主机不可达
3 2 协议不可达
3 3 端口不可达
5 0 重定向
8 0 Echo Request
灵石县第一职业高级中学
ICMP定义了多种消息类型,并用于不同的场景。有些消息不需要Code字段来描述具体类型参数,仅用Type字段表示消息类型。比如,ICMP Echo回复消息的Type字段设置为0。
有些ICMP消息使用Type字段定义消息大类,用Code字段表示消息的具体类型。比如,类型为3的消息表示目的不可达,不同的Code值表示不可达的原因,包括目的网络不可达(Code=0)、目的主机不可达(Code=1)、协议不可达(Code=2)、目的TCP/UDP端口不可达(Code=3)等。
Ping是检测网络连通性的常用工具,同时也能够收集其他相关信息。
ICMP应用-Ping
RTA
RTB
.1
.2
<RTA>ping ?
STRING<1-255> IP address or hostname of a remote system
-a Select source IP address, the default is the IP address of the
output interface
-c Specify the number of echo requests to be sent, the default is
5
-d Specify the SO_DEBUG option on the socket being used
-f Set Don't Fragment flag in packet (IPv4-only)
-h Specify TTL value for echo requests to be sent, the default is
255
-i Select the interface sending packets
……
10.0.0.0/24
灵石县第一职业高级中学
ICMP的一个典型应用是Ping。Ping是检测网络连通性的常用工具,同时也能够收集其他相关信息。用户可以在Ping命令中指定不同参数,如ICMP报文长度、发送的ICMP报文个数、等待回复响应的超时时间等,设备根据配置的参数来构造并发送ICMP报文,进行Ping测试。
Ping常用的配置参数说明如下:
1. -a source-ip-address指定发送ICMP ECHO-REQUEST报文的源IP地址。如果不指定源IP地址,将采用出接口的IP地址作为ICMP ECHO-REQUEST报文发送的源地址。
2. -c count指定发送ICMP ECHO-REQUEST报文次数。缺省情况下发送5个ICMP ECHO-REQUEST报文。
3. -h ttl-value指定TTL的值。缺省值是255。
4. -t timeout指定发送完ICMP ECHO-REQUEST后,等待ICMP ECHO-REPLY的超时时间。
ICMP应用-Ping
[RTA]ping 10.0.0.2
PING 10.0.0.2 : 56 data bytes, press CTRL_C to break
Reply from 10.0.0.2 : bytes=56 Sequence=1 ttl=255 time=340 ms
Reply from 10.0.0.2 : bytes=56 Sequence=2 ttl=255 time=10 ms
Reply from 10.0.0.2 : bytes=56 Sequence=3 ttl=255 time=30 ms
Reply from 10.0.0.2 : bytes=56 Sequence=4 ttl=255 time=30 ms
Reply from 10.0.0.2 : bytes=56 Sequence=5 ttl=255 time=30 ms
--- 10.0.0.2 ping statistics ---
5 packet(s) transmitted
5 packet(s) received
0.00% packet loss
round-trip min/avg/max = 10/88/340 ms
灵石县第一职业高级中学
Ping命令的输出信息中包括目的地址、ICMP报文长度、序号、TTL值以及往返时间。序号是包含在Echo回复消息(Type=0)中的可变参数字段,TTL和往返时间包含在消息的IP头中。
ICMP应用-Tracert
<RTA>tracert ?
STRING<1-255> IP address or hostname of a remote system
-a Set source IP address, the default is the IP address of the
output interface
-f First time to live, the default is 1
-m Max time to live, the default is 30
-name Display the host name of the router on each hop
-p Destination UDP port number, the default is 33434
-q Number of probe packet, the default is 3
-s Specify the length of the packets to be sent. The default
length is 12 bytes
……
30.0.0.2/24
RTA
RTC
主机 A
主机 B
20.0.0.2/24
10.0.0.2/24
RTB
灵石县第一职业高级中学
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表示同一消息类型中的不同信息。
ICMP应用-Tracert
<RTA>tracert 30.0.0.2
Tracert to 30.0.0.2(30.0.0.2), max hops:30, packet length:40, press CTRL_C to break
1 10.0.0.2 130 ms 50 ms 40 ms
2 20.0.0.2 80 ms 60 ms 80 ms
3 30.0.0.2 80 ms 60 ms 70 ms
30.0.0.2/24
RTA
RTC
主机 A
主机 B
20.0.0.2/24
10.0.0.2/24
RTB
灵石县第一职业高级中学
源端(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)。
$$