ARP個人理解以及和python的結合
本人目前還是名高中生,以下全是自學,如有錯誤請諒解,大佬勿噴
聯系QQ:3037580090
一. ARP簡介
-
當一臺主機把資料發送到位于同一局域網的另一臺主機時,是根據48bit的以太網地址(mac地址)來確定目的和介面的,設備驅動程式從不檢查IP資料報中的目的IP地址,
-
地址決議為這兩種不同的地址形式提供映射:32bit的IP地址和資料鏈路層使用的任何型別的地址,
-
ARP為IP地址到對應的硬體地址(windows中的mac地址)之間提供動態映射,動態映射的“動態”,也就是自動的
注意:只有在多路訪問鏈路才需要ARP技術自己的理解:在多路訪問鏈路的網路中(如局域網)兩臺主機進行資料傳送只知道IP是無法通信的,需要ARP協議將IP與對應的硬體地址進行動態映射才能進行資料互動
二. ARP高速快取(命令: arp -a)
ARP高速運行的關鍵是由于每個主機上都有一個ARP高速快取表,這個表上存放了最近internet地址到硬體地址之間的映射記錄,高速快取中的每一項的生存時間一般為20分鐘

三. 安裝scapy(網路工具,可匯入的模塊)
https://www.cnblogs.com/beyond2019/p/11067618.html(轉載,如有侵權請聯系)
詳情請查百度
四. Scapy的基本使用
-
scapy默認值舉例

-
實體:產生一個ping包

-
Scapy收發資料包的方式
前提:帶p的發二層資料包,需要有Ether(); 沒有p的發三層資料包,不需要Ether()
sr() 發送三層資料包,等待一個或多個資料包的回應
srp() 發送兩層資料包,等待一個或多個資料包的回應
sr1() 發送三層資料包,并且等待且僅等待一個資料包的回應
send() 發送二層資料包
sendp() 發送三層資料包
五. Python結合scapy實作arp收發包
代碼示例

代碼刨析
了解: 在構造包的時候的verbose=False的作用是在輸出的時候不顯示錯誤
關鍵代碼刨析print(pack[0].res[0].getlayer(ARP).fields[“hesrc”])
-
第一步輸出print(pack)時是一個元組,第一個是有結果的包,第二個是沒有回應的包

-
第二步輸出print(pack[0])顯示第一個欄位
-
第三步print(pack[0].res)將結果顯示為串列,串列里套著元組(目的是為了區分多個收發包),第一個串列里的元組的第一個值是請求包,第二個值是接收包

-
第四步print(pack[0].res[0])顯示第一個串列中的請求和接收包

-
第五步print(pack[0].res[0][1])顯示元組中的接受包,輸出的內容使用的是二進制(因為要獲取目標mac地址)

-
第六步print(pack[0].res[0][1].getlayer(ARP).fields)獲取ARP值并以字典的形式顯示

-
第七步print(pack[0].res[0][1].getlayer(ARP).fields[“hwdst”]) 在輸出的字典中查找hwdst(源mac地址)所對應的值

成功獲取到目標的mac地址
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/258048.html
標籤:其他
