TCP/IP: 在廣域網(外網)上傳輸數據時會用到ARP協議嗎?

我的理解:在區域網(內網),同一網段的兩台機器,比如A機器192.168.0.11給B機器192.168.0.22發數據的話是需要知道B的網卡地址的,這時候要用到ARP協議了。

首先我以上的理解應該沒錯吧?

問題1:那如果在外網上,兩個公網IP(A和B)互發數據,這個時候ARP還需要嗎?ARP做廣播的話明顯不可能,範圍太廣了,而且廣播應該只是在區域網做的。

問題2:如果是一個A機器(外網ip)要給一個B機器(內網ip中的某一台機器)發送數據的話呢,需要ARP協議嗎?換句話說,需要知道B的MAC地址嗎?

問題3:一個路由管轄著一個網段(內網),對外的話這個路由其本身是有一個公網ip的,外網要向內網中的機器發數據,它只知道路由的公網ip,並不知道內網中電腦的ip,那如果上述兩個問題要用到ARP協議的話,那麼要得知一個內網ip的機器的MAC地址,這個時候是不是就要用到路由器的NAT地址轉換功能了?

問題4:A向B發送乙太網數據幀(ARP請求)的時候,乙太網數據幀(含ip數據報)(ps:這兩個乙太網數據幀是不同的)是處於待髮狀態(還在A中),還是說已經到達B的網段的路由器了?B機器的ARP應答是發給A機器還是發給路由器?

tcp協議新手,之前有查過許多資料,但還是很難理清思路,所以問題可能有點雜,請多多包涵


題主的這幾個問題符合一個網路協議新手的特徵,想法很豐富但概念又比較模糊,那好我現在科普並啟蒙這些基礎網路協議。

問題1:廣域網WAN里A與B通信是否需要ARP?

首先ARP是什麼?Address Resolution Protocol的縮寫,地址解析協議,用於解析IP地址與MAC地址的一一映射。那什麼樣的物理介面有MAC地址呢?Ethernet 介面,如果A與B的相連介面是Ethernet 介面,他們之間的通信需要知道彼此的MAC地址。

1.1 物理直連

1.2 A與B通過二層switch 相連

以上兩種情況都會廣播方式發送ARP request 來解析彼此的MAC地址

但是如果A與B的物理介面是serial interface,並且二層封裝是PPP/HDLC,還需要ARP嗎?很顯然不需要,因為PPP/HDLC封裝頭部信息沒有MAC地址信息!

所以決定是否需要ARP,是由二層封裝方式決定的,而不是由物理介質長短來決定的!

問題2:是否A需要通過ARP知道B的MAC地址?

A --------Gateway --------B

A與B不在一個網段,A查詢自己的路由表,知道如果想和B通信則必須通過gateway 來中轉,所以會在與gateway 直連的介面(假定 Ethernet介面)上請求gateway 的MAC地址,為何? 因為先要把發給B的IP流量先發給gateway,即二層乙太網頭部Destination MAC 應為Gateway 的才行!否則Gateway的網口會因為Ethernet Frame 和自己的MAC地址 mismatch 而拒收!當合法以太幀到達gateway,Gateway 網口順利接收,然後再提交給IP層,IP層查詢路由表,找到與B直連得介面,發ARP請求B的MAC地址,然後完成最終的通信。

問題3: NAT情況外網主機如何知道內網主機的MAC?

回答這個問題之前必須先來科普什麼是NAT?

NAT,Network Address Translation,網路地址轉換。通俗地說,就是將區域網里普遍使用的私有IP地址,在區域網網路出口路由器上轉換為公網IP,因為只有公網IP才可以在Internet上自由溜達,等溜達完了,回程途徑出口路由器,再將公網IP轉換為私有IP,再繼續在區域網行走,一直走到最原始的主機。

舉例說明:

A(10.1.1.2)----|
B(10.1.1.3) ---|
C(10.1.1.4)---| -GW(1.1.1.1)-Internet -Server 2.2.2.2

A 使用TCP Port 1025 訪問 server TCP 80
B 使用TCP Port 1025 訪問 server TCP 80
C 使用TCP Port 2000 訪問 server TCP 443

