8位类型位,8位代码位
类型是大类,类型里边用代码区分不同的小类型
重要的:
ping的请求:类型为8, 代码为0 (查询报文)
应答:类型为0, 代码为0 (查询报文)
类型3:不可达信息。(差错报文)
端口不可达:UDP的规则之一是:如果收到UDP数据报而且目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文。
校验和
IP校验和只管IP首部,ICMP校验和管ICMP首部和数据。
C - R -S
客户端C发送信息到S,在路由器的时候,有可能没有路由或者路由器有访问控制然后把包丢掉了,然后路由器会返回给C一个ICMP的类型为3的不可达信息,该不可达字段中的信息:
IP头部:源IP地址为路由器的IP地址,目的IP地址为C的IP地址。
ICMP头部: 类型为3,还有 code.
ICMP数据后面:包含造成造成不可达信息数据的IP头部,造成不可达信息IP数据的前8个字节。
为什么要包含前8个字节?
TCP和UDP端口号都在前8个字节。因为ICMP路由器的包回到客户端的时候希望告诉客户端到底是哪个应用程序产生的报错信息。即告诉给客户端该程序的端口号(TCP端口号或者UDP端口号)。这样客户端可以提取端口号,找到哪个应用程序出现了网路不可达。
TCP没有端口不可达
类型为8:request
类型为0:reply
标识符:同时又不同的进程的进程ID会填到标识符里边。如果是一个进程发出去的ID不变。
序号:会随着ping的增加,序列号会不断的增加。
Ping往返时间是如何计算的:
发出数据的时候会包含时间数据,当reply回来之后的数据中也包含时间数据,根据回来的时间数据以及当前时间可以计算出时间差。
ICMP是通过IP来发送的。
IP时间戳记录:记录通过每一个路由器的时间。也是最多只能记录9个。
IP记录路由选项 记录的是出接口的IP地址。
IP选项空间是有限的,最多不能超过40个字节。一个ip地址是4个字节,所以极限最多能存10个IP地址,但是RR选项会占3个字节,所以最多能记录9个IP,所以最多能记录9跳。最终目的的入接口要记。
Traceroute
Traceroute 是UDP的流量,
如何知道抵达目的地?
Traceroute Udp 33434
第一次发端口号33434,ttl=1, 到达路由器1后返回一个ttl超时信息,读取超时信息的源地址,可以得到路由器1的地址。
第二次发端口号33435,ttl=2, 到达路由器2后返回一个ttl超时信息。
第三次发端口号33436,ttl=3, 到达路由器3后返回一个ttl超时信息。
第四次发端口号33437,ttl=4, 到达路由器4后,由于端口号太大,返回一个端口不可达信息(类型为3,code为3)。
中间路由器只查IP地址,只有目的地会查端口号。
IP源站路由选项
严格:一定直连。
宽松:不一定直连。
严格和宽松只有code不一样。
如果有IProuting 功能,不会理睬ICMP重定向报文。
导致重定向的IP地址:1.1.1.1
发送重定向报文的路由器的IP地址:10.1.1.2
应该采用的 路由器的IP地址:10.1.1.3