ICMP小知识
1.iptables(版本1.2.10)的ICMP类型
echo-reply(pong)(回显应答)
destination-unreachable(目的不可达)
- network-unreachable(网络不可达)
- host-unreachable(主机不可达)
- protocol-unreachable(协议不可达)
- port-unreachable(端口不可达)
- fragmentation-needed(需要进行分片但设置了不分片位)
- source-route-failed(源站选路失败)
- network-unknown(目的网络不认识)
- host-unknown(目的主机不认识)
- network-prohibited(目的网络被强制停止)
- host-prohibited(目的主机被强制停止)
- TOS-network-unreachable(由于服务类型TOS,网络不可达)
- TOS-host-unreachable(由于服务类型TOS,主机不可达)
- communication-prohibited(由于过滤,通信被强制禁止)
- host-precedence-violation(主机越权)
- precedence-cutoff(优先权中止生效)
source-quench(源端抑制)
redirect(重定向)
- network-redirect(对网络重定向)
- host-redirect(对主机重定向)
- TOS-network-redirect(对服务类型和网络重定向)
- TOS-host-redirect(对服务类型和主机重定向)
echo-request(ping)(请求回显)
router-advertisement(路由器通告)
router-solicitation(路由器请求)
time-exceeded(ttl-exceeded)(超时)
- ttl-zero-during-transit(传输期间生存时间为0)
- ttl-zero-during-reassembly(数据报组装期间生存时间为0)
parameter-problem(参数问题)
- ip-header-bad(坏的IP首部(包括各种差错))
- required-option-missing(缺少必需的选项)
timestamp-request(时间戳请求)
timestamp-reply(时间戳应答)
address-mask-request(地址掩码请求)
address-mask-reply(地址掩码应答)
2.ICMP的产生
ICMP地址掩码请求(address-mask-request和address-mask-reply)用于无盘工作站在引导过程中获取自己的子网掩码。
ICMP时间戳请求(timestamp-request/timestamp-reply)允许系统向另一个系统查询当前的时间。
回显请求和应答(echo-request/echo-reply)用于ping程序。
当路由器收到一个TTL字段为0或1的IP数据报,则不转发,而是直接丢弃,并给信源机发一份超时(ttl-zero-during-transit)的ICMP报文。
主机在组装分片时可能发生超时,此时它将发送一份组装报文超时(ttl-zero-during-reassembly)的ICMP报文。
对于指定了严格源路由的IP数据报,如果一个路由器发现源路由所指定的下一个路由器不在其直接连接的网络上,则返回一个源站选路失败(source-route-failed)的ICMP报文。
当路由器收到一个IP数据报但不能进行转发时,如果该IP数据报是由主机产生的,则路由器给发送该数据报的应用程序返回一个差错,或者是主机不可达(host-unreachable)或者是网络不可达(network-unreachable);如果该IP数据报是被转发的,则路由器给原始发送端发送一份主机不可达(host-unreachable)报文。
当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端。
一般认为,主机在引导以后要广播或多播传送一份路由器请求(router-solicitation)报文,一台或多台路由器响应一份路由器通告(router-advertisement)报文。另外,路由器定期的广播或多播传送它们的路由器通告报文,允许每个正在监听的主机相应的更新它们的路由表。
当一个IP数据报需要分片,而IP头部指定不分片时,则IP将不对数据报进行分片,丢弃该报然后发送一个需要分片但设置了不分片比特的ICMP(fragmentation-needed)差错报文。
当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能回产生源站抑制(source-quench)的差错。注意“可能”,因为这不是必须的。
3.ICMP的不产生
在下面各种情况中不会导致产生ICMP差错报文:
- ICMP差错报文;
- 目的地址是广播地址或多播地址的IP数据报;
- 作为链路层广播的数据报;
- 不是IP分片的第一片;
- 源地址不是单个主机的数据报。也就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
4.UDP与ICMP
如果收到一个UDP数据报,而目的端口与某个正在使用的进程不相符,则UDP返回一个端口不可达(port-unreachable)的ICMP差错报文。
5.TCP与ICMP
对于TCP,一般来说,无论何时一个报文段发往基准的连接出现错误,都会发出一个复位(RST)报文段,而不是使用ICMP。例如:到不存在的端口的连接请求;异常终止一个连接;半打开连接等。
TCP能够遇到的最常见的ICMP差错有源站抑制、主机不可达和网络不可达,TCP的处理如下:
- 一个接收到的源站抑制将引起拥塞窗口被置为1个报文段来发起慢启动;
- 一个接收到的主机不可达或网络不可达都被TCP忽略,因为这两个差错被认为时短暂现象。