Gateway 上的NAT table 如下:
10.1.1.2 + TCP 1025 &<----&> 1.1.1.1 + TCP 1025
10.1.1.3 + TCP 1025 &<----&> 1.1.1.1 + TCP 1026
10.1.1.4 + TCP 2000 &<----&> 1.1.1.1 + TCP 1027

通過以上IP地址+ TCP埠號的映射,Gateway 可以唯一區分任何一個host。

但是用NAT有幾點不足:

1)區域網主機需要主動發起連接

如果host ABC 不主動發起連接,則 NAT table 是空的,外部無法訪問這些只有私網地址的host ABC

2) NAT Table 有超時機制

如果超時,NAT Table 沒有host A 的映射,即使TCP連接是 active 的,server 也無法發數據給 host A。需要host A 周期性發送 keepalive 消息,避免NAT Table超時。

通過以上科普,我們知道動態NAT,即用一個公網IP+ 埠號來動態轉換私有IP+ 埠號,必須由私有IP主機主動發起連接,否則通信無法完成。

靜態NAT,即事先用手動配置的方式一一映射,公網IP+ 固定埠號 :私有IP+ 固定埠號這種方式雙向都可以發起連接。

假定網關上通過dynamic 或 static NAT 方式生成了NAT table entry,很顯然A與B的通信和問題2 類似,可以參考問題2。

問題4: A與B之間ARP沒有完成之前,IP包的狀態?

假定A與B直連並且用ARP來解析彼此的地址,A的上層應用假定為ping,即假定為ICMP Echo request to B, 上層調用到達IP層,慣例查詢路由表,找出介面,發現出介面對應的Next-Hop IP ,但MAC地址為空,丟棄此ICMP echo request,並觸發ARP Request To B,B 發ARP Reply to A,然後A將MAC地址紀錄下來,並綁定為Next-Hop 的MAC地址。當後續ICMP echo request 到達IP層時,因為所有的二層封裝信息都具備,所以可以完成二層封裝。並從出介面發送出去,並完成後續的通信工作。

細心的童鞋可以經常發現在cisco 平台上ping 5 個包,經常第一個包被丟棄,就屬於以上場景,源於網關/目的主機MAC地址未知。


假設我現在要給 車小胖 發hello。這裡有兩種情況。情況一:我與小胖位於同一子網。我向小胖的ip地址發起arp請求,小胖收到回應,告訴我他的mac地址,然後我向該mac地址發送hello即可。情況二:我與小胖不在同一子網。由於不在同一子網,我需要向我的網關發送arp請求,網關告訴我mac地址,然後我向告訴網關:「向小胖的ip發hello」。剩下的事情,我就不用管了,如果網路可達,那麼小胖就會收到我發的hello。


IP層的數據報文傳輸是利用數據鏈路層(一般是乙太網)逐跳轉發來實現的。ARP協議在協議棧上與IP處於同一層,它並不會在IP層進行轉發,因此它的作用範圍只有整個本地乙太網鏈路。實際上,所有使用MAC地址也都是本地設備的MAC地址。

比如說假設從A到B,中間要經過三個路由器:
A, R1, R2, R3, B
而且所有設備之間都是乙太網。
每個設備都有一張路由表,用來區分哪些IP屬於本地鏈路(即可以通過二層協議直達),哪些IP屬於非本地鏈路,以及這些IP地址對應的下一跳路由在哪裡。對於A來說,B不在本地鏈路上,且B的地址對應路由是R1的地址,於是它需要發送一個數據包給R1,這個數據包:
IP源地址:A,IP目的地址:B
乙太網MAC源地址:A,乙太網MAC目的地址:R1

由於需要R1的乙太網MAC目的地址,而A的路由表中,記錄的只有R1的IP地址,因此需要使用ARP協議來解析R1的IP地址對應的MAC地址。如果這個ARP項已經緩存起來了,就會直接使用緩存的結果,否則A會先發起ARP,等到成功解析出MAC地址之後再發送數據包。
注意A並不需要B的MAC地址,所以A不會對B的MAC地址進行解析,也不可能知道B的MAC地址。

數據包到達R1之後,R1會繼續這個過程,發現B仍然不在本地鏈路上,於是使用ARP協議解析R2的MAC地址(大部分情況下這個地址早就緩存起來了所以不會造成額外的延時),發出數據包則是:
IP源地址:A,IP目的地址:B
乙太網MAC源地址:R1,乙太網MAC目的地址:R2

