- ICMP协议
- ping
- traceroute
- IP地址
- 路由交换
- ARP协议
ICMP互联网控制报文协议,主要就是确定IP报文是否到达目标主机,如果ip包被丢弃了,那么为什么会被丢弃(端口无效还是主机不可达…),死也要死的有意义。被用于主机与路由器之间沟通彼此的网络层信息。
ICMP通常被认为是IP的一部分,但是它和TCP/UDP一样,是作为IP的有效载荷而存在的。
Icmp主要分两类:出错,没出错。
没出错就去就是正常的请求应答,通常是作为一个探测的目的去使用,如ping命令。出错就是回传差错报告报文
Ping(packet Internet groper分组网间探测)的输出包含三部分:
【1】对主机对应的IP地址进行域名解析,向该主机发送的数据包大小
【2】来自主机的响应(ICMP序列号-响应的数据包大小-请求往返耗时-IP数据报的ttl设置)
【3】ping整体请求/响应概览,最小、平均、最大往返时间
Ping命令基于ICMP实现,客户端向服务器发出ICMP echo请求报文并等待接收echo回应报文,程序会按时间和成功响应的次数估算丢包率和网络时延。
ping用于检查网络的连通性或者网络连接速度。
(Telnet用来探测指定ip是否开放指定端口,可以看作最简单的端口探测方式)
echo(reply/request)请求应答报文用于判断一个ip报文是否达到对端。是实现Ping的原理
当路由器无法将ip报文送到目标ip地址时,则会回传一个目的不可达ICMP差错报文,并且将原因保存在ICMP头中(协议自解释的代码字段)
Ping执行的时候,源主机构造多个ICMP echo request(回传请求)报文,并且通过序号字段标识。报文数据部分插入了发送时间,用于计算RTT。然后交给网络层构造一个ip数据报发出,如果到达目标主机则目标主机构造多个ICMP echo reply(回送响应)报文发送回去,与源报文序号一一对应。
如果在规定的时间内,源主机没有收到ICMP应答报文,说明目标主机不可达,如果接收到ICMP Echo reply则说明目标主机可达
IP的TTL字段每经过一次路由器就会减一(这里的减一,本质上是不断在网络节点更新ip头部),直到减少为0则丢弃包,并传回一个ICMP超时信息。
总结:ping程序基于ICMP echo request报文和ICMP echo reply报文。
两台电脑ping不通的可能原因:
【1】检查网络连接是否正常,检查网卡驱动是否正确安装
【2】查看局域设置,检查IP地址是否正确
【3】查看防火墙设置(部分防火墙过滤ICMP)
【4】检查是否存在第三方软件拦截
【5】两条设备之间的网络延时是否够大(例如路由设置不合理),导致ICMP报文总是超时
traceRoute是基于ICMP另一个报文类型:差错报告报文。
该程序故意设置特殊的TTL,来追踪去往目的主机过程中经过的路由器。
程序将ip报文的TTL设置为1,并且依次递增。同时发送UDP报文,一旦超时将接收ICMP超时报文(每经过一跳,TTL就减一,因此TTL减一的前提是遇到了路由器,而且TTL每次自增一个单位,因此每当traceRoute程序收到一个ICMP差错报文就说明发现了一个路由器),最终的结果就是某个ip报文成功到达目标主机,而此时程序收到了若干个ICMP超时报文,分别对应一个路由器(不精准,因为有的路由器不返回ICMP报文)。
traceRoute发送的是UDP报文,而路由器看不见传输层,路由器只关心TTL是否为1,如果路由器收到TTL为1的ip报文,则丢弃它并回传一个ICMP超时报文。如果UDP报文达到目标主机,将会返回一个端口不可达ICMP报文,因为发送的UDP报文将目标端口写入了一个不可能到达的端口号(大于3000)。
当程序接收到一个端口不可达ICMP报文时,它就知道了发送的UDP达到了目的主机
traceRoute还有另外一个作用:故意设置不分片,来发现路径的MTU(最大传输单元)——路径MTU发现。
首先发送方主机发送IP数据报时,禁止IP数据报分片,一旦数据报长度大于路径MTU时就会分片,如果数据报禁止被分片就会丢弃这个数据包,并回传ICMP差错报文,包含MTU。消息类型“需要分片但禁止分片”,发送方依次调节包大小来确定合适的MTU(包含IP头),最终发送方可以推断出合适的MTU
IP地址每个不同类型的数据链路的使用目的不同,可承载的MTU也不同。
常见的数据链路是以太网,MTU为1500字节。当IP数据包大小大于MTU时就会被分片。经过分片之后的ip数据包再被重组的时候,只能在目标主机上进行,路由器不会进行重组。一旦某个分片丢失,整个IP数据包都会作废,因此TCP引入了MSS,仅在传输层进行分配,而IP层不分片。
这玩意硬记肯定不好记,要知道划分原理
私有IP地址:
A:
A类地址由1字节网络地址和3字节主机地址组成,网络号高位固定为0。其中全0和全1分别作为保留地址
1.0.0.1 126.255.255.254
(0000 0001.00000000.00000000.00000001~01111110.111111111.11111111.11111110)
B:
B类地址由2字节网络地址和2字节主机地址组成,网络号高位固定为10
128.1.0.1 191.255.255.254
C:
C类地址由3字节网络地址和1字节主机地址组成,网络号高位固定为110
192.0.1.1 223.255.255.254
全0的网络号代指本网络(this),全0的主机号代指本主机。全1的网络号作为回环地址(127.0.0.1),全1的主机号表示该网络上的所有主机。
划分子网掩码:
划分子网:从网络的主机号借用若干位作为子网号,于是二级IP地址在本单位内部就变成三级IP地址。对外仍然表现为一个网络。
通过子网掩码可以得到网络地址——子网掩码和IP地址诸位相与,就可以得到子网网络地址。
路由器中:
【1】目的网络地址
【2】下一跳地址(gate )
【3】目的网络子网掩码
无分类编址CIDR消除了传统的A/B/C类地址以及划分子网的概念以及划分子网的概念。重新将IP地址划分成了两个部分ip地址::={ <网络前缀> <主机号> }
CIDR记法:ip地址/网络前缀 如128.14.32.0/20(后面的数字就是地址掩码中1的个数)
CIDR把网络前缀都相同的连续IP地址组成一个CIDR地址块
前缀有多少位,地址掩码中就有多少个1。(CIDR编址中,子网号可以全0或者全1)
路由交换使用CIDR的时候,查找路由表可能得到几个匹配结果,应该选择最长网络前缀的路由。前缀越长,地址块越小,主机号越小,路由越具体。【选择多个匹配地址中的更具体的一方】
Ip数据报到达路由器,路由器查找路由表,根据路由选择协议找到一个合适的端口将数据报发出。一个ip数据报到达路由器要经过拆包和重新装包,更新跳数和TTL等属性。其中不变的最终ip地址,变化的是源地址和链路层的MAC源、目标地址等。
当路由器接收都一个数据报的时候:
【1】从IP数据报中提前目的ip地址,对路由器直接相连的各个网络进行逐一检查——使用各网络的子网掩码与目标id地址诸位相与。
【2】判断目的IP地址所在网络是否与当前路由器直连,是则直接交付。
【3】检查路由表中是否有目的IP地址的特定主机路径,有则重新加上头部更新TTL、MAC等,发送到下一跳路由器。
【4】逐条检查路由表,如果找到匹配路由,则转发给下一跳路由器,如果设置了默认路由,最终会发给默认路由器,若干没有合适路由器,则丢弃,并通过回传ICMP报文报告转发分组出错。
注意:当路由器收到一个待转发的数据报,在从路由表得到下一跳路由器的IP地址后,不是把这个地址填入IP数据报,而是送交数据链路层的网络接口软件,网络接口软件负责把下一跳路由器的IP地址转换成硬件地址(使用ARP协议),并将此硬件地址放在数据链路层的MAC帧的首部,然后根据这个硬件地址找到下一跳路由器。
(IP不负责运输,只负责路由,数据链路上运输依赖MAC地址,运输就是不断更新mac地址的过程)
MAC寻址参考地址转发表(记录MAC地址),而IP寻址参考路由控制表(记录网络号)
ARP协议用于帮助主机或路由器完成IP地址到MAC地址的映射工作——
解决下一跳往哪里走的问题
ARP协议在TCP/IP模型属于网络层,在OSI七层模型属于链路层,主要就是工作在两个层次之间。用于IP地址到MAC地址的映射工作。
ARP协议自动进行
主机或路由器要和本网络上的另一个已知IP地址的主机或路由器进行通信时,ARP协议就会自动把这个IP地址解析为数据链路层所需要的硬件地址,这个解析过程是自动的,主机的用户对这种地址解析过程的不知道的。
每一条主机都有设有一个ARP高速缓存,它就是一个保存了本局域网下,各个主机或路由器的IP地址->MAC地址的映射集合。
使用过程:检查ARP高速缓存,有对应表项则写入MAC帧,没有则用目的MAC地址为FF-FF-FF-FF-FF-FF的帧==(广播帧)==封装ARP请求分组,同一局域网中所有主机都能收到该请求。目前主机收到请求后就会向源主机单播一个ARP响应分组,源主机收到后将此映射写入ARP缓存(10-20min更新一次)
总结:下一跳路由器的MAC地址通过ARP协议获取。Arp协议会在以太网中以广播的形式找到目标IP地址对应的目标MAC地址并将其放入ARP缓存,这个缓存只有几分钟,一旦失效就会重新获取。
也不一定是目标路由器的MAC地址,可能是距离目标路由器物理上最近的交换机的MAC地址,反正最终IP报文能够通过链路层最终送到目标路由器的网卡接口



