為什麼網關與主機可以不在同一個網段?

我家裡 ADSL 的路由器 WAN 口 IP 是 175.9.54.138,子網掩碼 255.255.255.255;但是 WAN 的網關卻是 175.9.52.1。不是說網關要和 IP 在同一個網段嗎,為什麼 WAN 口、PPPoE 得到的網關不是這樣?本人初學網路,實在不懂。

主機A和主機B都連接在交換機的lan口
A配置如下
ip:192.168.3.100 子網掩碼:255.255.255.0 網關:192.168.2.100
B配置如下
ip:192.168.2.100 子網掩碼:255.255.255.0 網關:192.168.3.100

A和B能夠互相ping通,A和B都是在區域網,ip和網關都不在同一網段,這可沒有ppp協議,哪位知友能夠給個清楚的解答?

我在網上實在找不到答案,只能請教知乎大神了,哪位懂得拜託解釋下,麻煩了。


好問題!

這個問題的答案,我認為如果不好好說一說「嚇一跳」(劃掉)「下一跳」(或稱:網關、閘道器)的意義,是不能從根本上說清楚的。

〇、前提知識

我首先假定讀者知道路由表以及路由查找的基本概念,也了解網路的層次模型。

一、術語

為了避免歧義,我先把後文中的術語在此羅列如下,你可以跳過該部分,而是在遇到術語時返回查閱。

  • 數據包(packet):IP 協議傳送數據的單位;
  • 幀(frame):鏈路層傳送數據的單位;
  • 節點(node):實現了 IP 協議的設備;
  • 路由器(router):可以轉發不是發給自己的 IP 包的設備;
  • 主機(host):不是路由器的節點;
  • 鏈路(link):一種通信機制或介質,節點可以通過它在鏈路層通信。比如乙太網、PPP 鏈接,也包括隧道;
  • 介面(interface):節點與鏈路的連接(可以理解為抽象的「網卡」);
  • 鏈路層地址(link-layer address):介面的鏈路層標識符(如乙太網的 mac 地址);

二、乙太網絡中包的轉發

要想講清楚這個問題,我們要從 IP 的工作過程說起。來看網路拓撲:


192.0.2.0/24 203.0.113.0/24
| |
+-----+ | | +------+
| A |----+ +----| B |
+-----+ | | +------+
192.0. | | 203.0.
2.3 | 192.0.2.1 +-----+ 203.0.113.1 | 113.4
+-----------| R |-----------------+
| en0 +-----+ en1 |
| |

我們現在考慮這樣的一個網路,這個網路中有兩個鏈路(介質是乙太網),分別是 192.0.2.0/24 和 203.0.113.0/24。兩個鏈路中各有一個主機,介面的地址分別是 192.0.2.3 與 203.0.113.4,子網掩碼都是 /24。有一個路由器 R,有兩個介面,分別與這兩個鏈路相連,地址分別是 192.0.2.1 和 203.0.113.1 ,子網掩碼都是 /24。A 和 B 都把 R 作為自己的默認網關。

今 A 要給 B 發送一個數據包。按照 IP 協議的工作過程,發生的事情應該是這樣的:

  1. A 生成一個數據包,目的地址填 203.0.113.4,源地址填 192.0.2.3;
  2. A 查本機路由表,匹配默認路由,選定下一跳 192.0.2.1 和相應出介面;
  3. A 將包發出
  4. R 收到該數據包,查 R 的路由表,匹配鏈路本地路由 203.0.113.0/24,出介面 en1;
  5. R 處理該數據包(TTL 減一,重算 checksum),然後從 en1 發出;
  6. B 收到該數據包,並處理。

看起來沒什麼問題,很簡單。但是你會注意到,這個 「下一跳」,似乎和數據包的內容沒什麼關係。你應該能察覺到我在什麼地方故意遺漏了些東西。

其實,這裡出問題的地方就是 「A 將包發出, R 收到該數據包」 的過程。如果要刨根問底,我們就要搞清楚 A 是怎麼發出的數據包,R 是怎麼收到的。

眾所周知,IP 工作在第三層,要想發送數據,數據必須要委託給第二層——鏈路層來發送。我們這裡的鏈路層是乙太網。在乙太網上,數據以幀為單位進行傳送。也就是說,這個數據包要被包裝為一個幀,從 A 發給了 R。

