《TCP/IP详解 卷一》第8章 ICMPv4和ICMPv6

目录

[8.1 引言](#8.1 引言)

[8.1.1 在IPv4和IPv6中的封装](#8.1.1 在IPv4和IPv6中的封装)

[8.2 ICMP 报文](#8.2 ICMP 报文)

[8.2.1 ICMPv4 报文](#8.2.1 ICMPv4 报文)

[8.2.2 ICMPv6 报文](#8.2.2 ICMPv6 报文)

[8.2.3 处理ICMP报文](#8.2.3 处理ICMP报文)

[8.3 ICMP差错报文](#8.3 ICMP差错报文)

[8.3.1 扩展的ICMP和多部报文](#8.3.1 扩展的ICMP和多部报文)

[8.3.2 目的不可达和数据包太大](#8.3.2 目的不可达和数据包太大)

[8.3.3 重定向](#8.3.3 重定向)

[8.3.4 ICMP 超时](#8.3.4 ICMP 超时)

[8.3.5 参数问题](#8.3.5 参数问题)

[8.4 ICMP查询/信息类报文](#8.4 ICMP查询/信息类报文)

[8.4.1 回显请求 / 应答](#8.4.1 回显请求 / 应答)

[8.4.2 路由器发现:路由器请求RS和通告RA](#8.4.2 路由器发现:路由器请求RS和通告RA)

[8.4.3 本地代理地址发现请求/应答](#8.4.3 本地代理地址发现请求/应答)

[8.4.4 移动前缀请求/通告](#8.4.4 移动前缀请求/通告)

[8.4.5 移动IPv6快速切换报文](#8.4.5 移动IPv6快速切换报文)

[8.4.6 组播侦听查询/报告/完成](#8.4.6 组播侦听查询/报告/完成)

[8.4.7 版本2组播侦听发现](#8.4.7 版本2组播侦听发现)

[8.4.8 组播路由器发现](#8.4.8 组播路由器发现)

[8.5 IPv6中的邻居发现](#8.5 IPv6中的邻居发现)

[8.5.1 ICMPv6路由器请求和通告](#8.5.1 ICMPv6路由器请求和通告)

[8.5.2 ICMPv6邻居请求和通告](#8.5.2 ICMPv6邻居请求和通告)

[8.5.3 ICMPv6反向邻居发现请求/通告](#8.5.3 ICMPv6反向邻居发现请求/通告)

8.5.4邻居不可达检测

8.5.5安全邻居发现

[8.5.6 ICMPv6邻居发现选项](#8.5.6 ICMPv6邻居发现选项)

[8.6 ICMPv4 和 ICMPv6 转换](#8.6 ICMPv4 和 ICMPv6 转换)

[8.7 与ICMP相关的攻击](#8.7 与ICMP相关的攻击)

[8.8 总结](#8.8 总结)


8.1 引言

ICMP位于网络层和传输层之间。

因为路由器缓冲区溢出的丢包不会触发任何ICMP差错报文。而由TCP等处理(重传等)。

黑客在大量攻击中使用ICMP。由于担心攻击,通常防火墙封阻ICMP报文,特别是边界路由器。此时诊断程序(ping, traceroute)无法正常工作。

ICMPv6包含:

错误报告。

邻居请求,邻居通告。

路由器请求,路由器通告。

重定向:优化路由。

报文过滤: 引入Packet Too Big报文,通知源主机包超过了链路层MTU。

8.1.1 在IPv4和IPv6中的封装

报文格式:

其中ICMPv4头:

字段介绍:

类型:指定报文类型,常用8个值。

代码:进一步指定报文类型。

校验和:IP层没有对载荷完整性保护。所以ICMP需包含校验和。

8.2 ICMP 报文

ICMP报文分类:

差错报文:用于通知发送端数据包传输中的错误情况。

查询/信息类报文:用于信息采集和配置。

8.2.1 ICMPv4 报文

差错报文:

目的不可达(类型3),重定向(类型5),超时(类型11 ),参数问题(类型12)

查询/信息类报文:

回显请求(类型8),回显应答(类型0),路由器通告(类型9),路由器请求(类型10)

其中重定向报文目的:指导主机或路由器改变路由决策,将数据发送到更优路径上。

8.2.2 ICMPv6 报文

ICMPv6不仅包含差错和查询/信息类报文,还有大量IPv6路由器和主机的配置,如RS,RA,NS,NA。

ICMPv6类型字段值:

从0到127是差错类报文,从128到255是信息类报文。

ICMPv6也使用代码字段。

ICMPv6还支持大量标准选项,而ICMPv4不支持选项。

8.2.3 处理ICMP报文

收到重定向报文:会更新路由表。

目的不可达报文:可用于路径MTU发现(PMTUD)

ICMPv6报文处理规则:

  1. 收到未知ICMPv6差错报文,须传递给上层产生差错报文的进程。

  2. 收到未知ICMPv6信息类报文,丢弃。

  3. 发送ICMPv6差错报文时,应尽可能多地包含导致差错的原始IPv6报文,但不超过最小的IPv6 MTU ( 1280字节)

  4. IPv6节点须限制发送ICMPv6差错报文速率。

IPv6网络中链路层最小MTU是1280字节。IPv4中是576字节。

8.3 ICMP差错报文

请注意8.3.1到8.3.5章节都属于ICMP差错报文。

不会用ICMP差错报文响应以下报文:

另一个ICMP差错报文。

头部损坏的数据报(例如校验和错误)。

IP层广播或组播数据。

链路层广播或组播帧数据。

无效地址(零地址、环回地址、广播地址,组播地址)

第一个之外的分片。

发送ICMP差错报文:应包含导致错误数据报的IP头副本,包括IP选项和原始IP载荷,生成的ICMP数据报大小不超过网络最小MTU。

差错报文包含原始IP包载荷作用:

使接收ICMP差错报文主机能根据IP头中协议或下一个头部将该差错报文传递到对应传输层和应用进程。

8.3.1 扩展的ICMP和多部报文

扩展的ICMP差错报文: 使ICMP差错报文包含额外信息以提供更多诊断信息。

用ICMP中代码字段指明具体原因,实现扩展功能。

后续章节详解。

8.3.2 目的不可达和数据包太大

ICMPv4目的不可达差错报文:

网络不可达:code 0,无路由信息。

主机不可达:Code 1,如目标主机关机等。

协议不可达:Code 2,目标主机无法处理数据包传输层协议。

端口不可达:Code 3,该端口未打开或没有对应端口的应用程序。

需要进行分片,但设置了DF位:Code 4

源站选路失败:Code 5,IP包中包含源站路由选项,但无法按照指定路由转发数据包。

ICMPv6目的不可达差错报文:

无路由:code 0,无路由信息。

目的地被管理员禁止通信:code 1

源地址的范围之外:code 2,如访问公网时,源IP地址是本地链路地址,不属于全局地址。

地址不可达:code 3,目标主机未响应或不可达

端口不可达:code 4

源地址失败进/出策略:code 5,如因为接口ACL导致数据报无法传递。

数据包太大差错报文

即PTB(Packet Too Big)

路由器转发的数据大于出接口MTU,但数据IP头设置了不分片位,则丢弃该数据,并回复PTB差错报文。

PTB报文中会包含路由器自身 MTU值,以告知源地址减小数据包。

因此该报文可用于PMTU发现,PMTU是路径中MTU最小值。

net.ipv4.icmp_ratemask = 6168(哪些ICMP报文有速率限制,对应code字段)

应用程序使用如下代码接口ICMP报文:

sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

应用层收到ICMP差错报文后,可进行对应操作。

8.3.3 重定向

使用不多。

主机根据ICMP重定向报文信息来更新转发表

8.3.4 ICMP 超时

IPv4头部中TTL字段:表示丢弃前最多可经过的路由器跳数。

IPv6头部中同样有跳数限制(Hop Limit)字段表示。

超时报文差错报文:

TTL超时:Code 0,指示数据报TTL值已减至零。

分片重组超时:Code 1,指示数据报片段重组未能在一定时间内完成。

traceroute原理:

主机先发送IPv4 TTL=1数据,到达第一个路由器,此时TTL到期,路由器回复ICMPv4超时报文。主机下一次数据包TTL加1。导致在更远一跳路由器超时,并回复ICMP超时报文,重复该过程。

ICMP响应报文中包含响应路由器自身IP,由此得到沿途所有路由器IP。

8.3.5 参数问题

场景:IP头部存在不可修复错误。

该报文是"包罗万象"的错误指示器。无法指明具体原因,但会指出错误相对IP头部的偏移值。

ICMPv6中细分为三种:

错误头部字段。

无法识别下一个头部。

无法识别IPv6选项。

8.4 ICMP查询/信息类报文

注意:8.3 讲解的全是ICMP差错报文。

广泛使用的ICMP查询/信息类报文:回显请求,回显应答(ping使用)

8.4.1 回显请求 / 应答

即ping使用的ICMP报文类型。

回显请求报文大小任意(但受限于IP数据报大小),回显应答时需要将收到数据返回给发送者,即使需要IP分片。

字段介绍:

标识符:UNIX用发送进程PID表示。方便识别同一主机多个ping程序。

序列号:从0开始,每个回显请求加1。方便查看丢包、重复问题。

可选数据:如ping在回显请求和应答包含本地时,方便计算RTT。

之前提过NAT处理ICMP时,会结合标识符和序列号进行NAT转换,因为ICMP报文没有端口号信息。

ping -b 10.0.0.254

ping广播地址作用:

子网所有主机收到该ping包后,都需要响应,所以都需要知道ping主机的MAC,于是都向ping主机发ARP请求,最终快速广播ping主机ARP。

Linux默认允许回复CMP应答报文给广播地址的ICMP请求。

8.4.2 路由器发现:路由器请求RS和通告RA

路由器发现:RD(Router Discovery)

RD:IPv4使用少。主要用于IPv6,是IPv6 SLAAC功能一部分。

IPv6 RD包括:

路由器请求RS(Router Solicitation)报文

路由器通告RA(Router Advertisement)报文

ICMP type 133,表示路由器请求RS。请求网络配置,如DNS,IPv6网络前缀。

ICMP type 134,表示路由器通告RA。要么用于回复RS,要么周期多播发送。

使用场景:

无状态地址配置:RA中包含网络前缀信息。

8.4.3 本地代理地址发现请求/应答

允许移动网络IPv6节点在移动时保持其IPv6地址不变,并且可以在外部网络上通过本地代理进行通信。

8.4.4 移动前缀请求/通告

当节点的本地地址将无效时,请求更新路由前缀。

8.4.5 移动IPv6快速切换报文

改善IP层切换延迟

8.4.6 组播侦听查询/报告/完成

允许节点查询或报告本地链路上的组播组成员信息,并执行组播组成员的管理。

8.4.7 版本2组播侦听发现

8.4.8 组播路由器发现

通过ICMPv6组播路由器发现报文,主机确定哪些路由器支持 IPv6 组播,从而决定是否启用 IPv6 组播功能。

8.5 IPv6中的邻居发现

邻居发现:(Neighbor Discovery,ND),类似IPv4的ARP。

IPv6中没有广播地址。

ND用于在同一个链路或者网段的节点找到彼此,确定一个邻居是否变得可用。

ND使用ICMPv6报文。

ND包含:

邻居请求NS(Neighbor Solicitation),ICMP type为135。

邻居通告NA(Neighbor Advertisement),ICMP type为136。

功能:地址解析,邻居发现,地址自动配置。

8.5.1 ICMPv6路由器请求和通告

路由器通告(RA)报文:

通告网络前缀,MTU,DNS,NTP服务器等配置。

通常会定期发送,或者用于响应路由器请求(RS)报文。

RS报文目的IP:ff02::2(所有路由器组播地址)

RA报文目的IP:ff02::1(所有节点的组播地址)或者单播RS主机

结合无状态DHCPv6 SLAAC使用。

8.5.2 ICMPv6邻居请求和通告

ICMPv6中的邻居请求(NS)报文:取代IPv4 ARP

目的:

IPv6中ARP功能,获取IPv6地址对应MAC。

检测附近节点是否可达。

8.5.3 ICMPv6反向邻居发现请求/通告

在帧中继网络中确定给定的MAC地址对应IPv6地址

8.5.4邻居不可达检测

(Neighbor Unreachability Detection, NUD)

定期检测邻居节点的存活状态

如果检测到邻居不可达,更新邻居表和路由表,切换到备用网络。

8.5.5安全邻居发现

安全邻居发现(Secure Neighbor Discovery,SEND)

安全性增强的邻居发现协议。

作用:

邻居发现,且解决传统IPv6邻居发现过程安全漏洞。

8.5.6 ICMPv6邻居发现选项

使用一些可选的选项(Options)来提供额外信息或配置。

源/目标链路层地址选项

前缀信息选项PIO

重定向头部选项

MTU 选项

通告间隔选项

源和目标地址列表选项

时间戳选项

随机数选项

证书选项

IP地址/前缀选项

链路层地址选项

邻居通告确认选项

路由信息选项

递归DNS服务器选项

切换密钥请求选项

切换密钥应答选项

8.6 ICMPv4 和 ICMPv6 转换

8.7 与ICMP相关的攻击

分为3类:

泛洪(flood):DoS

炸弹(bomb):发送特殊构造报文,导致IP或者ICMP的处理崩溃。

信息泄露(information disclosure)

8.8 总结

相关推荐
龙哥说跨境8 分钟前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
懒大王就是我22 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
Elaine20239136 分钟前
06 网络编程基础
java·网络
海绵波波1072 小时前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
热爱跑步的恒川5 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面6 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
音徽编程8 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
幺零九零零9 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
23zhgjx-NanKon10 小时前
华为eNSP:QinQ
网络·安全·华为
23zhgjx-NanKon10 小时前
华为eNSP:mux-vlan
网络·安全·华为