概念理解:
把这三种关键的协议想象成一个公司的不同部门:
ARP: 像是公司的内部电话薄,负责查询内部同事(同一个网络的设备)的分机号(MAC地址)。
ICMP:像是公司的后勤和运维部门,负责测试网络连通性(ping)报告错误(目标不可达)等,保证网络基础设备的健康。
IGMP:像是公司的内部广播小组,负责管理谁想接收公司的群组广播(组播流量)。
1、ARP - 地址解析协议
- 工作层次:数据链路层(第二层)网络层(第三层)之间。
- 核心功能:根据IP地址查询对应的MAC地址(物理地址)。
为什么要使用ARP?
局域网(LAN)中,数据包的最终传输是靠MAC地址而不是IP地址。当一台设备想要和同网段的另一台设备通讯的时候,他只知道目标地址的IP地址,但是不知道目标地址的MAC地址,数据帧就无法被正常组装和发送。
为什么在第二层
- ARP报文是直接封装在数据链路层的帧中传输的(如:以太网帧)。他不使用IP协议。
- 工作范围被限制在了一个局域网中,这是典型的数据链路层特征。
**数据帧结构示意
test
[ 以太网帧头 | ARP请求/应答报文 | 帧校验 ]
其中以太网帧头包含了源和目标的MAC地址。
工作原理:
ARP使用广播 的方式来查询:
1.1、ARP请求(广播) :你的设备会向整个局域网广播一个消息:"大家好,我是 192.168.1.10 ,我的mac地址是A1:A2:A3:A4:A5:A6 。请问IP地址是 192.168.1.20 的设备,你的mac地址是什么?"
1.2、ARP回复(单播) :局域网中的所以设备都会收到这个广播,但是只有IP地址是 192.168.1.20 的设备会回应:"你好,我是 192.168.1.20 我的mac地址是:B1:B2:B3:B4:B5:B6。"
然后地址就被记录在了ARP表里。
Linux中的相关命令
- arp 和 ip neigh: 查看本地的ARP缓存,这个表记录了IP地址和MAC地址的的对应关系,由一定的有效期。
c
$ ip neigh
192.168.1.1 dev eth0 lladdr cc:cc:cc:cc:cc:cc REACHABLE
192.168.1.20 dev eth0 lladdr b1:b2:b3:b4:b5:b6 STALE
- arping :用于手动发送ARP请求包,常用语检测IP冲突或者测试网络连通性。
2、ICMP - 互联网控制消息协议
- 工作层次:网络层(第三层)
- 核心功能: 用于在IP主机、路由器之间传递控制消息,如网络不通,主机是否可达,路由是否可用等。通常被认作是IP协议的一个组成部分。
为什么要使用ICMP?
IP协议本身就是"尽力而为"的,不提供差错报告和诊断机制。ICMP就是为了弥补这个缺陷而生的,负责网络的诊断。
常见应用:
- Ping命令: 最著名的ICMP应用。ping 发送一个 ICMP Echo Request 消息到目标主机,如果目标主机在线且通畅,它会回复一个 ICMP Echo Reply。
- Traceroute命令: 用于追踪数据包到达目标主机所经过的路由路径。它通过巧妙设置IP包的TTL(生存时间)值,并捕获路由器返回的 ICMP Time Exceeded 消息来实现。
- 错误报告: 当路由器无法将数据包发送到目的地时,它会向源IP发送一个 ICMP Destination Unreachable 消息。
linux中的向命令
- ping <IP地址>:测试网络连通性。
- traceroute <IP地址> 或 tracepath <IP地址>:追踪路由路径。
3、IGMP - 互联网组管理协议
- 工作层次:网络层(第三层)
- 核心功能:在IPv4中管理组播组成员。它允许主机告诉本地路由器:"我想加入某个组播组"或者"我不想在接收某个组播组的流量了"。
为什么需要IGMP?
想象一下网络电视,如果服务器为每个请求者都发送一份独立的视频流(单播),网络带宽就会迅速的耗尽。组播解决了这个问题:服务器只发送一份视频流,由网络路由器负责复制并转发给所以声明要接受该流量的主机。
工作原理
1、一个组播源开始向另一个特定的组播IP发送数据。
2、局域网中的设备如果对这个组播内的内容感兴趣,会通过IGMP想本地路由器发送一个 Membership Reprot (成员报告)消息,说"我要加入这个组"。
3、路由器在接收到报告之后,就知道需要将发往该组播地址的数据流转发到这个设备所在的网段。
4、路由器会定期的发送 Membership Query (成员查询)消息,询问是否还有主机对组播流量感兴趣,如果摸个组中没有设备回应,路由器就会停止想该网段转发该组播流量。
在Linux中的相关命令:
- netstat -g:显示当前主机加入了哪些组播组。
- ss -g:同样可以显示组播组成员信息。