下面奔今天的主題首先介紹一下,網(wǎng)關(guān)的作用,因為實(shí)現中要借助網(wǎng)關(guān)。
路由器是三層的設備,主要協(xié)議為IP。三層設備主要負責尋址,通過(guò)查看自已通過(guò)各種動(dòng)態(tài)路由協(xié)議或靜態(tài)指定的路由表,來(lái)確定數據包的傳送方向,路由器就像是站在十字路口的一個(gè)交警,如果有司機(數據包)不知道目的地就問(wèn)這個(gè)交警,這個(gè)交警從大腦的數據庫中檢索到,這個(gè)司機要去的目的地,然后再確定到達目的應走哪個(gè)路口。而計算機中有與OSI七層相對應的模塊,當應用層發(fā)出網(wǎng)絡(luò )請求后經(jīng)由表示層、會(huì )話(huà)層、傳輸層(具體功能不在本文范圍,請參看其它資料),要送到網(wǎng)絡(luò )層加封網(wǎng)絡(luò )層信息即IP地址,同時(shí)也要進(jìn)行尋址(路由)。但大部分的計算機是不支持路由協(xié)議的,既使和路由器相連也不會(huì )學(xué)習到任何路由信息。這就要行手工指定了。這就是網(wǎng)關(guān)的作用,設上網(wǎng)關(guān)就相當于在電腦中加入了一條這樣的路由條目(在命今提示符下輸入 route print 查看,特別注意,沒(méi)有網(wǎng)關(guān)是沒(méi)有這個(gè)條目的)。這里假定為網(wǎng)關(guān)為192.168.1.1 網(wǎng)卡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看到這張表上找不到去網(wǎng)目的地的路由條目時(shí),將數據包發(fā)往網(wǎng)關(guān)192.168.1.1,interface為到達網(wǎng)關(guān)的本地接口,這里是192.168.1.123所在接口的鏈路上。(有這張表的前題是:你的網(wǎng)卡必須是處在UP狀態(tài),既線(xiàn)纜接好的狀態(tài)下才能看到)。除上邊那個(gè)條目外應該還有很多條目,還必須說(shuō)的一個(gè)條目是你的直連路由條目,或說(shuō)你的網(wǎng)卡IP地址所在子網(wǎng)的路由(這條路由是系統自動(dòng)生成的):
Network Destination Netmask Gateway Interface Metric
192.168.0.0 255.255.255.0 192.168.1.123 192.168.1.123 20
意思是 到達你網(wǎng)卡IP所在子網(wǎng) 192.168.0.0/24(這里沒(méi)劃子網(wǎng),就是主網(wǎng)號了)的數據包,都將會(huì )發(fā)到你的本地接口上 既192.168.1.123所在接口連接的鏈路上(Gateway和Interface為什么一樣,沒(méi)有一個(gè)很好的解釋我這樣認為:interface永遠都是本機上的某一接口,而gateway可能是本機上的某接口,也可能是到達目標網(wǎng)絡(luò )的下一跳地址,根據具體的情況而定。當Gateway是本機接口的IP說(shuō)明此路由只有一跳,無(wú)須中間路由)。
當PCA要給PCB發(fā)送數據時(shí),首先應用程序產(chǎn)生數據,經(jīng)由上層協(xié)議送到網(wǎng)絡(luò )層,網(wǎng)絡(luò )層要完成他的使命,首先封裝源IP地址192.168.1.111,再封裝上目的IP地址192.168.1.222,下一部就要進(jìn)行路由了,這時(shí)就用到了計算機中的那張路由表。查表結果:去往192.168.0.0/24 (直連路由,同網(wǎng)段的)應發(fā)到192.168.1.123接口上。之后,還要引入一個(gè)新概念,就是arp表,就是由arp協(xié)議(address resolution protocol)產(chǎn)生的表。Arp是網(wǎng)絡(luò )層的協(xié)議,直接封裝在EthernetⅡ類(lèi)型的以太網(wǎng)幀里的。作用是請求 某IP地址所對應的以太網(wǎng)MAC地址。然后型成一張表,以便緩存此地址,下次直接再用。在這個(gè)例子中已經(jīng)確定,此數據包是發(fā)給PCB的,檢查目的和源IP地址,是在同一網(wǎng)段的,這時(shí)arp啟動(dòng),發(fā)送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
意思是:誰(shuí)的IP是192.168.1.222,請把你的MAC地址告訴192.168.1.111
然后PCB 發(fā)reply包(opcode位置0X0002)給源主機,部發(fā)內容如下:
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
然后發(fā)到鏈路上,數據包就會(huì )順利到達,與此同時(shí)對方會(huì )學(xué)到PCA的mac(通信是雙向的嗎),雙方互相知道對方的MAC。
還以上面圖為例,現在假定PCB的IP為192.168.0.222 (不在同一網(wǎng)段)看看如何通信,實(shí)踐告訴我們IP不在同一網(wǎng)段的計算機之間是不能通過(guò)二層交換機進(jìn)行通信的,那么是為什么呢,有了上面的基礎就不難分析出來(lái)。PCA要發(fā)往PCB的數據包在進(jìn)行路由時(shí),檢查發(fā)目的IP沒(méi)有和自已網(wǎng)卡IP在同一網(wǎng)段,也就不會(huì )有去往192.168.0.222/24的路由條目,這時(shí)就有兩種情況了,1、有網(wǎng)關(guān),有網(wǎng)關(guān)就有默認路由,此時(shí)又有兩種情況如果網(wǎng)關(guān)IP和本地主機在同一網(wǎng)段arp協(xié)議就會(huì )請求網(wǎng)關(guān)的IP所對應的mac,如果不在同一網(wǎng)段,arp協(xié)議不會(huì )啟動(dòng)這是協(xié)議規定。(正好符合這個(gè)例子)2、沒(méi)有網(wǎng)關(guān),自然沒(méi)有默認路由。這樣數據包就沒(méi)有去處,丟棄數據包。至此原因找以了,不能通信的原因在于,沒(méi)有路由條目,無(wú)法獲知對方的mac地址。怎么解決一下呢,只要在本地主機有條路由能指向目的主機,且有目的主機的mac地址,當然通信是雙向的目的主機也要有到源主機的路由和MAC的,這樣就能實(shí)現通信了,
下面看看實(shí)現方法如下圖:
在pcA上用arp -s 192.168.0.222 00-00-00-00-00-02 來(lái)加入一條靜態(tài)的IP to mac 映射表。網(wǎng)關(guān)設上192.168.0.222。其實(shí)加入網(wǎng)關(guān)就是在電腦上加入一條默認路由
(也可以用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
Pc2 上用arp -s 192.168.1.111 00-00-00-00-00-01 加入一條靜太的映射。
網(wǎng)關(guān)為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
此前的數據通信過(guò)程就成了這樣
PcA用層發(fā)出向pc2的通信,數據經(jīng)由表示層、會(huì )話(huà)層、傳輸層后,要送到網(wǎng)絡(luò )層加封網(wǎng)絡(luò )層信息即IP地址,源IP和目的IP不在同一網(wǎng)段(為沒(méi)有直連路由),用默認路由進(jìn)行發(fā)送,默認路由網(wǎng)關(guān)為192.168.0.222,查arp表有192.168.0.222所對應的mac地址(靜態(tài)指定的)這樣數據包就會(huì )被PCB接收,PCB也執行同樣的過(guò)程,這樣雙方就能通信了。好的大功告成了。
總結
這篇文章技術(shù)含量不高,但對通信細節要有明確了解,且還要有清晰的思路來(lái)讓讀者看懂。為了適應大多數人,所以寫(xiě)的比較啰唆,僅適用于初學(xué)者。在實(shí)現過(guò)程中,最后解釋的不清析,或說(shuō)不夠準確,還要寫(xiě)一篇文章來(lái)解釋一下。請關(guān)注。(此文有什么不足之處請留言指出)