ARP相關知識點

在騰訊實習生面試時,一個有關ARP的知識點被面試官問到了,但是當時對ARP知識點一點也不懂。今天根據《TCP/IP詳解》上對ARP的學習,在這裏做下筆記。

當時問的題目是:ARP從源主機到目的主機在內核中被拷貝了幾次?

ARP知識點:

1、ARP在哪一個層工作?

ARP在數據鏈路層工作。


2、ARP的作用

ARP是通過請求/應答模式根據目的主機的IP地址獲取目的主機的MAC地址。

HTTP也是基於請求/應答模式工作的。


3、ARP的工作方式

源主機想要向目的主機發送數據,需要通過ARP協議來獲取目的主機的物理地址(MAC地址)。ARP請求分組以廣播形式發送,以單播形式應答。


4、ARP緩衝機制

ARP是計算機中的一緩衝區,裏邊存放着最近訪問的目的主機的IP--->MAC的映射(目的主機IP------>目的主機MAC)。如果某條映射超過一定的時間不被使用(20Mins),就會被刪除掉。


5、ARP分組格式

ARP分組中最爲重要的是:發送端的IP地址、發送端的MAC地址、目的端的IP地址、目的端的MAC地址。

當一個分組的MAC地址爲 "ff-ff-ff-ff-ff-ff" 時,說明這個分組以廣播形式在該局域網上發送,即發送給該網段的每個主機。如果某個主機是分組中目的IP地址,那麼將對應主機的MAC地址填充進去,並返回一個ARP應答分組。

ARP請求分組中的目的MAC地址就是"ff-ff-ff-ff-ff-ff",目的主機收到後會將自己的MAC地址填充進去。


6、ARP如何實現IP到MAC地址的映射?

主機A想要向主機B發送數據前要知道主機B的MAC地址。首先A在自己的ARP緩衝表查找,看有沒有主機B的IP--->MAC的映射,如果有則直接取出使用。

如果沒有,要通過ARP請求/應答報文的形式獲取目的主機的MAC地址。在獲取目的主機B的MAC地址時,我們要分兩種情況分析:case1、源主機A與目的主機B在同一個網段(子網掩碼相同)

                    源主機以廣播形式發送ARP請求報文給該網段的每一個主機,其中請求報文的目標MAC爲'ff:ff:ff:ff:ff:ff'表明爲廣播地址。每個主機收到這個ARP請求報文後,首先將源IP---->源MAC添加到自己的ARP緩衝中,然後將請求報文中的目的IP與自己匹配,如果一樣則將自己的MAC地址填充到ARP分組中,以單播形式向源主機返回一個ARP應答報文。如果與自己的IP不一樣,就丟棄該ARP分組。(如果你是這個IP的擁有者,請你回答你的MAC地址)

源主機收到ARP應答後,將目的IP----->目的MAC的映射添加到自己的ARP緩衝中。

                     case2、源主機A和目的主機B不在同一個網段(中間隔離若干臺路由器)

這時是通過ARP分組廣播形式獲取該網段的某個路由器的MAC地址,將分組發送給這個路由器。但是路由器收到數據後發現數據的目的主機不是我,那麼路由器還需要繼續往下轉發,同樣以廣播形式發送ARP獲取下一個路由器的MAC地址,將數據發送給下一個路由器,......,直到將數據發送到目的主機。


7、總結

ARP請求分組都是以廣播形式發送給本網絡的所有主機,然後會以單播形式迴應。

如果數據發送方是主機,接收方是本網絡上得另一個主機:直接使用ARP獲取目的主機的MAC地址;

如果數據發送方是主機,接收方是另一個網絡上的主機:使用ARP獲取本網絡上的路由器的MAC地址,將數據發送到這個路由器上,剩下的工作交給這個路由器;

如果數據發送方是路由器,接收方是路由器所在網絡上的主機:使用ARP獲取目的主機的MAC地址;

如果數據發送方是路由器,接收方是另一個網絡上的主機:使用ARP獲取下一個路由器的MAC地址,將數據發送給下一個路由器,剩下的工作交給下一個路由器;


簡單一句話說,ARP在每一個網段中都是以廣播形式發送,以單薄形式返回。


8、例子


如上圖,主機A、B通過路由器連接,屬於兩個不同的網段子網掩碼24(255.255.255.0),這兩個主機之間ARP發送過程爲:

1>主機A有數據發往主機B,數據封裝IP之後發現沒有主機B的mac地址;然後查詢ARP,ARP迴應:「我在192.168.3.0/24網段,目標地址在192.168.4.0/24,不屬於同一網段,需要使用默認網關」;ARP發現默認網關是192.168.3.2,但是沒有網關mac地址,需要先進行查詢

2>主機將數據包先放到緩存中,然後發送ARP查詢報文:封裝自己的mac地址爲源mac,目標mac地址寫全F的廣播地址,請求網關192.168.3.2的mac地址。然後以廣播方式發送出去

3>路由器收到廣播數據包,首先將原192.168.3.1添加到自己的mac地址表中,對應mac地址爲0800.0222.2222。路由發現是請求自己的mac地址,然後路由回覆一個ARP應答:封裝自己的IP地址爲源IP自己的mac地址爲源mac,主機A的IP爲目的IP主機A的mac爲目的mac,發送一個單播應答「我是192.168.3.2.我的mac地址爲 0800.0333.2222」

4>主機收到應答後,將網關mac地址對應192.168.4.2(跨網關通信,其他網段IP地址的mac地址均爲網關mac),然後將緩存中的數據包,封裝網關mac地址進行發送

5>路由收到數據包,檢查目的IP地址,發現不是給自己的,決定要進行路由,然後查詢路由表,需要發往192.168.4.0網段中的192.168.4.2地址。路由準備從相應接口上發出去,然後查詢mac地址表,發現沒有主機B的映射。路由器發送arp請求查詢主機B的mac地址(原理同2、3步,主機B收到請求後首先會添加網關的mac地址,然後單播回覆arp請求)。

6>路由器收到主機B的mac地址後,將其添加到路由mac地址表中,然後將緩存中的數據2層幀頭去掉,封裝自己的mac地址爲源mac,主機B的mac地址爲目的mac(源和目的IP地址不變),加上二層幀頭及校驗,發送給主機B。

7>主機B收到數據之後,進行處理,發送過程結束。

8>如果主機B收到數據後進行回覆,主機B會進行地址判斷,不在同一網段,然後決定將數據發送給網關,主機B查詢mac地址表獲得網關mac地址,將數據封裝後發送(arp地址解析的過程不再需要了,mac地址表條目有一定的有效時間),網關收到數據後直接查詢mac表,將二層幀mac地址更改爲A的mac發送出去。如此,主機A收到主機B的回覆。

9、Question

Q1、有了IP地址,爲什麼還需要MAC地址?

注意沒經過一個路由器,分組的目的MAC地址會發生改變,但是目的IP地址不會發生改變。報文的目的MAC地址爲嚇一跳的路由器的MAC地址,IP地址仍然爲目的主機的IP地址(目的主機在另外一個網絡上)。


Q2、爲什麼不能廣播到目的主機所在網絡?

因爲路由器是一個廣播域,路由器會隔離廣播的報文。廣播報文無法穿過路由器,每個網段形成一個廣播域。