计算机网络之ICMP/ARP协议

377 阅读7分钟

ICMP协议

网际控制报文协议ICMP,ICMP是一个网络层协议,但它的报文不是直接传递给数据链路层。ICMP报文要先封装层ip数据报,然后才被传递到下一层。

image-20210130163553259.png

image-20210130163435416.png

所以ICMP属于ip层的协议。

ICMP报文可划分为两大类:差错报告报文和查询报文

image-20210130163900635.png

差错报告报文

ICMP报文一般由一个8字节的首部和可变长度的数据部分组成。虽然对每一种报文类的首部一般格式都是不同的,但前4个字节对所有类型来说都是相同的。

image-20210130164241850.png

ICMP只能报告差错,不能纠正差错。差错报文总是发送给最初的数据源,因为在数据报中唯一可用的信息就是源ip地址和目的ip地址。ICMP利用了源IP地址把差错报文发送给数据报的源点。

由5种类型的差错要处理:终点不可达、源点抑制、超时、参数问题以及改变路由。

image-20210130164725113.png

  • 终点不可达

    当路由器无法为一个数据报找到路由,或者主机无法交付一个数据报时,该数据报被丢弃,然后由路由器或主机向发出这个数据报的源主机返回一个终点不可达报文

image-20210130171211973.png

  • 源点抑制

    ICMP的源点抑制报文就是为了给IP协议增加某种程度的流量控制和拥塞控制而设计的。当路由器或主机因拥塞而丢弃数据报时,它就向该数据报发送方发送一个源点抑制报文。第一,通知源点数据报被丢弃,第二,它警告源点路径拥塞,必须放慢发送过程。

image-20210130172824094.png

遭遇拥塞的路由器或目的主机必须为每一个丢弃的数据报向源主机发送一个源点抑制报文。

没有一种机制可以告诉源点,拥塞已得到缓解,可以按照原来的速率发送数据报了。源点只是不断底降低发送速率,直到不再收到。

在一对一的通信或多对一的通信中都有可能产生拥塞。一对一的情况,源点抑制报文比较管用,一对多的情况下,可能无法分辨造成拥塞的源点,而丢弃了发送速率慢的源点的数据报。

  • 超时

    一个数据报的生存时间字段减为0,路由器则丢弃并向源点发送一个超时报文。

    当最后的终点在规定的时间内没有收到所有的分片时,它就丢弃已收到的分片,并向源点发送超时报文

image-20210130172848222.png

代码0仅供路由器使用,说明数据报的生存时间字段值为0。代码1仅供目的主机使用,说明不是所有的分片都按时到达了。

  • 参数问题

    如果路由器或目的主机发现了首部出现的任何二义性问题,或者在数据报的某个字段中缺少某个值,就会丢弃这个数据报,并向源点返回一个参数问题报文。

image-20210130173529769.png

代码0 首部的某个字段中的差错或二义性;代码1表示缺少所需的现象部分

  • 改变路由(重定向)

    为了提高效率,主机不参与路由选择更新过程,因为主机很多,动态更新主机的路由表会产生无法容纳的通信量。主机通常使用静态路由选择刚开始主机中只有默认路由,发送数据是可能发给错误的路由器。这种情况下收到这个数据报的路由器会把它转发给正确的路由器。但为了更新主机中的路由表,路由器还要向主机发送一个改变路由报文

image-20210130174417003.png

主机刚开始工作时只有一张很小的路由表,这个路由表逐渐增大和更新。完成这项任务的工具之一就是改变路由报文。

image-20210130174538808.png

  • 代码0,对特定网络路由的改变

    代码1,对特定主机路由的改变

    代码2,基于指定服务类型的对特定网络路由的改变

    代码3,基于指定服务类型的对特定主机路由的改变

    改变路由报文是由路由器向同一个本地网络上的主机发送的

ICMP差错报文的一些要点:

image-20210130164837321.png

所有的差错报文都包含一个数据部分,它包括的是原始数据报的IP首部再加上该数据包数据的前8个字节。加上原始数据报的首部是为了向接收差错报文的原始信源给出关于数据报本身的信息。之所以要包含数据的前8个字节是因为这前8个字节提供了关于端口号(UDP和TCP)和序号(TCP)的信息。为了让源点能够通知这些协议(TCP或UDP)就需要这些信息。

image-20210130165651343.png

查询报文

  • 回送请求和回送回答报文

    回送请求报文可以由主机或路由器发送,收到回送请求报文的主机或路由器发送回送回答报文。

    回送请求和回送回答报文可被网络管理员用来检查IP协议的工作情况。

    用回送请求和回送回答报文可测试某个主机的可达性通常是调用ping命令来实现的

image-20210130180254903.png

  • 时间戳请求和回答

    两个机器(主机或路由器)可以使用时间戳请求和时间戳回答报文来确定IP数据报在这两个机器之间来回所需的往返时间。

image-20210130180512293.png

image-20210130180629800.png

只有当源点和终点机器的时钟是同步的,发送时间和接收时间的计算才算是准确的。但即使时钟不同步,往返时间的 计算依然准确。(往返时间出现两次,同步的差别被抵消了)

程序ping可用来查出某个主机是否已加电并能够响应。

程序traceroute(unix系统下)或程序tracert(Windows下)可以用来跟踪一个分组从源点到终点的路径。

ARP协议

在网络层,主机和路由器通过逻辑地址(IP地址,32位)来识别。它是一个唯一的全球地址。

在物理层,主机和路由器通过物理地址(MAC地址,48位)。它是一个本地地址。在本地范围内必须唯一,全局上不需要。MAC地址呗写入安装在主机或路由器中的网络接口卡(NIC)中。

所以,要想把一个分组交付到主机或路由器需要用到两级地址:逻辑地址和物理地址。我们要把网络地址映射为响应的物理地址,反之亦然。这样的映射可通过静态映射和动态映射来完成。

静态映射

提前把每一台主机的逻辑地址和物理地址映射都存放在一张表上,这个表存储在每一台机器上。

缺点:不利于更新。

动态映射

地址解析协议(ARP)。ARP接收来自ip协议的逻辑地址,将其映射为相应的物理地址,然后把这个物理地址递交给数据链路层。

ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。

image-20210130144354105.png

image-20210130145236305.png

任何时候,当主机或路由器需要找出这个网络上的另一个主机或路由器的物理地址时,它可以发送一个ARP查询分组。这个分组包括了发送方的物理地址和ip地址以及接收方的ip地址。因为发送方不知道接收方的物理地址,所以这个查询分组会在网络上进行广播。

网络上的每一台主机或路由器都会接收并处理这个ARP响应分组,但只有期待的接收方才能认出是自己的ip地址,并返回一个ARP响应分组。这个响应分组包含有接收方的IP地址和物理地址。这个分组利用收到的查询分组中的物理地址以单播方式直接发送给查询者。

image-20210130150325884.png

使用ARP的四种典型情况

image-20210130145616130.png

image-20210130150104298.png