arp和rarp 同網段和不同網段之間的通信過程
IPv6中已經沒有arp rarp協議,所以這里都是IPv4。
鏈路層使用以太網地址來確定目的地址,應用則常使用ip地址通信
arp協議是指從ip地址獲取對應的mac地址的協議
同網段和不同網段之間的通信過程
網上別人寫的很經典的ping過程,不清楚原創作者是誰:
在當今的以太網絡通信中,在IP數據包中有兩個必不可少的地址,那就是IP地址和網卡地址(即MAC地址),在數據包中,無論是IP地址還是MAC地址,都有源地址和目標地址,因為通信是雙方的,所以就必須同時擁有雙方的地址!在同一IP網絡中通信,將會發生以下事件:
主機A與主機B通信,這時主機A肯定首先要封裝這些需要發給主機B的數據包,那么對於主機A來說,自己的IP地址和MAC自己肯定能夠輕易得到,對於主機B的IP地址這時主機A也應該知道,要不然它就不清楚自己將要和誰通信,當有了自己的IP地址,MAC地址以及主機B的IP地址后,主機A在數據包中可以正確地寫上源IP地址,目標IP地址,接下來的工作就是寫入自己的MAC地址(即源MAC),最后還必須正確寫入目標主機B的MAC地址,可這時主機A才發現自己根本沒有目標主機B的MAC地址,那該怎么辦呢?這時主機A就通過比較上面已經封裝好的源IP和目標IP,通過子網掩碼計算一下,發現源IP和目標IP恰好在同一個IP網絡內,那么它想要得到目標主機B的MAC地址就有辦法了,首先主機A就向本網段發過一個ARP請求,這個ARP請求包中包括主機A的源IP地址,源MAC地址,目標主機B的IP地址,而目標MAC地址為廣播MAC地址(全部為F),因為我們要找的就是目標MAC,所以這里用廣播MAC地址,又因為是以太網,所以整個局域網的所有主機都能收到這個請求MAC地址的數據包,當然主機B也能收到,因此在主機B收到此ARP請求后,立即構建一個包括自己的MAC地址的ARP回應包,回應給主機A,當主機A收到這個ARP回應后,終於完成了找尋目標MAC的重大任務,從而把目標主機B的MAC地址正確封裝進上面還未封裝結束的正准備發給主機B的數據包,在這時,源IP和源MAC以及目標IP和目標MAC都已正確存在於數據包中,那么這里主機A向網絡內發出這些數據包,因為目標地址在本網段,所以本網段所有主機都能收到這個數據包(這是以太網的特性),最后只有真正的目標主機B能夠打開這些數據包,在此,同網段兩台主機之間的通信就此圓滿結束!在這里應該注意另外一個問題,因為主機A要尋找的目標主機B在同一網絡,所以主機A能夠通過ARP得到目標主機B的MAC地址,從而完成通信,當主機A在封裝數據包時檢測到目標主機並不在本網段,在這時,數據包不能把目標主機的MAC地址順利封裝進去,那么就用到另一種方法,那就是網關,主機A在准備發向主機B的數據中,封裝好自己的IP地址和MAC地址,同時也封裝好目標主機B的IP地址,數據包封裝到這里,主機A就利用上面得到同網段目標主機B的方法去請求得到網關的MAC地址,同樣也是用ARP去廣播,因為網關必須和本機在同一網段,理所當然,網關能夠收到這個ARP請求並能正確回應給主機A,這時主機A在數據包中封裝好自己的IP地址和MAC地址,同時也封裝好目標主機B的IP地址和網關的MAC地址,把數據包從網卡發出去,因為目標MAC是網關的,所以網關收到這個數據包后,發現目標MAC是自己,而目標IP卻是別人,所以它不可以再往上打開這個數據包,它要做的工作就是把這些數據包發給下一跳路由器(如果網關自身就是一台路由器的話),如果網關是一台普通PC,那么它就發給路由器,讓路由器把這些數據包正確傳輸到遠程目標網絡,到達遠程網絡后,它們的網關再將數據包發給數據包中的目標IP,即源主機A苦苦尋找的目標主機B,從而真正結束不同網絡之間的通信,回應的數據包也是用同樣的方法到達目的地,在這里,還需要注意的是,當網關把數據包發給下一跳路由器時,這個數據包必須由網關把目標MAC改成下一跳路由器的MAC地址(通過ARP得到),否則下一跳路由器收到目標MAC不是自己的數據包,會丟棄不予理睬,下一跳路由器再發給下一跳路由器同樣要把目標MAC地址改為下一跳路由器的MAC地址再發出去!
最后還可以總結出:在網段通信時,數據包中的地址就是源IP,目標IP,源MAC,目標MAC,根本用不到網關,而當檢測到需要把數據包發到遠程網絡時,這時,目標MAC就必須改變了,在還沒有出內網時,目標MAC必須寫成網關的MAC地址發出去,當網關收到時,再把目標MAC地址改成下一跳的MAC地址發出去,而源IP和源MAC以及目標IP不曾改變,就算到達了公網上,目標MAC仍然在不斷改變着,直到最后,這個數據包到達目標IP的網絡,最終通信結束!
arp高速緩存
arp -a可以看到當前主機緩存的ip地址和mac地址對應的列表
可以看到緩存的都是同網段的機器的mac地址,因為需要arp請求的地址,都是下一跳不經過路由器就能到的地址,這地址才有意義。
主機和其他主機通信時,只有當目的地址和當前地址在同一個網絡中時,才會發送arp請求這個目的地址的mac地址,如果交換機收到這個arp請求,發現這個ip對應的mac地址已經自己已經緩存了,就將這個地址回應給當前主機,發送給所有端口。如果是不同網段間的通信,源地址和目的地址不在同一個網絡中就根據路由表,那么系統會選擇下一跳的主機,目的mac地址填下一跳主機的地址。
arp攻擊
可以編造包,去一直請求arp請求當前網絡中不存在的主機,這樣arp包會被發送到整個網絡的所有主機上,也就是arp廣播攻擊了。
也可以編造包,聲稱ip x.x.x.x的mac地址是自己,arp欺騙,劫持流量,影響正常通信。
其他:
安全是個大問題,以后遇到了再學吧。
ARP攻擊防范方法總結
arp代理
當一個路由器收到arp請求時,它可以代替它所連接到的主機回應這個請求,例如主機10.10.10.10有一條10.10.0.0/16的路由,他認為10.10.20.10和它在同一個網絡內,所會發送arp請求,請求獲得10.10.20.10的地址,通常是這樣子,可是有時候這個地址並不在這個網絡內,路由器收到地址后發現,它的en0連接到10.10.10.0/24,en1連接到10.10.20.0/24,如果沒有配置arp代理,那正常的,路由器不會有任何響應,主機10.10.10.10會發現自己不能連接到目的地址,如果配置了arp代理,路由器就會把en0的地址回應給10.10.10.10,告訴他這就是10.10.20.10的地址。
不必要arp
gratuitous arp,既發送arp請求查詢本機ip的mac地址,可以用於檢測ip沖突,或者是當前接口mac地址變更后,向局域網內更新自己的mac地址變換
tcp/ip卷一中文版把這個翻譯成免費arp,這是不准確的。
rarp
逆地址解析協議,可以用於網卡啟動時,向rarp server請求自己的ip。和dhcp類似的功能,現在基本都使用dhcp。