Linux网络协议ARP IGMP ICMP的理解

概念理解:

把这三种关键的协议想象成一个公司的不同部门:

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:同样可以显示组播组成员信息。
相关推荐
BullSmall11 分钟前
Test Matrix:测试矩阵(IT 领域定义 + 设计实践 + 华为场景应用)
运维·服务器
liuyao_xianhui32 分钟前
版本控制器git--gdb/cgdb
linux·运维·服务器·git
CS_浮鱼32 分钟前
【Linux进阶】mmap实战:文件映射、进程通信与LRU缓存
linux·运维·c++·缓存
chuxinweihui1 小时前
应用层协议 HTTP
linux·服务器·网络·网络协议·http
chuxinweihui1 小时前
HTTP cookie 与 session
网络·网络协议·http
RocketJ1 小时前
TCP、Telepathy 和 HTTP 三者关系
网络协议·tcp/ip·http
xu_yule1 小时前
Linux_16(多线程)信号量+基于环形队列的生成消费模型+自选锁+读写锁
linux·运维·服务器
默恋~微凉1 小时前
Shell(九)——HTTP与HTTPS协议
网络协议·http·https
fei_sun1 小时前
【复习】计网每日一题1121大题--HTTP/1.0、HTTP/1.1、持续连接、非持续连接、并行连接、Web、JPEG图像
网络·网络协议·http
Yan-英杰1 小时前
解决方案: CondaHTTPError: HTTP 000 CONNECTION FAILED for url
网络·网络协议·http