ARP協議的工作過程和區域網使用
一、ARP的工作過程
1. 原理:(ARP協議只使用於區域網中)
1> 在區域網中,網路中實際傳輸的是“幀”,幀裡面是有目標主機的MAC地址的。
2> 在乙太網中,一個主機要和另一個主機進行直接通訊,必須要知道目標主機的MAC地址。但這個目標MAC地址是如何獲得呢?它就是通過地址解析協議獲得的。所謂“地址解析”就是主機在傳送幀前將目標IP地址轉換成目標MAC地址的過程。
3> ARP協議的基本功能就是通過目標裝置的IP地址,查詢目標裝置的MAC地址,以保證通訊的順利進行。
4> 點對點的連線是不需要ARP協議的
2. 工作過程:
1> 當主機A向本區域網上的某個主機B傳送IP資料報時,就先在自己的ARP緩衝表中檢視有無主機B的IP地址。
2> 如果有,就可以查出其對應的硬體地址,再將此硬體地址寫入MAC幀,然後通過乙太網將資料包傳送到目的主機中。
3> 如果查不到主機B的IP地址的表項。可能是主機B才入網,也可能是主機A剛剛加電。其高速緩衝表還是空的。在這中情況下,主機A就自動執行ARP。
(1)ARP程序在本區域網上廣播一個ARP請求分組。ARP請求分組的主要內容是表明:我的IP地址是192.168.0.2,我的硬體地址是00-00-C0-15-AD-18.我想知道IP地址為192.168.0.4的主機的硬體地址。
(2)在本區域網上的所有主機上執行的ARP進行都收到此ARP請求分組。
(3)主機B在ARP請求分組中見到自己的IP地址,就向主機A傳送ARP響應分組,並寫入自己的硬體地址。其餘的所有主機都不理睬這個ARP請求分組。ARP響應分組的主要內容是表明:“我的IP地址是192.168.0.4,我的硬體地址是08-00-2B-00-EE-AA”,請注意:雖然ARP請求分組是廣播發送的,但ARP響應分組是普通的單播,即從一個源地址傳送到一個目的地址。
(4)主機A收到主機B的ARP響應分組後,就在其ARP高速緩衝表中寫入主機B的IP地址到硬體地址的對映。
二、抓取區域網內主機mac地址
指令碼1:
指令碼二(利用C++的sendarp函式):
/*
* 獲取區域網內IP地址為ipDst的MAC地址,結果儲存在byDstMac引數中
* 返回操作是否成功
*/
template<int nSize>
BOOL GetMacAddress( IPAddr ipDst, BYTE (&byDstMac)[nSize] )
{
ASSERT( nSize >= 6 );
memset( byDstMac, 0, nSize );
DWORD dwBufferLen = nSize;
DWORD dwRet = ::SendARP( ipDst, 0 , (PULONG)&byDstMac, &dwBufferLen );
return dwRet == NO_ERROR;
}
BYTE byDstMac[6];
if( GetMacAddress(::inet_addr("192.168.8.132"), byDstMac))
{
CString strMac;
strMac.Format(_T("%.2X-%.2X-%.2X-%.2X-%.2X-%.2X"), byDstMac[0], byDstMac[1], byDstMac[2], byDstMac[3],byDstMac[4],byDstMac[5 ]);
AfxMessageBox(strMac);
}