處於不同網段的子網內的計算機是怎麼找到對方子網IP的?

各位大神,我是個才開始學習計算機網路的菜鳥,現在有兩個問題困惑著我請各位大神勞神看看。


問題一:計算機A與計算機B處於不同網段的子網中,計算機A要向計算機B發送數據(A之前從未向B發過),假設計算機B是一個網站伺服器,它的公網IP是202.108.22.5,它的子網IP是192.168.1.100 ,而這個子網內還有個計算機C子網IP是192.168.1.101。 A現在想要訪問網站通過DNS得到的也只是202.108.22.5這個公網IP ,那麼A發送的數據包中目的IP就是202.108.22.5 ,而實際上這個數據包是要發送給子網192.168.1.100的B,B的路由器只看到A發過來的數據包目的IP是202.108.22.5 那麼這個路由器怎麼將數據包交給B?路由器即便是要發ARP廣播來獲得B的MAC地址那它也得知道這個數據包是給192.168.1.100的才行啊。

另外如果B就是個普通用戶 在同一區域網內還有用戶C 他們的公網IP是202.108.22.5 B或C向外發送數據的源IP是否都是202.108.22.5?如果是 我們怎麼知道這個數據到底是B還是C發送的?


圖1:

問題二:在區域網內計算機0要向計算機1發送數據,0要先發送ARP廣播得到1的MAC地址後才能直接和1通訊,這是否因為交換機等二層設備不具備路由功能才需要MAC地址?如果是,那麼互聯網上的路由器在向某目的主機202.108.22.5轉發數據包的時候,它既然有路由表知道通往202.108.22.5的下一跳該交給哪個路由器那麼它為什麼不直接通過下一跳路由器的IP地址交給這個路由器還要查ARP表或發ARP廣播來得到下一跳路由器的MAC地址呢?

誠請各位屈尊解答一下這種基礎的菜鳥問題為我解惑我已經好幾天晚上沒睡好了。另外如果我的問題描述過程中哪個地方錯了請各位大神批評指正。非常感謝!


問題一:

假設計算機B是一個網站伺服器,它的公網IP是202.108.22.5,它的子網IP是192.168.1.100

首先,B和C在一個區域網里,所以肯定需要一個路由,由這個路由負責對外,IP是202.108.22.5。所以B和C對外是不可以直接被訪問到的。所以A是訪問不到B的。既然B是伺服器,要被外網訪問,那要在路由上做一個操作,叫做埠映射。比如把B的8080埠映射到對外路由的80埠。這樣在A訪問202.108.22.5的80埠的時候,就會被轉到192.168.1.100的8080埠。也就是說,如果是Web伺服器,B的Web伺服器開在8080埠上就可以了。

另外如果B就是個普通用戶 在同一區域網內還有用戶C 他們的公網IP是202.108.22.5 B或C向外發送數據的源IP是否都是202.108.22.5?如果是 我們怎麼知道這個數據到底是B還是C發送的?

這裡就要介紹到一個技術叫,NAT。nat_百度百科
B和C向外發送數據的源IP都是202.108.22.5,但是埠不一樣。發送信息的時候,由路由器通過NAT技術將報文源地址不同的內網IP地址和埠,轉換成相同的公網的IP地址和不同的埠。接收信息的時候,將相同的公網IP202.108.22.5但埠不同的目的地址轉換成內網對應的機器的IP地址和埠。(通過查表,表在發出去的時候已經記錄了)

這也就是為什麼你可以訪問出去,比如訪問http://zhihu.com,然後它再返回應答信息。而不能直接訪問進來。

問題二:

在區域網內計算機0要向計算機1發送數據,0要先發送ARP廣播得到1的MAC地址後才能直接和1通訊,這是否因為交換機等二層設備不具備路由功能才需要MAC地址?

