作者:
CSDN VC/MFC 網絡編程PiggyXP ^_^
目錄:
一. 關於 ARP 協議的基礎知識
3. ARP包的填充
二。發送數據包的編程實現
1.填充數據包
.........................緊接上文............................
3.ARP 包的填充
1) 請求包的填充:
比如我們的電腦Mac地址為 aa-aa-aa-aa-aa-aa,IP為 192.168.0.1
我們想要查詢 192.168.0.99的Mac地址,應該怎麼來做呢?
首先填充DLC Header,通過前面的學習我們知道,想要知道某個計算機對應的Mac地址是要給全網發送廣播的,所以接收方Mac肯定是 ffffffffffff,發送方Mac當然是自己啦, 於是我們的DLC Header就填充完成了,如圖,加粗的是我們要手動輸入的值(當然我編的程序比較智能,會根據你選擇的ARP包類型幫你自動填入一些字段,你一用便知^_^)。
DLC Header
字段
長度(Byte)
填充值
接收方Mac
6
ffffffffffff
發送方Mac
6
aaaaaaaaaaaa
Ethertype
2
0x0806
圖3 ARP請求包中 DLC Header內容
接下來是ARP幀,請求包的操作碼當然是 1,發送方的Mac以及IP當然填入我們自己的,然後要注意一下,這裡的接收方IP填入我們要查詢的那個IP地址,就是192.168.0.99了,而接收方Mac填入任意值就行,不起作用,於是,如圖,
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
圖4 ARP請求包中 ARP幀的內容
如果我們構造一個這樣的包發送出去,如果 192.168.0.99存在且是活動的,我們馬上就會收到一個192.168.0.99發來的一個響應包,我們可以查看一下我們的ARP緩存列表,是不是多了一項類似這樣的條 目:
192.168.0.99 bb-bb-bb-bb-bb-bb
是不是很神奇呢?
我們再來看一下ARP響應包的構造
2) 響應包的填充
有了前面詳細的解說,你肯定就能自己說出響應包的填充方法來了吧,所以我就不細說了,列兩個表就好了
比如說給 192.168.0.99(MAC為 bb-bb-bb-bb-bb-bb)發一個ARP響應包,告訴它我們的Mac地址為 aa-aa-aa-aa-aa-aa,就是如此來填充各個字段
DLC Header
字段
長度(Byte)
填充值
接收方Mac
6
bbbbbbbbbbbb
發送方Mac
6
aaaaaaaaaaaa
Ethertype
2
0x0806
圖5 ARP響應包中 DLC Header內容
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
圖6 ARP響應包中 ARP幀的內容
這樣192.168.0.99的ARP緩存中就會多了一條關於我們192.168.0.1的地址映射。
好了,終於到了編程實現它的時候了^_^
二. 發送 ARP 包的編程實現
1. 填充數據包
上面的那些關於 ARP 包各個字段的表格,對應在程序裡就是結構體, 對應於上面的表格, 於是我們需要三個下面這樣的結構體
// 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;
這些結構體一定能看懂吧 , 在程序中就是對號入座就好了