DESCRIPTION 描述
本网络核心协议模块实现了基于 RFC792 协议中定义的《互联网控制报文协议》。它针对网络主机间通讯出错的情况作出回应并给出诊断信息。用户不能直接使用本模块。相反本模块需与核心中的其他协议进行通讯,而这些协议将 ICMP 出错信息返回到网络协议的应用层。ICMP 核心模块也回应 ICMP 请求。
如果用 IPPROTP_ICMP 打开原始套接字(raw socket)时,用户协议有可以收到任意本地套接字 ICMP 包。 IPPROTO_ICMP. 请参阅 raw(7) 传递到套接字的 ICMP 包可以用 ICMP_FILTER 套接字选项进行过滤。核心会处理所有 ICMP 包,包括传递到用户的套接字去的。
Linux 对可以到达每个目标主机出错信息包的比率设立了限制。 ICMP_REDIRECT 及 ICMP_DEST_UNREACH 也受进入包的目标路由的限制。
SYSCTLS
ICMP 支持通过 sysctl 接口来设置一些全局 IP 参数。对 Sysctl 的访问可以通过读、写 /proc/sys/net/ipv4/* 下的文件通过 sysctl(2) 接口进行. 大多数这些 sysctls 对特定 ICMP 类型的数据包数量进行了限制。 Linux 2.2 使用记号单元过滤器对 ICMP 包进行限制。 此值表示超时错误,以秒计,直到到顶后记号单元过滤器被清除为止。
- icmp_destunreach_rate
- 发送目的地不可到达 ICMP 消息包的最大数据包比率。这限制了发送到任意一个路由或目的地的数据包的比率。这个限制不影响发送用来发现数据链路最大传送单位(MTU)的 ICMP_FRAG_NEEDED包 数据包。
- icmp_echo_ignore_all
- 如果该值不为零,Linux将忽略所有的 ICMP_ECHO 请求。
- icmp_echo_ignore_broadcasts
- 如果该值不为零,Linux将忽略所有发送到广播地址的 ICMP_ECHO 数据包。
- icmp_echoreply_rate
- 发送响应 ICMP_ECHOREQUEST 请求的 ICMP_ECHOREPLY 数据包比率的最大值。
- icmp_paramprob_rate
- 发送 ICMP_PARAMETERPROB 数据包比率的最大值。当一个具有非法 IP 报头数据包到达时将发送这些包。
- icmp_timeexceed_rate
- 发送 ICMP_TIME_EXCEEDED 包比率的最大值。当一个数据包通过太多网段时,这些包用作防止路由回环。
NOTES
由于在许多其他实现中不支持 IPPROTO_ICMP 原始套接字(raw socket),可移植程序不能依靠这一特性。
当Linux不作为路由器时,将不被发送 ICMP_REDIRECT 包。内核也只有在路由表中的旧网关和路由重新定向超时时才接受这些包。
ICMP_TIMESTAMP 返回的 64 位毫秒为单位的时间戳是自1970年1月1日以来的时间.
Linux 的 ICMP 在内部使用原始套接字(raw socket)来发送ICMP包。这个原始套接字可能在 netstat(8) 消息输出中出现,带着一个“zero inode”信息。