區域網內的兩台計算機,即便是通過路由連接在一起也需要MAC地址來傳輸。因為MAC傳輸是鏈路層的傳輸,是在物理可達的情況下的傳輸。IP是網路層的協議,是在MAC的上一層。也就是說IP層的傳輸最終也要靠底層的MAC層完成。也就是網卡與網卡之間傳數據。通過路由里的交換機功能部分。

IP解決的是往哪走的問題,MAC解決的是怎麼走的問題。比如公網上路由之間,通過IP地址來選定走的路徑,但路由之間傳遞數據靠的就是底層MAC來傳輸。

當你內網中的A與B通信的時候。計算機自身也有路由表的。A查自己的路由表,如果你的目的IP是外網的話,那麼A就會發給網關,也就是路由。發給路由也是通過MAC幀發送的,你的ARP表裡肯定有網關的MAC地址。如果目的IP是同一個網內的話,那麼就走鏈路層,如果ARP表裡沒有對應內網裡的計算機MAC地址,就進行ARP請求。然後通過MAC傳輸。

所以路由里是有交換機的模塊的,路由WAN口留空就可以當交換機用。所以,底層的MAC傳輸,交換模塊就全搞定了。


在回答這個問題之前,先來談談什麼是路由域。
互聯網的世界,路由域看似複雜,其實就兩種路由域,全球路由域(公網),私有路由域(私網)。如果兩者需要通信,在這兩者的邊界設備上要做公有IP、私有IP的地址轉換,即NAT。好,回到題主的問題。

問題1: 見下圖

場景一: 公司DNS SERVER在Internet里, 用戶通過DNS得到web server 公網地址202.108.22.5 ,既然不在一個網段,包當然是先發給用戶的預設網關192.168.2.1,然後到達internet gateway ,這個時候發現包的destination IP : 202.108.22.5和靜態 NAT表匹配,這個時候先做NAT,於是destination IP 被替換成192.168.1.100,然後根據路由表來繼續正常的轉發,到達目的地 web server。

場景二: 見上圖

a) 公司內部用戶

公司DNS SERVER在公司內部, 用戶通過DNS得到web server 私網地址192.168.1.100,既然不在一個網段,包也是先發給用戶的預設網關192.168.2.1,然後網關查找路由表找到出口,包到達目的地 web server。

b)互聯網用戶(外部)

公司DNS SERVER在公司內部, 外部用戶的DNS請求到達DNS server,DNS server 返回解析:web server IP 192.168.1.100,這個返回的DNS消息到達Internet gateway ,由DNS ALG 來完成DNS消息內部的地址替換,即202.108.22.5 替換192.168.1.100,然後到達外部用戶,外部用戶訪問202.108.22.5到達internet gateway,再進行替換成192.168.1.100,然後按照正常的路由轉發到達web server。

問題二:這是地址轉換的N:1的應用PAT,即多個私有地址轉換為一個公網地址。為了區別私有地址,採用以下的映射關係:


192.168.1.10 &<----&>202.108.22.5 + UDP/TCP port 2001(舉例說明,這個埠號是隨機的)
192.168.1.11 &<----&>202.108.22.5 + UDP/TCP port 2002


即通過公網地址+唯一的埠號 可以唯一區分私有地址。


謝邀。
問題描述得真是有夠亂的。不過我點開看了一下問題日誌發現題主還是蠻重視而且是花了心思考慮的。尊重題主的勞動那我就拋個磚先。

要解答題主的問題首先得先理解題主到底意圖是什麼,就問題1來看,題主提到了計算機B有公網和子網(大約應該是內網?)兩個IP。本以為這個問題是個IP和路由領域的問題。但是問題到後面突然出現計算機C有 和計算機B一樣的公網IP。加上這個前提以後,題目就完全亂了,這裡要猜的是題主的環境可能是一個多計算機共享同一個虛擬IP的負載均衡?我又仔細看了一 遍題目發現題主強調「如果B就是個普通用戶」,那我只能推測在這裡題主突然開了個腦洞把一開始自己假設好的簡單的A(用戶)-&>B(伺服器)環境突
然跳成了B+C -&> Internet這樣的環境。請問你這麼跳躍式思維是到底要幹啥?
然後再到問題2,發現題主完全是把交換和路由混著來,這概念混淆簡直不能忍啊。我真想扔一句請仔細把OSI七層模型再多看幾遍加深理解後再來提問。轉念一想估計題主的思路就是這種邏輯分不清才導致學習不得要領的,那還是要來簡單點播一下思路,才能有助於以後學習理解。