問題來了,乙太網上傳輸的幀需要源 MAC 地址和目的 MAC 地址。這裡的源 MAC 地址,顯然是 A 的 MAC 地址,但是目的 MAC 地址是什麼呢?稍加思考,你就會知道,肯定是 R 的 en0 的 MAC 地址。而 A 是怎麼知道 R 的 en0 的 MAC 地址呢?這時,下一跳地址閃亮登場。A 之所以能知道 R 的 en0 的 MAC 地址,是因為 A 在路由查找的時候,確定了「下一跳地址」和出介面,然後,它在出介面的鏈路上通過 ARP 的方式,解析這個「下一跳地址」對應的 MAC 地址。

一般地,任何一個節點在發送(轉發或直接發送)數據包的時候,都會查本機路由表,確定出介面和下一跳地址(如果有),而結果往往分兩種情況:

  • 目的 IP 地址是 On-link,即查到的路由是鏈路本地路由(如 R 將數據包發送給 B 的過程)。那麼直接在出介面所在鏈路上,使用目的 IP 地址,作地址解析,得到鏈路地址,將其發出。
  • 目的 IP 地址是 Off-link,即查到的路由有下一跳地址。那麼此時,在出介面鏈路上,使用下一跳地址作地址解析,得到鏈路地址,將其發出。

三、帶有點對點隧道時,包的轉發情況

剛才我們說到,之所以需要下一跳地址,是因為我們需要用這個地址解析出下一跳的介面鏈路地址,以便將數據包包裝成幀,傳給下一跳。之所以「網關必須和ip在同一個網段」,原因就是這一點。

點對點隧道也是一種鏈路,常見的點對點隧道有 PPP 隧道、IPIP 隧道、GRE 隧道等,這些隧道有個共同的特點,對的,就像名字里寫的那樣,是點對點的。也就是說,這些隧道的兩端是確定的:從這邊進隧道的,一定從那一邊出來。在這些隧道上傳輸數據,也就用不著什麼鏈路地址,遑論地址解析。

我們再回頭看一下,這個「下一跳地址」到底都有啥用,我們發現,似乎只有解析下一跳的鏈路地址的用處了。因此,既然不用地址解析,也就用不著這個「下一跳地址」了。

你可能被嚇到了,真的用不著這個下一跳地址嗎?反正我是試過,在隧道介面作為出介面的時候,確實沒啥用,你可以指定成你想要的任何地址,都沒有關係。

這就是為什麼,wan 口的掩碼是 /32。其實這個網關地址完全沒用處,可以任意指定或不指定。

四、實驗驗證

我們先來看一下,arp 查詢下一跳介面地址的過程。下列命令在 linux 上進行。


# 創建三個 Namespace
ip netns add A
ip netns add R
ip netns add B

# 連接 A 和 R
ip link add veth0 type veth peer name veth1
ip link set veth0 netns A name eth0
ip link set veth1 netns R name en0

# 連接 B 和 R

ip link add veth0 type veth peer name veth1
ip link set veth0 netns B name eth0
ip link set veth1 netns R name en1

# 配置 A

ip netns exec A ip link set lo up
ip netns exec A ip link set eth0 up
ip netns exec A ip address add 192.0.2.3/24 dev eth0
ip netns exec A ip route add 0/0 via 192.0.2.1 dev eth0

# 配置 B

ip netns exec B ip link set lo up
ip netns exec B ip link set eth0 up
ip netns exec B ip address add 203.0.113.4/24 dev eth0
ip netns exec B ip route add 0/0 via 203.0.113.1 dev eth0

# 配置 R

ip netns exec R ip link set lo up
ip netns exec R ip link set en0 up
ip netns exec R ip link set en1 up
ip netns exec R ip address add 192.0.2.1/24 dev en0
ip netns exec R ip address add 203.0.113.1/24 dev en1
echo 1 | ip netns exec R tee /proc/sys/net/ipv4/ip_forward

# 在 A 上監聽 eth0
ip netns exec A tcpdump -i eth0 -w /tmp/1.pcap

# 在 A 上 ping B
ip netns exec A ping 203.0.113.4

# 停止抓包

fg
(按 ^C)

