文章針對有IP網絡基礎知識,對osi和以太網有基本了解的人群!
首先,來看一個常見的問題:
--------------------------------------------
Q:不同網段的機器通過二層交換機相連接,它們之間能相互通信嗎?
A:常規的情況下不同網段需通過網關訪問的方式我想你應該是已經了解的~這個系列的第一篇文章也有提到。(來自:網絡基本功系列:細說網絡那些事兒)
關於交換機連接不同網段的機器一定要實現相互通信,應該需要特殊的設置:
比如PC 1 IP: 192.168.1.1,默認網關設為:192.168.2.1
PC 2 IP: 192.168.2.1,默認網關設為:192.168.1.1
PC 1發現與PC 2不是同一網段需要發送給網關,現在問題就是如何獲得網關(也就是PC2 )的MAC地址。所以PC 1發送包含網關IP地址的ARP。ARP到交換機這里, 交換 機轉發這個ARP廣播包(沒有VLAN的話),於是PC 2返回自己的MAC地址給PC 1。現在,PC 1就有了PC 2的MAC地址。這樣就可以相互通信了。
---------------------------------------------
接下來介紹一下,網關的作用,因為實現中要借助網關。
路由器是三層的設備,主要協議為IP。三層設備主要負責尋址,通過查看自已通過各種動態路由協議或靜態指定的路由表,來確定數據包的傳送方向,路由器就像是站在十字路口的一個交警,如果有司機(數據包)不知道目的地就問這個交警,這個交警從大腦的數據庫中檢索到,這個司機要去的目的地,然后再確定到達目的應走哪個路口。計算機操作系統實現了OSI七層模型,當應用層發出網絡請求后經由表示層、會話層、傳輸層(具體功能不在本文范圍,請參看其它資料),要送到網絡層加封網絡層信息即IP地址,同時也要進行尋址(路由)。大部分的計算機只有自身使用的路由表,不會路由接收到的數據包,配置網關就相當於在自身的路由表中加入一個條目(在命今提示符下輸入 route print 查看,特別注意,沒有網關是沒有這個條目的),所有不明去向的包都發送至網關,這就是網關的作用。這里假定網關為192.168.1.1 網卡IP為:192.168.1.123):
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.123 20
這是一條默認路由,意思是當 route print 看到的這張表上,找不到去網目的地的路由條目時,將數據包發往網關192.168.1.1,interface為到達網關的本地接口,這里是192.168.1.123所在接口的鏈路上。(有這張表的前題是:你的網卡必須是處在UP狀態,既線纜接好的狀態下才能看到)。除上邊那個條目外應該還有很多條目,還必須說的一個條目是你的直連路由條目,或說你的網卡IP地址所在子網的路由(這條路由是系統自動生成的):
Network Destination Netmask Gateway Interface Metric
192.168.0.0 255.255.255.0 192.168.1.123 192.168.1.123 20
意思是 到達你網卡IP所在網段 192.168.0.0/24的數據包,都將會發到你的本地接口上 既192.168.1.123所在接口連接的鏈路上(Gateway和Interface為什么一樣,我這樣認為:本地網段不需要網關設備,當然還有種情況,不是本地接口上的網段的情況下,也可能是接口ip,因為以太網是廣播網絡,廣播網絡上開啟arp代理的設備,如果有到此網段的路由,這個開啟arp代理的設備會回應arp請求)。
當PCA要給PCB發送數據時,首先應用程序產生數據,經由上層協議送到網絡層,網絡層要完成他的使命,首先封裝源IP地址192.168.1.111,再封裝上目的IP地址192.168.1.222,下一步就要進行路由了,這時就用到了計算機中的那張路由表。查表結果:去往192.168.0.0/24 (直連路由,同網段的)應發到192.168.1.123接口上。之后,還要引入一個新概念,就是arp表,就是由arp協議(address resolution protocol)產生的表。Arp是網絡層的協議,直接封裝在EthernetⅡ類型的以太網幀里的。作用是請求 某IP
地址所對應的以太網MAC地址。然后型成一張表,以便緩存此地址,下次直接再用。在這個例子中已經確定,此數據包是發給PCB的,檢查目的和源IP地址,是在同一網段的,這時arp啟動,發送request包(把arp包中的opcode位置0X0001),包里的部分內容為
Sender MAC address 00:00:00:00:00:01 Sender IP address 192.168.1.111
Target MAC address 00:00:00:00:00:00 Target IP address 192.168.1.222
意思是:誰的IP是192.168.1.222,請把你的MAC地址告訴192.168.1.111
然后PCB 發reply包(opcode位置0X0002)給源主機,部發內容如下:
Sender MAC address 00:00:00:00:00:02 Sender IP address 192.168.1.222
Target MAC address 00:00:00:00:00:01 Target IP address 192.168.1.111
意思是 我PCB 192.168.1.222 的mac地址是00:00:00:00:00:02
這樣源主機就知道了目的主機的MAC地址,數據包封裝的二層MAC目的地址為00:00:00:00:00:02
然后發到鏈路上,數據包就會順利到達,與此同時對方會學到PCA的mac(通信是雙向的嗎),雙方互相知道對方的MAC。
還以上面圖為例,現在假定PCB的IP為192.168.0.222 (不在同一網段)看看如何通信,實踐告訴我們IP不在同一網段的計算機之間是不能通過二層交換機進行通信的,那么是為什么呢,有了上面的基礎就不難分析出來。PCA要發往PCB的數據包在進行路由時,檢查發目的IP沒有和自已網卡IP在同一網段,也就不會有去往192.168.0.222/24的路由條目,這時就有兩種情況了:
1、有網關(存在一個三層路由設備),網關指向三層設備,也就相當由PC上有了條默認路由,此時又有兩種情況如果網關IP和本地主機在同一網段,arp協議就會請求網關的IP所對應的mac,假如PCA的網關為192.168.1.1,arp請求如下:
Sender MAC address 00:00:00:00:00:01 Sender IP address 192.168.1.111
Target MAC address 00:00:00:00:00:00 Target IP address 192.168.1.1
如果不在同一網段,比如PCA的網關配置為192.168.100.1(路由表也會出現相應的一條路由),當PCA向某個互連網ip發送數據時,arp請求如下:
Sender MAC address 00:00:00:00:00:01 Sender IP address 192.168.1.111
Target MAC address 00:00:00:00:00:00 Target IP address 192.168.100.1
除非本網段真有ip為192.168.100.1的主機,否則這個arp請求,只有開啟arp代理且有去往192.168.100.1網段路由的設備才能回應。
2、沒有網關(不存在三層設備),自然沒法配置網關,也就不會有默認路由。這樣數據包就沒有去處,丟棄數據包。至此原因找以了,不能通信的原因在於,沒有路由條目。怎么解決一下呢,只要在本地主機有條去網目標主機的路由,這樣就能實現通信了,這也是我們要討論的情況。
下面看看實現方法如下圖:
實現1 互相做為對方的網關:
PCA
網關設為192.168.0.222。其實加入網關就是在電腦上加入一條默認路由
(也可以用route add 192.168.0.0 mask 255.255.255.0 192.168.111加上一條路由)即
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.0.222 192.168.1.111 1
PCB
網關設為192.168.1.111。默認路由就是
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.111 192.168.0.222 1
此前的數據通信過程就成了這樣
PCA應用層向pc2發送數據,數據經由表示層、會話層、傳輸層后,要送到網絡層加封網絡層信息即IP地址,源IP和目的IP不在同一網段(也就是沒有直連路由),用默認路由進行發送,默認路由網關為192.168.0.222,啟動arp查詢網關的mac地址,192.168.0.222真實存在,192.168.0.222回應arp請求,雙方獲得對方mac,這樣數據包就發送至PCB,PCB同樣可以與PCA通信。
實現2 在兩台pc上分別加入到對方的路由:
PCA
route add 192.168.0.222 mask 255.255.255.255 192.168.1.111(到192.168.1.111 從本地接口送出)
PCB
route add 192.168.1.111 mask 255.255.255.255 192.168.0.222
數據通信過程就成了這樣
PCA應用層向pc2發送數據,數據經由表示層、會話層、傳輸層后,要送到網絡層加封網絡層信息即IP地址,源IP和目的IP不在同一網段(也就是沒有直連路由),用手動添加的靜態路由進行發送,從本地接口發送,啟動arp查詢目的ip的mac地址,192.168.0.222真實存在,192.168.0.222回應arp請求,雙方都獲得對方mac,這樣數據包就發送至PCB,PCB同樣可以與PCA通信。
總結
這篇文章技術含量不高,但對通信細節要有明確了解,且還要有清晰的思路來讓讀者看懂。為了適應大多數人,所以寫的比較啰唆,僅適用於初學者。在實現過程中,最后解釋的不清析,或說不夠准確,有什么不足之處請指出。
轉:http://www.pppei.net/blog/post/6
-------------------------------------------------------------------------
另:
這個問題我弄清楚了,關鍵是從通信過程去找原因。我們來看一下不同子網間的PC是如何通信的:首先數據從應用層到網絡層,網絡層運行的是IP協議,它的主要功能是負責路由,這時它會判斷目標IP是否在同一網段,如果不是,它就准備把數據包發往網關,這時它會檢查ARP緩存是否有網關IP所對應的MAC地址,如果有則將數據包封裝成幀提交給數據鏈路層,數據鏈路層在通過物理層發往網關;如果沒有網關IP所對應的MAC地址,ARP協議啟動會向本網段廣播請求包(ARP協議只能對自己所在的網段廣播),然后獲得網關的MAC地址,再提交給數據鏈路層到物理層發往網關。
網關收到數據包后,它會根據目標IP地址搜索本地的路由表(網關的本質就是路由,可以把它看成路由器),如果能夠找到對應的路由條目,則進行轉發,如果沒有找到對應的路由條目,網關就會丟棄數據包。這樣數據就發送失敗。
清楚了這個過程就可以解釋不同網段計算機間為什么不能通信了。
這是因為當數據包到達PCA的網關時,找不到去往目標IP地址的路由(下一跳),因為目標IP地址和網關IP不在一個網段,如果沒有人為設置,網關IP不會有去往不同網段的路由,所以數據通不過而被丟棄。這時你可以做一個實驗:在PCA的網關上添加一條去往PCB網段的路由信息,這樣數據就可以通過了,同樣要想讓數據反過來也能夠通過,也必須在PCB的網關上添加一條去往PCA網段的路由信息才可以使得PCA與PCB通信。
上面說的是在PCA的網關與PCA在同一網段,PCB的網關與PCB在同一網段的情況(一般情況都是這樣)。但是為了做實驗,如果我們把PCA的網關設置為PCB的IP地址,PCB的網關設置為PCA的IP地址,我們會發現奇跡出現了,PCA與PCB可以通信了?為什么呢?同樣可以通過上述通信過程來解釋:因為數據到達PCA的網關,PCA的網關就是PCB,PCB的路由表里肯定會有到達自己地址的路由,所以數據可以通過網關,到達目的地,反之也一樣。有些人就會問了,既然PCA網關地址與PCA不在一個網段,PCA在將數據提交給數據鏈路層之前如何獲得MAC地址呢?原因是這樣:PCA在網絡層會判斷目標IP是否在同一網段,因為不是,它就准備把數據包發往網關,這時它會檢查ARP緩存是否有網關IP所對應的MAC地址,如果有則將數據包封裝成幀提交給數據鏈路層,數據鏈路層在通過物理層發往網關;如果沒有網關IP所對應的MAC地址,ARP協議啟動會向本網段廣播請求包(ARP協議只能對自己所在的網段廣播),那么由於PCA的網關不在一個網段,它怎么能夠收到ARP的請求包呢?這里我們要說的一個事實是PCA的網關收到了請求包,而且還回應了請求,因為PCA與PCB都連在一個交換機上,所以當ARP廣播請求時,交換機會把廣播包廣播到所有端口,這樣PCB(也就是PCA的網關)也就收到ARP的廣播請求,同時在ARP緩存中記錄下PCA的MAC地址,然后PCB進行了響應,將裝有自己MAC地址的響應包發往PCA,同理由於不在一個網段,PCA的網絡層會將數據發給自己的網關就是PCA,現在由於PCB已經有了PCA的MAC地址,所以數據就可以到達網關PCA,從而數據到達目的地。我們就發現PCA與PCB可以PING通了