就問題1而言,首先要釐清問題然後再簡單歸化。因為考慮到題主題目本身矛盾,那我就必須根據不同猜測假設題主環境和問題


第一種情況,我先假定這是個只牽扯到交換路由知識的問題。

假定這句話完全正確:假設計算機B是一個網站伺服器,它的公網IP202.108.22.5, 那我就可以理解這個202.108.22.5的公網IP是直接配置在B的某塊網卡上,那192.168.0.101應該就是配置在B的另一塊網卡或者乾脆
就是同塊網卡。那情況就非常簡單,就是直白的Internet上A訪問B的問題,這裡只牽扯到IP和路由。回頭再看問題的前半部分,就是這個樣子:

計算機A與計算機B處於不同網段的子網中,計算機A要向計算機B發送數據(A之前從未向B發過)

這是唯一描述沒問題的

假設計算機B是一個網站伺服器,它的公網IP是 202.108.22.5,它的子網IP是192.168.1.100

子網應該是內網

而這個子網內還有個計算機C子網IP是192.168.1.101。

一開始沒用到C,而是在題主擅自突然換了環境才用,那先忽略這一句

A現在想要訪問網站通過DNS得到的也只是202.108.22.5這個公網IP ,那麼A發送的數據包中目的IP就是202.108.22.5

這問題DNS是打醬油的,以後不要帶上它,省得分散精力

而實際上這個數據包是要發送給子網192.168.1.100的B

為什麼突然發給202.108.22.5的包變成發給192.168.1.100了?你不是說202.108.22.5就是B的IP么,是B的IP那到達IP202.108.22.5這數據包就到達目的地哇!既然到達了還要做啥?

難道其實說B內心是這麼想的:我叫二狗,我給自己起了個名字叫內網俠,我認為內網俠才是真正的我。但是我內網俠現在在糾結一個事情:剛才有妹子仰慕二狗給二狗送了封情書,情書送到了二狗手裡,但是我二狗用什麼辦法才能把情書交給我內網俠呢?

B的路由器只看到A發過來的數據包目的IP是202.108.22.5 那麼這個路由器怎麼將數據包交給B?

B的路由器看到數據包目的地是B,而恰好這路由器又直連著B,為啥不朝B大喊一句二狗就是你,有人給你送情書然後直接砸情書?

路由器即便是要發ARP廣播來獲得B的MAC地址那它也得知道這個數據包是給192.168.1.100的才行啊。

還是那句話,數據是給202.108.22.5不是給192.168.1.100的。

問題分析到這裡基本上也知道我前面的假設應該是不正確的,這個問題存在一個題主缺失的知識點:題主大概是假設了B和C所在的網段里存在一個公用的公網IP,而並不是B本身就配置了202.108.22.5這個IP。題主通篇沒有提到這個202.108.22.5是配置在哪個設備上,只是簡單說了B有一個IP是202.108.22.5,和C也有一個IP是202.108.22.5。那問題就是這個IP是怎麼的?

這樣重新分析以後,這個問題就不再是一個簡單的IP和路由問題,還有一個繞不開的問題就是B和C為什麼有一個公用的公網IP,同時這個IP是配置在什麼設備上,怎樣起作用,這裡是不是除了簡單的交換和路由還有更高級的知識點和概念的加入。能想到這裡,基本上就抓住問題的本質了,我可以直接公開關鍵字:請參考NAT。尤其是對於問題1的前半部分,這屬於NAT裡面的DNAT。而後半部分,屬於SNAT。記住這兩種NAT用於不同需求不同場景。

