ARP简介
來源:http://blog.chinaunix.net/u/8780/showart.php?id=147506
?
一.??? 關于 ARP 協議的基礎知識
?
1 . ARP 的工作原理
以太網設備比如網卡都有全球唯一的 MAC 地址,MAC地址是網卡的物理地址,它由48位二進制數表示。其中前面24位表示網絡廠商標識符,是由生產網卡的廠商向IEEE申請的廠商地址。后24位表示序號,由廠商自行分配。每個不同的網絡廠商會有不同的廠商標識符,而每個廠商所生產出來的網卡都是依序號不斷變化的。 網卡等是以 MAC 地址來傳輸以太網數據包的(它們識別不了 IP 包中的 IP 地址),所以在以太網中進行 IP 通信的時候就需要一個協議來建立 IP 地址與 MAC 地址的對應關系,以使 IP 數據包能發到一個確定的地方去。這就是 ARP(Address Resolution Protocol ,地址解析協議 ) 。
?
arp命令 可以查詢本地arp緩存:
???? arp –a
?
可以發現類似于這樣的條目
192.168.45.100??? 01-23-45-67-89-ab??? dynamic
這就是存儲的關于IP 地址與MAC 地址的對應關系,dynamic 表示是臨時存儲在ARP 緩存中的條目,過一段時間就會超時被刪除(xp/2003 系統是2 分鐘) 。
?
這樣一來,某臺電腦要和一臺機器(比如192.168..45.1) 通信的時候,它會首先去檢查arp 緩存,查找是否有對應的arp 條目,如果沒有,它就會給這個以太網絡發ARP 請求包 廣播詢問192.168.45.1 的對應MAC 地址,當然,網絡中每臺電腦都會收到這個請求包,但是它們發現192.168.45.1 并非自己,就不會做出相應,而192.168.45.1 就會回復一個ARP 應答包 ,告訴它的MAC 地址是xx-xx-xx-xx-xx-xx, 于是發出ARP請求的計算機中的ARP 緩存就會相應刷新, 多了這么一條:
192.168.45.1 ?? xx-xx-xx-xx-xx-xx?? dynamic
?
ARP 緩存是為了避免每發一個IP 包都要發個廣播查詢地址。
?? ?
??? 網絡設備是無法識別ARP 包的真偽的,如果按照ARP 的格式來發送數據包,只要信息有效計算機就會根據包中的內容做相應的反應.
?
?
?
2 .ARP 包的格式
?
???? 從網絡底層看來,一個ARP 包是分為兩個部分的, 前面一個是物理幀頭 ,后面一個才是 ARP 幀 。
???? 首先,物理幀頭,它將存在于任何一個協議數據包的前面,被稱為 DLC Header ,因為這個幀頭是在數據鏈路層構造的,并且其主要內容為收發雙方的物理地址,以便硬件設備識別。 ?
| DLC Header | |||
| 字段 | 長度(Byte) | 默認值 | 備注 |
| 接收方MAC | 6 | ? | 廣播時, 為 ff-ff-ff-ff-ff-ff |
| 發送方MAC | 6 | ? | ? |
| Ethertype | 2 | 0x0806 | 0x0806 是ARP 幀的類型值 |
?????????????????????????? 圖1 物理幀頭格式
?
?
ARP 幀的格式. ?
| ARP Frame | |||
| 字段 | 長度(Byte) | 默認值 | 備注 |
| 硬件類型 | 2 | 0x1 | 以太網類型值 |
| 上層協議類型 | 2 | 0x0800 | 上層協議為IP 協議 |
| MAC 地址長度 | 1 | 0x6 | 以太網MAC 地址長度為 6 |
| IP 地址長度 | 1 | 0x4 | IP 地址長度為 4 |
| 操作碼 | 2 | ? | 0x1 表示ARP 請求包,0x2 表示應答包 |
| 發送方MAC | 6 | ? | ? |
| 發送方IP | 4 | ? | ? |
| 接收方MAC | 6 | ? | ? |
| 接收方IP | 4 | ? | ? |
| 填充數據 | 18 | ? | 因為物理幀最小長度為64 字節, 前面的42 字節再加上4 個CRC 校驗字節, 還差18 個字節 |
???????????????????????????? 圖2 ARP 幀格式
?
?
3.ARP 包的填充 ? 1) 請求包的填充:
?????例某計算機A的MAC地址為 aa-aa-aa-aa-aa-aa,IP為 192.168.0.1 ?要查詢 192.168.0.99的MAC地址: ?????首先填充DLC Header;想要知道某個計算機對應的MAC地址是要給全網發送廣播的,所以接收方MAC 是 ffffffffffff。 于是DLC Header就填充完成了,如圖:
| DLC Header | ||
| 字段 | 長度(Byte) | 填充值 |
| 接收方MAC | 6 | ffffffffffff |
| 發送方MAC | 6 | aaaaaaaaaaaa |
| Ethertype | 2 | 0x0806 |
| ??????????????????????????? ARP Frame | ||
| 字段 | 長度(Byte) | 填充值 |
| 硬件類型 | 2 | 1 |
| 上層協議類型 | 2 | 0800 |
| MAC地址長度 | 1 | 6 |
| IP地址長度 | 1 | 4 |
| 操作碼 | 2 | 1 |
| 發送方MAC | 6 | aaaaaaaaaaaa |
| 發送方IP | 4 | 192.168.0.1 |
| 接收方MAC | 6 | 任意值 xxxxxxxxxxxx |
| 接收方IP | 4 | 192.168.0.99 |
| 填充數據 | 18 | 0 |
| DLC Header | ||
| 字段 | 長度(Byte) | 填充值 |
| 接收方MAC | 6 | bbbbbbbbbbbb |
| 發送方MAC | 6 | aaaaaaaaaaaa |
| Ethertype | 2 | 0x0806 |
| ARP Frame | ||
| 字段 | 長度(Byte) | 填充值 |
| 硬件類型 | 2 | 1 |
| 上層協議類型 | 2 | 0800 |
| MAC地址長度 | 1 | 6 |
| IP地址長度 | 1 | 4 |
| 操作碼 | 2 | 2 |
| 發送方MAC | 6 | aaaaaaaaaaaa |
| 發送方IP | 4 | 192.168.0.1 |
| 接收方MAC | 6 | bbbbbbbbbbbb |
| 接收方IP | 4 | 192.168.0.99 |
| 填充數據 | 18 | 0 |
1.??????? 填充數據包
?
相應的數據結構:
? // DLC Header
typedef struct tagDLCHeader?? {
?? unsigned char ????? DesMAC[6];?????? /* destination HW addrress */
?? unsigned char ????? SrcMAC[6];?????? /* source HW addresss */
?? unsigned short ???? Ethertype;?????? /* ethernet type */
} DLCHEADER, *PDLCHEADER;
?
// ARP Frame
typedef struct tagARPFrame? {
???? ???? unsigned short ???????? HW_Type;????? /* hardware address */
???? ???? unsigned short ???????? Prot_Type;??? /* protocol address */
???? ???? unsigned char ????? HW_Addr_Len;????? /* length of hardware address */
???? ???? unsigned char ????? Prot_Addr_Len;??? /* length of protocol address */
???? ???? unsigned short ???????? Opcode;?????? /* ARP/RARP */
?
???? ???? unsigned char ????? Send_HW_Addr[6];? /* sender hardware address */
???? ???? unsigned long ????? Send_Prot_Addr;?? /* sender protocol address */
???? ???? unsigned char ????? Targ_HW_Addr[6];? /* target hardware address */
???? ???? unsigned long ????? Targ_Prot_Addr;?? /* target protocol address */
???? ???? unsigned char ????? padding[18];
} ARPFRAME, *PARPFRAME;
?
// ARP Packet = DLC header + ARP Frame
typedef struct tagARPPacket??? {
???? DLCHEADER???? dlcHeader;
???? ARPFRAME????? arpFrame;
} ARPPACKET, *PARPPACKET;
?
?
2.發送ARP數據包 ???發送ARP包需要用到winpcap的api。具體步驟及函數詳見下面的代碼(為了簡單,錯誤處理的地方都被去掉了): /******************************************************************* * *??? 功能: *???????? 發送ARP數據包 * *******************************************************************/ void SendARPPacket() { ???? char *AdapterDeviceName =GetCurAdapterName(); ????// 首先獲得獲得網卡名字 ???? lpAdapter = PacketOpenAdapter(AdapterDeviceName);???? // 根據網卡名字打開網卡 ???? lpPacket = PacketAllocatePacket();????????? ?????// 給PACKET結構指針分配內存 ???? PacketInitPacket(lpPacket, &ARPPacket, sizeof(ARPPacket));?//初始化PACKET結構指針, 其中的ARPPacket是已經填充的ARP包 ???? PacketSetNumWrites(lpAdapter, 1);?????????// 每次只發送一個包 ???? PacketSendPacket(lpAdapter, lpPacket, true); ???? PacketFreePacket(lpPacket);?????????????????// 釋放資源 ???? PacketCloseAdapter(lpAdapter); } 使用ARP 包的tricks ?在沒有安全防護的網絡里......
?
1)???如果 ? 發一個請求包廣播,其中的 ARP 幀里相關的信息填成這樣:
?
| 發送方MAC | 6 | 隨便亂填一個錯誤的 |
| 發送方IP | 4 | ? 填上本機的IP |
?? 本機將會顯示一個 IP 地址沖突的提示。同樣的道理,如果發送方 IP 填成別人的,然后,每隔x 秒發一次 ………
?
2)?????? 假設A、B都靠一個網關 192.168.0.1 上網 ,如果A想讓B( 192.168.0.77) 上不了網,就可以偽裝成網關給 192.168.0.77 發一個錯誤的 ARP 響應包 ,如:
| 發送方MAC | 6 | 隨便亂填一個錯誤的 |
| 發送方IP | 4 | ? 網關IP 192.168.0.1 |
接收方就填 192.168.0.77 的相關信息,........
總結
- 上一篇: 使用XFire+Spring构建Web
- 下一篇: 我国首个甲醇制氢加氢一体站投用:占地仅