【计算机网络】13、ARP 包:广播自己的 mac 地址和 ip

机器启动时,会向外广播自己的 mac 地址和 ip 地址,这个即称为 arp 协议。范围是未经过路由器的部分,如下图的蓝色部分,范围内的设备都会在本地记录 mac 和 ip 的绑定信息,若有重复则覆盖更新(例如先收到 mac1-ip1、再收到 mac2-ip1 时则覆盖记录为 mac2-ip):

arp 的范围

案例:假设某设备 reboot 后 mac 地址会变化,则每次 reboot 都会向外发送不同的 arp 包(如先发送自己为 mac1-ip1,下一次 reboot 时再发送自己是 mac2-ip1,再下一次 reboot 时发送自己是 mac3-ip1)。如下图是 reboot 后变化的 mac 地址(通过 ip a 可看出 mac 地址):
reboot 后变化的 mac 地址

作为网络管理员(IT)通常为了应对这种「设备 reboot 后 mac 地址的变化」,对 DHCP 的冲击,会做一些限制,如在交换机上设置其上的某网口,最多接受 50 个 mac 地址,若超过则丢包。

  • DHCP 是一个服务,是通过 mac 地址请求 ip 地址,可单独作为一个 server 部署,也可在交换机上配置部署。
  • 如果设备 reboot 后 mac 地址总会变化,则对于同一个设备,其每次 reboot 都会向 DHCP 请求一个 ip 地址,这会耗尽局域网内的 ip 地址资源,导致其他设备无 ip 可用,从而网络瘫痪,此行为可视为一种网络攻击。
    • 如设备 a,第一次 reboot 会以 maca 向 DHCP 拿到 ipa,第二次 reboot 会以 maca 向 DHCP 拿到 ipb,第 n 次 reboot 会以 maca 向 DHCP 拿到 ipn
    • 而 DHCP 的缓存是有过期时间的,虽然第 n 次时 设备 a 只使用了 ipn,但其之前拿到很多自己不需要的 ip 地址(如 ipa、ipb、。。。ipn-1)
    • 这会造成局域网内的其他设备(如b、c、d、e)无 ip 可用,从而网络瘫痪,此行为可视为一种网络攻击。
    • 所以,网络管理员会设置规则,限制如在交换机上设置其上的某网口,最多接受 50 个 mac 地址,若超过则丢包,如下图
      交换机上的限制

随机生成 mac 地址的命令(前面6个数字也可以随机):

echo 13:25:46:`echo $RANDOM | md5sum | sed 's/../&:/g' | cut -c1-8`

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ARP协议(地址解析协议)是一种用于将网络层地址(如IP地址)解析为数据链路层地址(如MAC地址)的协议。其工作原理如下: 1.当主机A需要向主机B发送数据时,首先检查其ARP高速缓存(ARP Cache)中是否有主机B的IP地址对应的MAC地址。如果有,则直接将数据帧发送给主机B的MAC地址;如果没有,则执行第2步。 2.主机A向网络广播一个ARP请求,请求含主机A的IP地址MAC地址,以及主机B的IP地址。网络中所有主机都会收到这个请求,但只有主机B会响应。 3.主机B收到ARP请求后,会向主机A单独发送一个ARP响应,响应含主机B的IP地址MAC地址。 4.主机A收到ARP响应后,将主机B的IP地址MAC地址存入其ARP高速缓存中,并将数据帧发送给主机B的MAC地址。 下面是一个简单的Python实现,用于发送ARP请求并接收ARP响应: ```python import socket import struct def get_mac_address(ip_address): # 创建ARP请求 arp_request = struct.pack("!HHHBBH6s4s6s4s", # ARP请求格式 0x0001, # 硬件类型:以太网 0x0800, # 协议类型:IPv4 0x0006, # 硬件地址长度:6 0x0004, # 协议地址长度:4 0x0001, # 操作类型:ARP请求 b"\x00\x00\x00\x00\x00\x00", # 发送方MAC地址 socket.inet_aton("192.168.1.100"), # 发送方IP地址 b"\x00\x00\x00\x00\x00\x00", # 目标MAC地址 socket.inet_aton(ip_address)) # 目标IP地址 # 创建套接字并发送ARP请求 s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.SOCK_RAW) s.bind(("eth0", socket.SOCK_RAW)) s.send(arp_request) # 接收ARP响应 while True: packet = s.recvfrom(2048)[0] eth_header = struct.unpack("!6s6sH", packet[:14]) if eth_header[2] == 0x0806: # 如果是ARP响应 arp_header = struct.unpack("2s2s1s1s2s6s4s6s4s", packet[14:42]) if socket.inet_ntoa(arp_header[6]) == ip_address: return ":".join("{:02x}".format(ord(c)) for c in arp_header[5]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值