注意IP的源和目的永遠是最初的源和目的,MAC的源和目的則永遠都是這一跳的發送方和接收方。

R2則繼續解析R3。到R3之後,R3發現B在自己的本地鏈路上,於是使用ARP協議解析B的MAC地址,然後將數據包發送給B:
IP源地址:A,IP目的地址:B
乙太網MAC源地址:R3,乙太網MAC目的地址:B

如果有NAT存在的話,這個過程是類似的,但在NAT設備上有一些不同。比如說A經過R1 NAT成了公網地址,則在R1上發送的數據包為:
IP源地址:R1公網地址,IP目的地址:B
乙太網MAC源地址:R1,乙太網MAC目的地址:R2
也就是將A的地址轉換為了R1上的公網地址。於是B收到的數據包,源地址是R1的公網地址。B回復也會向R1的公網地址進行回復。

當這個回復的數據包到達R2時,R2會發現,R1公網地址是自己本地鏈路的地址,於是會使用ARP協議解析R1的公網地址,R1會使用ARP協議用自己的MAC地址回應這個解析請求,這個過程叫做Proxy ARP。於是R2發送:
IP源地址:B,IP目的地址:R1公網地址
乙太網源地址:R2,乙太網目的地址:R1

R1收到這個包之後發現是發送給自己的某個公網地址,它會在轉發邏輯之前利用NAT表將目的地址重新翻譯回內網A的地址。之後的過程是一樣的,查路由表發現A在本地鏈路上,於是使用ARP協議解析A的MAC地址,然後發送:
IP源地址:B,IP目的地址:A
乙太網源地址:R1,乙太網目的地址:A


題主的問題其實是:發送數據包的時候需不需要知道對方的MAC地址。
其實把二層和三層分開看就好了。

首先有幾個基本知識:

1. 二層能互聯的範圍就只有交換機互相連接的主機,一般邊界是到路由器為止。
2. 任何時候網卡發送數據,都必須填寫二層的目標MAC地址。
3. 三層數據(IP層)是包含在二層數據之內的。
4. 更上層的部分,比如我們的應用程序,只知道對方的IP,而不是MAC。

ARP協議是在二層的可廣播的範圍內,把IP地址轉換成MAC地址的。
首先是最基本的情況:
A和B在同一廣播域上。A要給B發數據時,就會通過ARP協議尋找對方的MAC地址,並在二層數據幀上填入目標MAC地址,將報文送入廣播域。這樣數據實際上是從A直接發送給B。
二層目標地址:B的MAC;三層目標地址:B的IP。


那麼A和B不在同一廣播域時候的情況,題主的問題1和問題2都是以下這種情況:

A發現B不在同一個子網上,或者A找不到B的MAC地址,此時A會將數據送入網關(默認路由),由網關轉發。這個時候這條消息實際上是發給網關的,網關收到了之後才會根據它自己的路由表繼續做轉發。
假如A和B之間有2個路由器R1、R2
消息實際是這樣的:
A-&>R1 二層目標地址:R1的MAC;三層目標地址:B的IP
R1-&>R2 二層目標地址:R2的MAC;三層目標地址:B的IP
R2-&>B 二層目標地址:B的MAC;三層目標地址:B的IP
每一次轉發,路由器都會把原來的二層數據包剝下來,換上自己的。

題主的問題3是有關NAT的:
實際上,NAT僅僅是轉發時候剝下來的層數更多了(剝到了第四層),對於外網的A來說,它只要給他自己的下一個路由器發數據報,目標MAC地址也填寫那個路由器的目標MAC。但是由於B沒有公網IP,所以目標IP是NAT的公網IP,這個傳輸過程和上面的情況是一樣的。
數據發到NAT上之後,NAT會檢查自己的對照表,從埠號和內網主機的對應關係中解析出B的內網IP,然後重新封裝數據包,換成B的IP和B的埠的目標,然後重新往下送迴路由器,路由器再根據現在新的目標IP(B的IP)找到B的MAC地址給B發送數據包。