然後我們來查看 /tmp/1.pcap,可見在發出 ping 包之前,A 確實發送了 ARP 請求,查詢地址 192.0.2.1 的 MAC 地址。之所以只查詢了一次,是因為 A 本機有 ARP 緩存。

為了演示點對點隧道的情形下,下一跳地址不再有意義的現象。我們再新建一個 namespace C,它與 B 相連,然後在 A 與 B 之間創建 IPIP 隧道。我們試圖讓 A 通過 A 與 B 之間的 IPIP 隧道連通 C。


ip netns add C

# 連接 B、C
ip link add veth0 type veth peer name veth1
ip link set veth0 netns B name eth1
ip link set veth1 netns C name eth0

# 配置 B
ip netns exec B ip link set eth1 up
ip netns exec B ip address add 198.51.100.1/24 dev eth1
echo 1 | ip netns exec B tee /proc/sys/net/ipv4/ip_forward

# 配置 C
ip netns exec C ip link set lo up
ip netns exec C ip link set eth0 up
ip netns exec C ip address add 198.51.100.2/24 dev eth0
ip netns exec C ip route add 0/0 via 198.51.100.1 dev eth0

# 嘗試在 A 中 ping C,「Destination Net Unreachable」
ip netns exec A ping 198.51.100.2

# 建立 ipip 隧道
ip netns exec A ip tunnel add ipip0 mode ipip remote 203.0.113.4 local 192.0.2.3
ip netns exec A ip link set ipip0 up
ip netns exec B ip tunnel add ipip0 mode ipip remote 192.0.2.3 local 203.0.113.4
ip netns exec B ip link set ipip0 up

# 給隧道分配地址
ip netns exec B ip address add 175.9.52.1/22 dev ipip0

# 進入 ns A
ip netns exec A bash

# 添加 A 本端地址和到 C 的路由
ip address add 175.9.54.138 peer 175.9.52.1 dev ipip0
ip route add 198.51.100.0/24 via 175.9.52.1 dev ipip0
ping 198.51.100.2

# 清除隧道地址配置和路由配置,換種方式
# 這次不指定下一跳地址
ip route del 198.51.100.0/24
ip address flush dev ipip0
ip address add 175.9.54.138/32 dev ipip0
ip route add 198.51.100.0/24 dev ipip0 scope global
ping 198.51.100.2

# 清除隧道地址配置和路由配置,換種方式
# 這次隨便亂寫一個下一跳地址
ip route del 198.51.100.0/24
ip address flush dev ipip0
ip address add 175.9.54.138 peer 175.9.54.139 dev ipip0
ip route add 198.51.100.0/24 via 175.9.54.139 dev ipip0
ping 198.51.100.2

# 退出 ns A
exit

# 清理
ip netns del A
ip netns del B
ip netns del C
ip netns del R


這個話題很經典,所以想分享一下我的觀點。

IPoE (IP over Ethernet )
公司區域網里,PC通過DHCP伺服器拿到IP/mask/ Default gateway,舉個例子:

IP:10.1.1.2
Mask: 255.255.255.0
Default gateway: 10.1.1.1

這三個參數可以滿足
1)同網段10.1.1.0/24通信
由於乙太網頭部封裝需要對方的MAC,所以需要ARP廣播

2)跨網段通信(除了10.1.1.0/24的所有網段)
任何跨網段的通信需要發給網關,那自然需要通過ARP廣播來發現網關,關鍵的地方到了,主機必須和網關在一個廣播域里,不是嗎???一個廣播域意味著什麼???主機與網關必須在同一個網段,同一個掩碼,否則無法發現網關的MAC,通信會失敗。

互聯網世界裡,誰負責分配IP,誰來全權負責雙向路由的打通,IPoE里是這樣,PPPoE里也是這樣,接下來談談PPPoE

PPPoE (PPP over Ethernet )
PPPoE只是一個適配層,其目的是在Ethernet物理介質上傳輸PPP協議,其封裝格式為:

Ethernet + PPPoE + PPP + IP + Payload

所以我們先忽略它,只討論PPP,PPP協議分兩個階段:

1 控制協議傳輸

1.1 LCP
主要用於協商用什麼協議認證用戶,協商結果為1.2的協議

1.2 CHAP
用於認證用戶是否合法,如果通過,進入1.3;否則認證失敗