如果題主能看到這裡,那可以暫緩看下面的回答,不妨先去補習一下NAT相關的基礎知識,然後結合你以前學習過的網路知識,看看有沒有可能問題就自問自答了。當然繼續看也是可以的


翻新一下繼續回答問題1的前半部分

而實際上這個數據包是要發送給子網192.168.1.100的B

修正問題後,202.108.22.5不是B的IP,B只有那個內網IP。公網IP是配置在NAT設備的,一般來說,路由器就是NAT設備啦,但是邏輯概念上還是要分清。
其實在咱們家,路由器叫二狗,B真名就叫內網俠。不要在意細節,他爹就是這麼起的名字。真正的超級英雄其實是內網俠,但是他的真面目不能被公眾知道,因此二狗負責代理所有的對外通信。而二狗只專職代理內網俠的情書,有情書只丟給內網俠,絕不會丟給內褲俠,這也是為什麼這個家庭只能有一個超級英雄的原因。

B的路由器只看到A發過來的數據包目的IP是202.108.22.5 那麼這個路由器怎麼將數據包交給B?

路由器上有規定,任何到202.108.22.5的數據包都修改目的地址到192.168.1.100,於是就能到B啦。在這種設定下,從外面不能訪問到除了B外的任何機器。

路由器即便是要發ARP廣播來獲得B的MAC地址那它也得知道這個數據包是給192.168.1.100的才行啊。

還是那句話,不用知道,路由器上就是加了這麼一條規則,所以必須這樣做


而問題1的後半部分則完全不一樣了。

另外如果B就是個普通用戶

這一句簡單的假設,就已經不是從外面訪問B的網路了,而是從B發起訪問外界,方向變了,結果顯然就不同了,實際上這已經不是前面的問題了。因為NAT本身特性就是考慮一個方向,不同方向行為是不對等的。

在同一區域網內還有用戶C 他們的公網IP是202.108.22.5

簡單的兩個詞:他們,是。題主你有沒有想過怎樣做到?忽略細節就導致你永遠想不通。

B或C向外發送數據的源IP是否都是202.108.22.5?

如果B和C只有內網IP,那是不可能訪問外網的。你這裡暗示了B和C可以訪問外面,那我只能歸結於這裡已經經過了SNAT,也就是B和C發往外面的數據,源IP地址被NAT設備替換了。至於替換成什麼那完全取決於NAT設備的設定,可以用202.108.22.5,也就是和被訪問同樣的IP,也可以用其他IP甚至是地址池隨機分配,完全取決於NAT設備的設置。

如果是
我們怎麼知道這個數據到底是B還是C發送的?

NAT設備一般同時也是網關,這樣所有數據都會經過這個設備。NAT設備會修改所有發出去數據包的源地址,那為了記住哪些是修改過的,必然會維護一個狀態表,記錄發送數據包設備的源IP,埠,和目的IP,埠的的信息,這樣數據回來後,簡單按目的IP和埠照狀態表查找,就能查出源IP和埠,於是數據就各找各媽各回各家。

問題2的話,仔細再看一下交換和路由的概念吧,實在不知道從哪裡答起。
簡單說:OSI分層是因為不同層干不同層的活。MAC是二層地址而IP是三層地址。以發郵件類比一下的話,IP好像是只知道發往哪個省市的地址標識,而MAC是具體到門牌號的。這樣設計後,省市一級郵件分發中心只看IP就可以幹活,而投遞員只看MAC就行了,因為投遞員不垮省。回到網路協議層,路由表維護IP段的選路,ARP表只作用於固定IP段的計算機查找。這樣所有網路設備就規規矩矩干自己分內的事兒。如果按照你的假設,只維護一張表的話,那這張表需要包含所有設備的地址,連接到的網路鏈路,以及從全球任何一個地址,到另外一個地址所要經過的節點信息。就是說你發郵件先要在封面上寫上郵遞員怎麼踩電瓶車才能把你的郵件一步一步送往大洋彼岸的所有信息。否則沒人給你送。


