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