1.3 IPCP
用於為主機分配IP/mask/ Default gateway,比如:
IP:175.9.254.138
Mask: 255.255.255.255
Default gateway: 175.9.252.1

PPP(Point to Point Protocol)是點對點協議,一端是主機,另一端就是網關,主機像飄在海中的一個個小船,通過一根根纜繩(PPP連接)連在港口的錨點(網關)上,小船的裝卸貨物(IP流量)全部通過錨點。

由於PPP頭部封裝沒有地址段,所以無需像乙太網那樣用ARP來解析網關MAC地址,所以也無需主機與網關在同一個網段,主機的任何出口流量全部發給PPP虛擬介面(Virtual Access),虛擬介面完成必要的封裝,虛擬介面的流量順著物理光纖,到達PPP伺服器,完成解封裝得到IP包,然後再依據IP路由表來繼續轉發。

2 數據傳輸

封裝格式為:
Ethernet + PPPoE + PPP + IP + Payload

有同學肯定會說,PPP沒有地址,但乙太網頭部不是需要知道Destination MAC 的嘛?這個MAC通常是PPPoE伺服器的,PPPoE通常與PPP是一體的,PPP伺服器通常是網關,所以最終這個Destination MAC 還是網關的MAC,那這個MAC是如何知道的呢?

通過PPPoE Discovery / PPPoE Offer 這個過程發現、握手來發現網關的MAC,這個過程早於PPP協議。

這裡PPPoE耍了一個鬼把戲,通過乙太網廣播PPPoE discovery(不是ARP,因為主機介面還沒有配置任何IP地址)去發現網關的MAC,最終還是要知道網關的MAC地址的。


網關和IP需要在同一網段這個假設本身是錯誤的。
網關這個東西算是個俗稱,科學一點的叫法是默認路由。也就是目的IP沒有精確匹配到現有路由表條目時,命中的一條兜底的路由。擴展一下,默認路由也就是一條匹配範圍最廣的路由而已。而路由的要求,並不是要求下一跳跟源地址必須在同一子網的。同樣,網關也並沒有這個限制。
對於網關,或者說任意一條路由表的下一跳地址,限制是下一跳必須是可達的,否則這個路由就沒有存在的意義。
回到你的問題,你的下一跳175.9.52.1一定是可以知道如何到達的,但卻不一定是必須在你IP的子網內。由你的子網掩碼可以看出,你的IP其實是一個端到端的網路而非乙太網,這個IP所在的子網,只有它自己。至於網關IP怎麼到達,很可能是一條路由表記錄,下一跳為某個網路介面,在你的例子里,就是你端到端的對端介面。


我要補充一點,

在配置路由表的時候,必須非常注意到不僅是配置下一跳的ip地址,更重要的是配置出介面的物理介質,或者說配置出介面號碼。

準確來說,ppp下面默認路由就是ppp對端的說法是錯誤的。

我們假設一個主機有一個以太口一個ppp介面,那麼配置以太介面為默認路由出介面,而讓ppp只走某些特定網址網段的包是可行的。

回到樓主的問題,答案就是,在ppp介面下,配置好出介面,網關的ip地址不重要。本地地址掩碼是全1,說明沒有同一網段的地址。


我又不請自來答題了……⊙﹏⊙。答主 @王邈 已經很詳細地在最基礎的方向回答了這個問題,題主可要好好學習哦。下面我嘗試一下從問題出發,談一談我對這個問題的見解,如有錯誤請各位指正。

先從簡潔的方式拆解回答一下題主的問題:

網關必須和ip在同一個網段

答:這個認知其實是不成立的,我覺得這更多的是一種誤解。

adsl的路由器wan口ip是175.9.54.138,子網掩碼,255.255.255.255,但是wan的網關卻是175.9.52.1

答:ADSL撥號上網是基於PPPoE技術來處理網路層問題的,所以出現ip地址不在一個網段的疑問其實不能使用家用區域網的思維方式來思考。

上面的回答可能有點粗糙,希望答主能理解我所說的「點」。^_^

---------------------------我是啰哩啰唆回答分割線----------------------------------------------------

通過上面拆解,我們其實可以看出來這個問題的疑問主要出現在以下兩個問題上:

  • 網關是什麼?
  • ADSL撥號上網,網路地址不同還能通信?