假設A(公網IP)--R1--NAT(公網IP)--B(內網IP),消息的實際傳遞過程:
A-&>R1 二層目標地址:R1的MAC;三層目標地址:NAT的IP
R1-&>NAT 二層目標地址:NAT的MAC;三層目標地址:NAT的IP
NAT-&>B 二層目標地址:B的MAC;三層目標地址:B的IP

至於問題4:題主也自己說了,ARP請求只在廣播域內有效,根本不會出廣播域,也更不會在路由器中轉發了。


睡不著,寫點東西。水平不高,若有不妥請不吝提出。
網路這個東西是分層的,類比一下可以理解成盒子套盒子——發送的時候,高層協議將自己的盒子外面寫上東西,扔給低層協議,低層協議根據盒子上的字套上自己的盒子,寫上字再交給更低層的協議… 接收時候正好反過來,低層根據盒子上面的字,拆掉外面的盒子,扔給更高層協議,如此循環,直到最後。顯然,發送接收要對稱,套幾個就拆幾個嘛。
不管是物理鏈路還是邏輯鏈路,粗略可以將分成兩種類型——一種是水管子類的,點對點型。只有一進一出,這邊塞多少那邊出多少,塞進去的都是要給對面的,發送的消息元中就不必表示出給誰了——反正都是給你的;另一種可以認為是對多點的,發送的消息元中就要表示出消息元的接收者——在菜市場對天大喊一聲」老闆來二斤豬肉」絕對沒人理你,那麼多賣豬肉的,天知道你喊誰。
交換式乙太網可以看成是第二種類型的改進型,交換機是個有智商的傢伙,你給他的東西他會看看,你說給誰才給誰,他不認識或者你指定給所有人的時候,他才會給所有人。你給他東西的時候他就記住你住哪兒了,下次遇到給你的東西就直接送來了。
在乙太網上發送消息元時,要知道接收方的MAC地址。發送消息元時,發送方只知道接收方的網路層地址,要知道MAC地址才行啊,兩種方法,要麼問問大家有沒有人知道的(arp協議),要麼可以根據網路層地址算出MAC地址(IPv6)做法。
總結下,下層網路是點對多點型,上層網路無法提供下層網路的地址的情況下,就會有一種類似於arp協議作用的東西,用於找出上層網路地址對應的下層網路地址,才會有對應的包發出來,就算不是IPv4,不是乙太網,只要符合上述條件,才會有類似用途的包發出。


如果二層依舊基於mac address而且沒有靜態綁定ip address,則需要。


1 可能需要也可能不需要。取決於ab之間的第二層鏈路種類。

2 如果b與其網關是使用乙太網連接就需要。但是a不需要。

3 外網不需要知道。b的網關路由設備需要。

4 請仔細研讀rfc 826


不需要


MAC 在本地網路外無意義,所以在外網不需要 ARP。


簡單來說 網內在沒劃分VLAN情況下,同一子網內用二層協議傳輸須用到ARP(七層協議知道吧),公網則用ip地址傳輸就是三層協議。
第一個問題公網之間A,B傳輸.首先公網之間A,B的地址不能是私有地址。如果A是一個網內的主機,B是一個網內的主機那麼就可以用私有地址,A,B公網之間傳輸首先A主機網內有連接公網的路由器,B也一樣有連接公網的路由器。互聯網是無數個網組成的在公網不可能用ARP,(路由器有隔絕廣播的協議)所以A,B使用三層協議傳輸。
而第二個問題和第一個問題是一樣的 A網發信息給另一個B網通過公網 B在通過內部網路傳輸。
第三問題路由器內有張表叫路由表具體我就不說了,自己查查如何實現路由。
第四......你要先了解七層協議...
七層協議很重要。好好探索吧。
表達能力不是很好 希望有所幫助.


ARP的包是一個廣播包,那這樣就不能跨路由器,所以需要一個叫ARP代理或者叫ARP欺騙的東西,然後外網IP是不能主動訪問內網IP的,除非內網伺服器映射埠到網關路由器上。以上。


推薦閱讀:

tcp 的可靠性到底指的是什麼?
ospf處在哪個tcp/ip的層次,是不是傳輸層,網上說tcp/ip不夠嚴謹,那麼對於osi呢?
IP報文的目的IP地址是私有IP地址,網路層如何處理的?
智能DNS解析?

TAG:計算機網路 | TCPIP | 網路工程 | 網路協議 |