TCP/IP之二:ARP與RARP

ARP協議實現IP地址到物理地址的映射;RARP實現物理地址到IP地址的映射。

ARP/RARP的幀格式如下(圖中的數字表示各個域所佔的字節數):

以太網目的地址

6

以太網源地址

6

協議類型

2

硬件類型

2

協議類型

2

硬件地址長度

1

協議地址長度

1

op

2

發送端以太網地址

6

發送端IP地址

4

目的以太網地址

6

目的IP地址

4

說明:前面三個字段是以太網幀結構的必備部分,在網絡接口層(http://blog.csdn.net/ericming200409/archive/2011/04/13/6321872.aspx)已經詳細說明,這裏不再贅述。 硬件類型說明硬件地址的類型,協議類型說明協議地址的類型,常見的情況是硬件類型指明硬件地址是以太網地址,協議類型指明協議地址是IP地址;OP字段說明數據包類型,比如arp請求,arp應答,rarp請求,rarp應答;其餘各字段相信就不需要再過多解釋了。

(1) ARP和RARP幀不同的是第三字段。
(2) 除去前面的三個字段,arp幀剩下的各部分加起來只有28字節,而以太網幀要求數據域最小是46字節,所以所有的arp幀都是需要填充的,rarp也是如此。
IP數據包有時也會小於46字節,同樣需要填充,正是因爲網絡接口層可能會對IP數據包進行填充,IP數據包中才需要總長度字段,這點到IP層時我仍會特別指出。

ARP高速緩衝區:
爲了實現IP到物理地址的快速轉換,ARP會維護一個緩衝區,緩衝區裏面存放一些已知IP地址和物理地址的對應關係,這樣主機就不用每次發送數據包時都先發送ARP請求。通過arp命令我們可以查看緩衝區內容,也可以往緩衝區中增加條目,刪除條目等。另外一種查看ARP高速緩衝區的方式是通過/proc/net/arp文件,該文件是ARP高速緩衝區的鏡像。

ARP攻擊:
ARP欺騙攻擊已經成了破壞網吧經營的罪魁禍首,是網吧老闆和網管員的心腹大患。從影響網絡連接通暢的方式來看,ARP欺騙分爲二種,一種是對路由器ARP表的欺騙;另一種是對內網PC的網關欺騙。第一種ARP欺騙的原理是——截獲網關數據。它通知路由器一系列錯誤的內網MAC地址,並按照一定的頻率不斷進行,使真實的地址信息無法通過更新保存在路由器中,結果路由器的所有數據只能發送給錯誤的MAC地址,造成正常PC無法收到信息。第二種ARP欺騙的原理是——僞造網關。它的原理是建立假網關,讓被它欺騙的PC向假網關發數據,而不是通過正常的路由器途徑上網。在PC看來,就是上不了網了,“網絡掉線了”。一般來說,ARP欺騙攻擊的後果非常嚴重,大多數情況下會造成大面積掉線。有些網管員對此不甚瞭解,出現故障時,認爲PC沒有問題,交換機沒掉線的“本事”,電信也不承認寬帶故障。而且如果第一種ARP欺騙發生時,只要重啓路由器,網絡就能全面恢復,那問題一定是在路由器了。爲此,寬帶路由器背了不少“黑鍋”。作爲網吧路由器的廠家,對防範ARP欺騙不得已做了不少份內、份外的工作。一、在寬帶路由器中把所有PC的IP-MAC輸入到一個靜態表中,這叫路由器IP-MAC綁定。二、力勸網管員在內網所有PC上設置網關的靜態ARP信息,這叫PC機IP-MAC綁定。一般廠家要求兩個工作都要做,稱其爲IP-MAC雙向綁定。

免費ARP:
免費ARP指的是主機詢問自己的物理地址,它有兩個作用:一是可以發現網絡上是否有主機和自己有一樣的IP地址;二是可以通知網絡中別的主機對自己的物理地址進行更新,這種情況發生在當主機換掉網卡重新啓動的時候,物理地址發生了改變,可以通過免費ARP通知別的主機自己的物理地址改變了,免費ARP能夠發揮這個作用是基於這樣一個事實---任何主機接收到ARP請求,如果發送端在自己的ARP高速緩存中,都需要根據這個ARP請求對高速緩存中的對應項進行更新。

tcpdump命令:
tcpdump命令是功能及其強大的網絡抓包命令,通過它可以查看網絡中的數據傳輸情況,其具體使用方法可參考manpage或者blog:http://blog.csdn.net/ericming200409/archive/2011/04/14/6324446.aspx

有趣的實例:
我的主機IP是:10.0.2.15(虛擬機), 默認網關是:10.0.2.2, 通過netstat -r查看路由表輸出如下:

   1: 內核 IP 路由表
   2: Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
   3: 10.0.2.0        *               255.255.255.0   U         0 0          0 eth0
   4: link-local      *               255.255.0.0     U         0 0          0 eth0
   5: default         10.0.2.2        0.0.0.0         UG        0 0          0 eth0


在我的子網上並不存在10.0.2.5,我試圖ping 10.0.2.5 –c 1,tcpdump –b arp輸出如下:

   1: 23:36:00.085828 ARP, Request who-has 10.0.2.5 tell spring, length 28
   2: 23:36:00.089777 ARP, Request who-has 10.0.2.2 tell spring, length 28
   3: 23:36:00.090047 ARP, Reply 10.0.2.2 is-at 52:54:00:12:35:02 (oui Unknown), length 46
   4: 23:36:01.085880 ARP, Request who-has 10.0.2.5 tell spring, length 28
   5: 23:36:02.085866 ARP, Request who-has 10.0.2.5 tell spring, length 28
   6: 23:39:41.414458 ARP, Request who-has 10.0.2.2 tell spring, length 28
   7: 23:39:41.414858 ARP, Reply 10.0.2.2 is-at 52:54:00:12:35:02 (oui Unknown), length 46


可以看到:
開始因爲10.0.2.5與本機IP10.0.2.15在同一個子網上,所以直接arp詢問10.0.2.5的物理地址;但是因爲該主機不存在,沒有迴應,所以接着就企圖發給默認路由器,從而有了2-3行的結果;但是發給默認路由的ICMP還是沒有得到正確迴應,所以繼續詢問10.0.2.5的物理地址,輸出了4-5行;
6-7行重複2-3行的動作。
注意:不同的實現運行本實例會有不同的結果。  

發佈了4 篇原創文章 · 獲贊 5 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章