首先我們一起來一個一個地了解幾個問題:

1 網關
引用一段百度百科的描述:

網關(Gateway)又稱網間連接器、協議轉換器。網關在網路層以上實現網路互連,是最複雜的網路互連設備,僅用於兩個高層協議不同的網路互連。網關既可以用於廣域網互連,也可以用於區域網互連。 網關是一種充當轉換重任的計算機系統或設備。使用在不同的通信協議、數據格式或語言,甚至體系結構完全不同的兩種系統之間,網關是一個翻譯器。
---百度百科

雖然這個定義有點啰嗦,但是知識點基本能表達出來了。我們從這段話提煉出幾個網關的作用【網路互聯】、【協議轉換】和【翻譯器】。

其實後面的兩個詞都是為了第一個關鍵詞【網路互聯】服務的,所以我們就可以粗暴地可以認為網關就是用來網路互聯設備好了。

通過上面的描述,嘗試將網關抽象成這樣的一個東西:

網關,用來溝通不同網路之間的「節點」。這個節點能翻譯網路之間不同的協議,所以這個節點可以放在協議構成的網路之間(放在光纖網路、ATM網路、「電話線網路」、「有線電視同軸線網路」、乙太網之間)。

大家能發現嗎?這個叫網關的「節點」其實並沒有提到任何跟ip地址相關的描述,網關這個概念其實是一個網路通信的概念而不僅僅是一個單純的ip網路的概念。所以,ip地址這個概念並不能「束縛」網關去完成他的使命~~~

在使用上,當我們有需要傳送到其他網路的數據時,只需要將數據「丟」到這個網關節點就可以了,具體這個網關是怎麼傳送走的你是不用管的。當然,網關也不會管你是怎麼把包「丟」過來的。這個「丟」能理解嗎?(*^__^*)

咱們先記住網關這個東西的作用,後面咱們結合題主問題來加深理解這個東西( ̄??)

2 PPPoE
有個引用:

PPP over Ethernet(PPPoE)協議,是在乙太網絡中轉播PPP幀信息的技術。

就是在乙太網上使用PPP技術。PPP技術又是什麼鬼呢?(天吶,為毛通信的知識解釋起來這麼繁瑣,一環套一環的……摔)
又有一個引用:

PPP(點對點協議(Point to Point Protocol)):是為在同等單元之間傳輸數據包這樣的簡單鏈路設計的鏈路層協議。這種鏈路提供全雙工操作,並按照順序傳遞數據包。

題主應該不是學通信的,所以就不給大家普及通信繁瑣的概念了。

我們能在上面這段定義引用中發現一個詞「PPP協議是一個鏈路層協議」。結合PPP over Ethernet這個英文單詞,再結合上面兩段引用的描述,我們嘗試抽象這樣的一個概念:

PPPoE技術能讓兩個網路節點直接打通鏈路層的「相互感知」,並在這個「互相感知」上面提供乙太網一樣的網路服務(就是ip地址的通信咯)。

不知道這個描述能不能夠清楚。

下面類比一下普通乙太網的鏈路層協議ARP,又是一個引用:

地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議。主機發送信息時將包含目標IP地址的ARP請求廣播到網路上的所有主機,並接收返回消息,以此確定目標的物理地址

這個是乙太網上的鏈路層的協議,這個題主是學網路的應該不太需要我解釋了。
(*^__^*)

用人話來描述一下概念:

  • 在普通乙太網裡面,我要給一個特定IP地址發送數據,我需要使用ARP協議在區域網裡面問一下這個IP地址是誰?獲取回應之後,鏈路層就記住了這個目標的物理地址了。
  • 在PPPoE中,由於目標地址直接就已經與我建立了鏈路層的連接,我給這個對端IP地址發送數據的時候就根本不需要ARP的過程確認鏈路層地址。直接將數據發送到連接的對端就可以了。

說得好繁瑣啊,我都覺啰嗦了。來來來,我們來回到題主的問題。注意啦~~~~(敲黑板)

我家裡adsl的路由器wan口ip是175.9.54.138,子網掩碼,255.255.255.255,但是wan的網關卻是175.9.52.1

其實題主應該是能發現的,家裡路由器的wan口的子網掩碼是255.255.255.255。用網路知識來看,子網掩碼全部都「掩死」這個ip地址,或者說節點其實已經不屬於任何一個乙太網網網域了。

