地址解析协议 ARP
ARP协议是一个根据目标IP获得去往目标主机路径上路由器的MAC地址的网络层协议。
计算机通信时会使用IP地址(逻辑地址)和MAC地址(物理地址),假如主机H1要发送一个网络包给另一个网络里的主机H2,这个网络包内的IP地址和MAC地址如何变化?
如下图所示:
1、一个MAC地址只能够在一个局域网内工作,属于局域网A的MAC地址在局域网B内是无法被识别的(因为局域网B的广播无法到达局域网A的MAC地址);
2、因此MAC帧要在不同局域网之间传输,MAC帧首部的源MAC地址和目标MAC地址会发生改变。
3、上图中2个路由器R1和R2连接,R1因为同时连接到2个局域网因此他有两个MAC地址。
ARP是解决同⼀个局域⽹上的主机或路由器的IP地址和MAC地址的映射问题。ARP报文无法跨局域网。
ARP工作原理和流程:
0、每个主机或路由器都保存着一个路由表和一个ARP缓存表。路由表记录着目标IP地址的下一跳IP地址。ARP缓存表保存同一局域网内的IP地址和它们对应的MAC地址。
1、H1从自己的路由表找到下一跳的IP为R1路由器,H1在 自己的 ARP 缓存表中查看有⽆ R1 的 IP/MAC 地址映射:
2、如有,就可查出其对应的MAC地址,再将其写⼊ MAC 帧头部,然后通过局域⽹将该 MAC 帧发往R1;
3、如没有,H1的 ARP 进程在局域⽹内⼴播发送⼀个 ARP 请求分组。H1会收到R1的 ARP 响应分组,将得到的 R1的IP/MAC 地址映射写⼊自己的ARP ⾼速缓存。知道了R1的MAC地址后,H1就可以封装传输通信数据的MAC帧给R1,由R1发往下一个网络。
ARP请求报文如下:
ARP请求报文和响应报文也是封装在MAC帧中传输的。
ARP请求报文的目标MAC地址是ff:ff:ff:ff:ff:ff(全部为1表示广播地址),源MAC地址是H1的MAC地址。
ARP请求广播后,只有R1才会接受到,其他设备会丢弃,因为ARP头部已经写明目标IP是R1。之后R1会回复一个ARP响应报文。
ARP响应报文的目标MAC地址是H1的MAC地址,而源MAC地址则是R1的地址。ARP请求报文会广播,而ARP响应报文会直接一对一单播给R1。
ARP缓存表可以减少 ARP ⼴ 播的数量。
注意点:
ARP协议不能穿透路由器:
ARP ⽤于解决同⼀个局域⽹上的 IP 地址和MAC地址的映射问题;
ARP缓存表的每一行都有一个生存时间,过了生存时间会自动删除。
互联网控制协议 ICMP
ICMP ⽤于IP 协议中发送控制消息。因为 IP 协议现在有两类版本: IPv4 和 IPv6 ,所以 ICMP 也有两个版本:ICMPv4 和 ICMPv6。
ICMP 的功能
1. 确认 IP 包是否能够成功到达⽬标地址,当两个设备通过互联⽹相连时,任意⼀个设备 发送给另⼀个设备的 IP 包如果没有交付成功,就会⽣成 ICMP 数据包发送给设备共享。
2. ⽹络诊断 ,经常使⽤ ICMP 数据包的两个终端程序是 ping 和 traceroute , traceroute 程序⽤于显示两台互联⽹设备之间可能的路径并测量数据包在 IP ⽹络上的时延。
ping 程序是 traceroute 的简化版本。
ICMP报文有两种类型:差错报告报文 和 询问报文。
ICMP报文是作为数据被封装在IP数据报内部的,但ICMP是网络层的协议。
ICMP报文的格式:
ICMP差错报告报文共4种
1 终点不可达:例如目标进程没启动、主机没开机等
2 时间超过:当TTL=0时IP数据报被路由器丢弃,此时丢弃包的路由器会发送一个时间超过的ICMP报文给源主机。
3 参数问题:当路由器或目的主机收到数据报首部字段不正确(例如目标IP和接收方IP不一致)会丢弃该数据报,并向源主机发送一个参数问题报文。
4 重定向 路由器把改变路由报文发送给主机,告诉主机下次应该将报文发送给另外的路由器(找到了更好的路由)。
举个例子:某个网络N0里的主机A要发送一个IP包给网络N1的主机B,N0与路由器R1和R2连接,R1与N1连接,R2与N2连接。主机A的默认路由是R2,因此IP包会交给R2转发到网络N2中,但R1和R2交换路由信息,R2发现让R1转发这个包可以更快到达主机B。因此R2会发送一个重定向的ICMP给A,A就会在路由表加一行:当B为目的主机时,下一跳应该选R1。
其中17和18已废弃。
ICMP 差错报告报文的数据内容是什么
假设主机A向主机B发送一个IP数据报,这个数据报就是图中第一行的数据报。该数据报由于出错没有到达主机B,路由器C发送一个ICMP报文给A。该ICMP报文的数据部分是A的IP报文的首部+它的数据的前8个字节。然后改ICMP报文作为数据封装到路由器C要发送的IP数据报中。
ICMP数据字段为什么需要加上原始出错IP中的数据字段前8个字 节?
因为这8个字节是TCP或UDP报文段的目的端口和源端口以及序号,这样就告诉发送端是哪⼀个进程发送的IP数据报出错。
不应发送ICMP的情况
对 ICMP 差错报告报⽂不再发送 ICMP 差错报告报⽂
对数据报第⼀个分⽚发 送 ICMP报文,剩下的分片都不发 送 ICMP 差错报告报⽂。
对具有多播地址的数据报都不发送 ICMP 差错报告报⽂。
具有特殊地址(如127.0.0.0 或 0.0.0.0)的数据报不发 送 ICMP 差错报告报⽂。
ICMP询问报文有两种
1、回送请求/回答报文:请求type=8,回答type=0
该类报文用于测试目的主机是否可到达。ping用的就是这种ICMP报文。
2、时间戳请求/回答报文:请求type=13,回答type=14
该类报文用于计算报文的RTT(网络时延),请求报文会记录发送时间,回答报文会记录接收时间。
询问报文和差错报告报文的区别在于,前者一定包括请求和回答2个一对的报文,会有响应。
traceroute命令的原理
traceroute进程从源主机向目标主机发送一连串的IP数据报,里面封装的是无法交付的UDP报文(例如目的端口使用了目标主机不存在的进程端口)。
第一个数据报P1设置其生存时间TTL=1,P1到达第一个路由器R1就被丢弃(TTL减1再检查TTL),并向源主机发送一个ICMP时间超过差错报告。
源主机又发送第二个数据报P2,TTL=2,该报文会经过2个路由器,然后被第二个路由器发送ICMP时间超过差错报告。
重复上述过程,一直到最后一个数据报刚好到达目的主机,TTL刚好减剩为1,主机不再对TTL减1。但由于目的端口指定的进程不存在,因此目的主机会向源主机发送终点不可达的ICMP报文。
这样源主机就知道了经过的每一个路由器的IP(由ICMP的发送方IP可知)和RTT,从而知道源主机到目的主机的路径和时延。