参考手册:https://fossies.org/dox/scapy-2.3.3/
当一台主机把以太网数据帧发送到位于同一个局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。
设备驱动程序从不检查IP数据包中的目的IP地址。
地址解析为这两种不同的地址形式提供映射:32bit的IP地址和数据链路曾使用的任何类型的地址。(FR环境)
ARP为IP地址到对应的硬件地址之间提供动态映射。我们之所以用动态这个词是因为这个过程是自动完成的,一般应用程序用户或系统管理员不必关心。
在ARP背后有有一个基本概念,那就是网络接口有一个硬件地址(一个48bit的值,标识不同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但是TCP/IP有自己的地址:32bit的IP地址。知道主机的IP地址并不能让内核发送一帧数据给主机。内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。
点对点链路不使用ARP。当设置这些链路时(一般在引导过程进行),必须告知内核链路每一端的IP地址。像以太网地址这样的硬件地址并不涉及。
只有多路访问链路才需要ARP这样的技术。



ARP高效运行的关键是由于每个主机上都有一个ARP高速缓存。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟,起始时间从被创建时开始算起。
▼ARP请求包样例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import logging
logging.getLogger( "scapy.runtime" ).setLevel(logging.ERROR)
from scapy. all import *
localmac = '00:0c:29:8d:5c:b6'
localip = '202.100.1.138'
destip = '202.100.1.139'
ifname = 'eno33554944'
result_raw = srp(Ether(src = localmac, dst = 'FF:FF:FF:FF:FF:FF' ) / ARP(op = 1 , hwsrc = localmac, hwdst = '00:00:00:00:00:00' , psrc = localip, pdst = destip), iface = ifname, verbose = False )
result_list = result_raw[ 0 ].res
print ( 'IP地址: ' + result_list[ 0 ][ 1 ][ 1 ].fields[ 'psrc' ] + ' MAC地址: ' + result_list[ 0 ][ 1 ][ 1 ].fields[ 'hwsrc' ])
|

本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1980254,如需转载请自行联系原作者