這個ip地址和子網掩碼結合起來其實是一個乙太網網路的孤點,沒有任何一個主機與這個地址處於同一個網段,或者說同一個網域。所以這節點如果發送任何ARP請求,是不會有任何響應的。wan口地址與網關地址是不是「看起來是用一個網段」也並沒有實際意義,他們的數據鏈路層發現不需要ARP協議來處理。

那為什麼這個地址能訪問「外網」呢?
因為這地址與它的網關節點是使用PPPoE進行鏈路層的連接的,也就是說這個節點發送到網關節點的數據包根本不需要使用APR協議發現對方。所有數據包都可以順利通過PPP連接到達網關節點了。

如果我表述的夠清楚的話,題主應該能模糊地理解上面的那個問題了。

------------------------------羅里吧嗦案例分割線-------------------------------------------------------
結合一下網關的作用,複雜一點的ADSL家用的網路拓撲應該是這樣的:

如果沒有無線功能的ADSL貓的家庭,我們單獨買一個無線路由器對不對?就像上面那樣,家裡其實是一個乙太網區域網,填寫這個區域網的網關ip地址就需要是同一網段了,因為他們是乙太網區域網,不再同一個網段沒法訪問。題主的誤解也是從生活經驗總結出來的,不過還是要贊一個。(*^__^*) 下面是乙太網區域網1里的iPhone發送數據到知乎伺服器115.159.241.25的過程:
(感謝 @蔚藍 同學對拓撲的指正)

  1. 假設乙太網區域網里的設備都是自動獲取的IP地址,所以網關會設置為無線路由的lan口;
  2. iPhone數據包發送之前,設備會在先找一下知乎伺服器是不是再區域網內;
  3. 因為知乎伺服器不再乙太網區域網1內,所以ARP發現115.159.241.25這個地址的時候並沒有響應;
  4. iPhone就會將數據包發送到網關,也就是無線路由lan口;
  5. 無線路由起收到這個數據包之後就將數據包通過wan口轉發到ADSL貓上
  6. ADSL貓將這個數據包從乙太網信號調製能在電話線上傳輸的模擬信號,送到了它能接入的另外一個網路,也就是「電話線」上;
  7. 由於PPPoE網關直接與ADSL貓之間有PPP連接,所以數據包被發送到了PPPoE網關;
  8. PPPoE網關就負責通過它自己的其他接入網,將數據包發送到了知乎的伺服器。

以上是幾部簡要的過程描述,其實數據包轉發真的要複雜很多很多很多很多……
換成光纖接入,拓撲也是基本一樣的,只是藍色線要換成光纖,再換成光貓就可以了。

以上……

第二次這麼詳細回答問題,走過路過的鄉親們,請點個贊吧,午飯還沒吃吶。


一般來講,這種路由不能稱為默認路由,而是pppoe協商成功後,由virtual template端推送的一條32位的主機路由。這是pppoe,或者說是PPP的特色。
這種PPP協議的推送路由,兩端必定不在同一網段,否則就稱不上PPP了。
而PPP,就是這種蠻不講理地建立點到點的連接,我有LCP,我有NCP,還能靠IPCP自給自足,完全自成一家。


一個出站IP包需要指定一個網路介面,如果這個介面連接了不止一台主機,則你還需要指定一個二層網路地址來確定下一跳到底是哪台機器,對於乙太網這個地址是一個MAC地址,由於一般的二層網路上一個ip同時只能對應一個二層地址,所以也可以用IP地址唯一標示下一跳,這個ip地址對應的機器就是一般我們所說的網關。
ppp的網路介面只連接了一台對端(所以才叫peer-to-peer),所以你只需要指定出站包的網路介面就可以正確的路由了。


網關沒必要和你的IP在一個子網。和你IP在同一個子網只會是下一跳路由,不過很可惜PPPOE不跟你講這一套,它老人家自己有一套玩法。


這個問題也可以結合主機路由表及主機發送數據包的過程進行理解。總體結論:
1.只要本機路由表有目的地址匹配項,該數據包就會被送出去;
2.網關地址在Linux中必須對應一條類型為scope link的路由表項,在進行ARP廣播時根據該表項選擇進行arp廣播的介面。