問題一:

1,路由器是怎麼把數據發給伺服器B的?

根據題目所述,使用下面這個簡單的網路示意圖來回答問題。

註:

1,PC-A是與路由器相連後,路由器接入外網的,由於使用軟體的原因,Cloud和A所連接的路由器之間沒辦法再加上一條線,所以就用覆蓋的方法表示了^*(- -)*^

2,該圖使用的軟體為Cisco Packer Tracer做成的網路模型後,再截圖後得到的。

3,IP地址已經按照題目所述配置完成,BC屬同一個子網,且能夠相互通信。

出口路由器X是通過NAT技術為內部網路中的主機配置了公網IP,在X中存在一張對應表:

--------------------------------------------

公網IP | 內網IP

202.108.22.5 | 192.168.1.100

--------------------------------------------

當從外網獲得一個A發送的IP數據報,X使用NAT技術對數據報的目的地址進行更改,改成內網IP,進行下一步分組或轉發。

在這裡解釋一下與 Zeson 回答的不同之處:NAT技術實現方法有三種,分別是靜態轉換,動態轉換,埠多路復用(埠映射,目前用的最多的就是埠多路復用技術,也就是改變外出數據包的源埠並進行埠轉換,內部網路的所有主機均可共享一個合法外部IP地址實現對Internet的訪問。

接下來就是數據報進行在內網的轉發,轉發時需要考慮的是數據鏈路層。需要獲得B的MAC地址才能夠將數據報送到B手中。這時,路由器X需要查詢由ARP協議獲取的ARP對應表:

-----------------------------------------------

內網IP | MAC地址

192.168.1.100 | XXXX......XXXX

-----------------------------------------------

X獲取B的MAC地址後,進行數據鏈路層上的傳輸。ARP協議是根據IP地址獲取物理地址的一個TCP/IP協議,它作用在數據鏈路層和網路層兩層上。與它對應的是RARP,但現在的功能已經被DHCP取代。

路由器X實際上是帶有交換設備的,X通過MAC找到下一跳之後,會從對應埠將MAC幀發送到switch上,最終完成數據報的傳輸。

(參考關鍵字資料:NAT,ARP,RARP,DHCP,MAC

問題2,如果B就是個普通用戶 在同一區域網內還有用戶C 他們的公網IP是202.108.22.5 B或C向外發送數據的源IP是否都是202.108.22.5?如果是 我們怎麼知道這個數據到底是B還是C發送的?

在這裡最主要使用的還是NAT轉換技術。根據三種不同的轉換方法,會生成對應的表格。使用前兩種方法時,B和C發出去的數據報源IP不一定相同,使用最後一種埠映射時,源IP是相同的。無論哪種方法,都能夠區分是哪一個發送的數據報。

問題二:

Zeson 的回答已經能夠解決題主的問題了。


建議找本計算機網路的書,謝希仁那本就可以入門。

第一個問題你看到NAT那章就懂了,第二個問題你理解網路分層就懂了。

看完入門之後可以看看TCP/IP詳解之類的。

這種問題還是自己一下子想通比較爽,網路很有意思的。


大家已經回答的很好,不過有一點題主理解有問題:問題2中如果目的主機在路由表中會直接按路由錶轉發,不會有ARP廣播,ARP廣播只有在到達目的主機所在網段時才會出現,因為已經只差最後一步就到目的地了,這一步就是得到目的MAC。


建議lz以後這種問題直接畫圖,更容易理解,僅僅文字描述看著頭疼。。


推薦閱讀:

為什麼100.74.146.78是保留地址?
支持ipv6的路由器有哪些?
如何評價極路由 HiWiFi?
200平房子,買什麼路由器能實現WiFi覆蓋?
單位WIFI無線改造,求推薦幾款穩定,能滿足的路由器??

TAG:網路安全 | 黑客Hacker | 路由器 | 計算機網路 | TCPIP |