tcpip详解笔记(6) icmp协议

摘要:
1.ICMP协议格式的ICMP消息以IP数据报内部传输:此字段的值为0。RFC1071中规定了校验和算法。RestofHeader–四字节字段。将基于ICMP类型和代码。ICMP消息可分为两种类型:ICMP查询消息可能会生成ICMP错误消息)。

1. ICMP协议格式

ICMP报文是在IP数据报内部传输的: | IP头部 | ICMP报文 |

ICMP报文格式:

  Bits    0–7     8–15    16–23   24–31
  0       Type     Code        Checksum
  32      Rest of Header

  • Type – ICMP type as specified below.
  • Code – Subtype to the given type.
  • Checksum – Error checking data. Calculated from the ICMP header+data, with value 0 for this field. The checksum algorithm is specified in RFC 1071.
  • Rest of Header – Four byte field. Will vary based on the ICMP type and code.


ICMP报文可以分为两类:查询报文和差错报文,具体报文类型如下图所示:

6

下面各种情况都不会导致产生ICMP差错报文:

1) ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)。
2) 目的地址是广播地址或多播地址的IP数据报。
3) 作为链路层广播的数据报。
4) 不是IP分片的第一片。
5) 源地址为零地址、环回地址、广播地址或多播地址。


这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。


2. ICMP地址掩码请求


ICMP地址掩码请求用于无盘系统启动时获取自己的子网掩码。

消息格式如下图所示:

7

构造一个ICMP Address Mask Request:

We want to send an ICMP packet Address Mask Request and wait 10 seconds to see the replies. We mask the packet with source address of 10.2.3.4 and we send it to the address 10.0.1.255:

icmpush -mask -sp 10.2.3.4 -to 10 10.0.1.255

注意:ICMP地址掩码应答必须是收到请求接口的子网掩码


3. ICMP时间戳请求与应答

ICMP时间戳请求允许系统向另一个系统查询当前的时间,返回的建议值是自午夜开始计算的毫秒数,协调的统一时间,可以达到毫秒的分辨率。

消息格式:

8

构造一个ICMP时间戳请求: icmpush -tstamp  192.168.3.255

tcpdump抓包:

15:08:29.017664 IP 192.168.3.159 > 192.168.3.255: ICMP time stamp query id 0 seq 0, length 20
15:08:29.018170 IP 192.168.3.1 > 192.168.3.159: ICMP time stamp reply id 0 seq 0: org 356:22:16.510, recv 603:27:17.188, xmit 603:27:17.188, length 20

4. ICMP端口不可达差错

协议格式:

9

根据code的不同,共有15种类型的ICMP差错报文

示例:

# tftp
tftp> connect 192.168.12.54
tftp> get get

# tcpdump//与上面同时
15:29:17.014369 IP 192.168.32.159.57181 > 192.168.12.54.69:  15 RRQ "get" netascii
15:29:17.014555 IP 192.168.12.54 > 192.168.32.159: ICMP 192.168.12.54 udp port 69 unreachable, length 51
15:29:22.014478 IP 192.168.32.159.57181 > 192.168.12.54.69:  15 RRQ "get" netascii
15:29:22.014880 IP 192.168.12.54 > 192.168.32.159: ICMP 192.168.12.54 udp port 69 unreachable, length 51
15:29:27.014596 IP 192.168.32.159.57181 > 192.168.12.54.69:  15 RRQ "get" netascii
15:29:27.014850 IP 192.168.12.54 > 192.168.32.159: ICMP 192.168.12.54 udp port 69 unreachable, length 51

注意,ICMP报文是在主机之间交换的,而不用目的端口号,而UDP数据报则是从一个特定端口发送到另一个特定端口。

ICMP的一个规则是, ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节。导致差错的数据报中的I P首部要被送回的原因是因为I P首部中包含了协议字段,使得ICMP可以知道如何解释后面的8个字节。对于TCP和UDP协议来说,这8个字节正好是源端口号和目的端口号。

书上给出的一个时间序列:
10

免责声明:文章转载自《tcpip详解笔记(6) icmp协议》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WinForm控件之【TextBox】【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于主存地址和主存区号的计算

容量为64块的Cache采用组相联方式映像,字块大小为128个字,每4块为一组。若主存容量为4096块,且以字编址,那么主存地址应为_(?)_位,主存区号应为_(?)_位。 主存地址=区号+组号+组内块号+块内地址号 由于主存容量为4096块,而每块为128个字,主存的总容量为512K字,故主存地址应为19位。主存地址应分为区号、组号、组内块号、块内地址号...

网络协议之EtherType、IpProtocol、UDP Port、特殊MAC地址

EtherType 0x0806 ARP 0x8035 RARP 0x7800 ADP(私有Address Discovery Protocol) 0x814C SNMP 0x0800 IPv4 0x86dd IPv6 0x8847/0x8848 MPLS 0x8863 PPPoE Discovery 0x8864 PPPoE Session 0x8137...

那些java中的常用类(一)

本节介绍一下java中那些常用的类,包括:系统相关类(System、Runtime)、日期时间类(Date等)、Object、Math、Random、File、枚举类(Enum) 1.系统相关类 System类 System类是一些与系统相关的属性和方法的集合,且System类中所有的属性和方法都是静态的,要想引用这些属性和方法,直接使用System类...

python datetime模块

 该模块的时间有限时限:1 - 9999 dir(datetime)  1 from datetime import datetime, timedelta, timezone 2 3 dt = datetime.now() 4 t = dt.timestamp() 5 6 dt1 = datetime.fromtimestamp(t)...

内存测试工具memtester

Memtester是用户态工具,用于测试内存子系统的故障。非常方便,支持32位 或64位Unix-like系统。对于硬件开发开发者来说,memtester可以定位到物理地址。 1. 安装 下载地址http://pyropus.ca/software/memtester/ 获取memtester-4.2.2.tar.gz源码包。 #tar –zxvf me...

iptables基础知识详解

iptables命令是Linux上最常用的防火墙代理,可以很好得控制进出流量以及限速等。 iptables不是真正意义上得防火墙,我们应该把它理解为一个代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"里面,【netfilter】,这个框架才是真正的防火墙。 netfilter位于内核空间。 iptables是一个命令行...