為了簡化和直觀顯示結果,我直接啟動了一台virtualbox虛擬機,虛擬機里安裝了ubuntu 14.04,並通過NAT和主機相連(NAT介面的原理和PPPOE一致)。同時主機還有一個內網介面。
步驟一:初始默認情況,主機自動獲得IP10.0.2.15/24和網關10.0.2.2一個網段,
如果輸入ip route命令,結果如下,ping網關正常能通;

步驟二:主機地址手動設為10.0.1.2/32,ping網關依舊能通;

ip route命令返回的主機路由表

步驟三:刪除所有路由,只添加default 路由,不能直接添加,提示Network is unreachable。

步驟四:多個介面同一個相同的網關地址,路由表配置優先選擇不和網關直連介面,此時ping 10.0.0.2不通

ip route

清空arp 表

ping 10.0.0.2不通
原因:進行arp廣播根據metric 1的路由表選擇僅從eth1介面廣播,不會在所有介面上都廣播,然而網關實際和eth0相連,所以收不到arp應答,無法ping 通。

註:注意到測試過程中有時網關主動通過eth0發來arp消息,系統會自動把eth1的表項刪除。此時又可以ping通了。

參考:
How to clear the ARP cache on Linux? - Linux Audit
arp requesting to another subnet, how?


題主你確定你的子網掩碼是.255?
正兒八經的回答問題:默認網關和IP在同一網段是有可以的但是不是必須 ,交換機是必須在同一網段 。我們先假設三個路由器R1,R2,R3其中R1為主路由器R2R3為分路由器,分路由器下面鏈接各自的LAN鏈路,R2鏈路中的PC的默認網關一般為R1與R2相連的埠的IP或者R2的埠(與LAN鏈路相連的)一般情況下(絕大多數可能更合適)不會寫R3的埠作為網關的主要原因是如果用R3的話至少要在R1上進行設置要確保R2R3能進行通信但是如果這樣的話那為什麼要設置成R3呢直接寫R1不是更好嗎 當然如果是單臂路由作為區域網的話是很好的 那麼也就是說可以填寫的默認網關有兩個。
額 有點偏了 其實樓主主要的是沒有理解同一網段這個概念 什麼是同一網段呢大範圍這個網路分為A、B、C(用IP分)當然還有其他的這裡就不說了 一個A網(IP)可以分成若干個B網及C網。那麼我單獨把其中的一個B網C網拿出來請問這是同一個網段嗎? 可以說是的因為這兩個子網屬於同一個網路段也就是那個A類網 當然可能有人說我忽悠人 那拿題主的作為例子http://175.9.54.xxx http://172.9.52.xxx 是同屬於175.9.xx.xx這個網段的 極端點可以用175.9.1.1作為默認網關的再細分的就涉及到子網的問題了以及可變長子網掩碼的劃分。
這裡有個帖子很好網關和IP必須設置在同一個網段嗎? - 思科技術論壇 - 51CTO技術論壇_中國領先的IT技術社區


個人認為 默認網關和你主機在同一個廣播域,不需要相同網段,主機就能將ip數據包封裝為幀數據發給網關,網關主機接受並ip數據包,從而根據網關主機路由錶轉發數據包。個人理解

但是自己實踐發現們沒有成功 很遺憾 很糾結


有沒有網關不重要,重要的是你的數據報文出去知道往哪走。WAN鏈接是廣域網鏈接,LAN是區域網鏈接。在廣域網上採用區域網這種方式鏈接對運營商來說效率太低(各層網路是異構的)於是有了pppoe,這種協議屏蔽了異構的底層網路。


wan口與局端用的協議是在乙太網上封裝的ppp協議,簡稱pppoe。ppp是點對點協議,節點相互通信時,無需檢查是否在同一子網,直接發給對方即可


你所的網路採用了大二層架構,在二層上虛擬了大網關而已
不影響


一般的路由,默認網關還是0.0.0.0呢?和任何一個地址都在同一個網段


推薦閱讀:

ip地址是否可以取代mac地址,Fibre Channel over IP是否只使用ip地址進行通信?
TCP協議自2000年後有什麼變化?
所有的網路請求底層協議是不是都是TCP/IP?

TAG:計算機 | 計算機網路 | IP地址 | 網關 |