1. 程式人生 > >不使用路由器來實現不同網段(子網)計算機之間通訊的方法

不使用路由器來實現不同網段(子網)計算機之間通訊的方法

文章針對有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通了。