如果當(dāng)時(shí)有好好聽計(jì)算機(jī)網(wǎng)絡(luò)這門課,那下面聊的東西非常簡(jiǎn)單。
起因來自一次駐場(chǎng)開發(fā),所在工作環(huán)境需要用網(wǎng)線連接虛擬云桌面進(jìn)行操作,于是我就一會(huì)插網(wǎng)線云桌面開發(fā),又一會(huì)手機(jī)熱點(diǎn)騰訊會(huì)議,偶爾就會(huì)有一個(gè)問題,就是同時(shí)連著無線和有線的時(shí)候,要么無法訪問外網(wǎng)要么云桌面就會(huì)斷開,實(shí)在是麻煩。
當(dāng)時(shí)我的想法就是如果能控制不同的程序使用不同的網(wǎng)絡(luò)就好了,所以我也搜索了一下,但是才疏學(xué)淺也沒有抱著什么希望所以簡(jiǎn)單搜了下便放棄了。
直到某天我使用virtualBox創(chuàng)建虛擬機(jī)的時(shí)候,在網(wǎng)絡(luò)配置界面發(fā)現(xiàn)了有兩個(gè)網(wǎng)卡可以選擇,很明顯分別是線網(wǎng)卡和無線網(wǎng)卡,于是我創(chuàng)建兩個(gè)虛擬機(jī),分別選取不同網(wǎng)卡,發(fā)現(xiàn)可在兩個(gè)虛擬機(jī)下同時(shí)訪問外部網(wǎng)絡(luò)和云桌面系統(tǒng)。
在我看來虛擬機(jī)也是一個(gè)程序,它是怎么做到使用指定的網(wǎng)卡呢?
于是一個(gè)的名詞就來了:路由。
什么是路由?
路由(routing)是指分組從源到目的地時(shí),決定端到端路徑的網(wǎng)絡(luò)范圍的進(jìn)程 。路由工作在OSI參考模型第三層——網(wǎng)絡(luò)層的數(shù)據(jù)包轉(zhuǎn)發(fā)設(shè)備。路由器通過轉(zhuǎn)發(fā)數(shù)據(jù)包來實(shí)現(xiàn)網(wǎng)絡(luò)互連。雖然路由器可以支持多種協(xié)議(如TCP/IP、IPX/SPX、AppleTalk等協(xié)議),但是在我國絕大多數(shù)路由器運(yùn)行TCP/IP協(xié)議。路由器通常連接兩個(gè)或多個(gè)由IP子網(wǎng)或點(diǎn)到點(diǎn)協(xié)議標(biāo)識(shí)的邏輯端口,至少擁有1個(gè)物理端口。路由器根據(jù)收到數(shù)據(jù)包中的網(wǎng)絡(luò)層地址以及路由器內(nèi)部維護(hù)的路由表決定輸出端口以及下一跳地址,并且重寫鏈路層數(shù)據(jù)包頭實(shí)現(xiàn)轉(zhuǎn)發(fā)數(shù)據(jù)包。路由器通過動(dòng)態(tài)維護(hù)路由表來反映當(dāng)前的網(wǎng)絡(luò)拓?fù)?,并通過網(wǎng)絡(luò)上其他路由器交換路由和鏈路信息來維護(hù)路由表。以上來自百度百科。
舉個(gè)通俗的例子就好比快遞投遞的過程,一個(gè)包裹會(huì)根據(jù)省市區(qū)街道小區(qū)最終放到你家門口,放在網(wǎng)絡(luò)世界中,數(shù)據(jù)也要有他的路線指引,而路由就是這個(gè)路標(biāo)。
路由器查看了數(shù)據(jù)包的目的協(xié)議地址后,確定是否知道如何轉(zhuǎn)發(fā)該包,如果路由器不知道如何轉(zhuǎn)發(fā),通常就將之丟棄。如果路由器知道如何轉(zhuǎn)發(fā),就把目的物理地址變成下一跳的物理地址并向之發(fā)送。下一跳可能就是最終的目的主機(jī),如果不是,通常為另一個(gè)路由器,它將執(zhí)行同樣的步驟。當(dāng)分組在網(wǎng)絡(luò)中流動(dòng)時(shí),它的物理地址在改變,但其協(xié)議地址始終不變。
那么路由是怎么匹配轉(zhuǎn)發(fā)的呢?一般來說就是通過路由表進(jìn)行最長(zhǎng)匹配原則,路由表中會(huì)對(duì)ip進(jìn)行分段劃分,每一個(gè)ip段都對(duì)應(yīng)的下一跳的網(wǎng)絡(luò)地址,隨著一級(jí)級(jí)的路由跳轉(zhuǎn),最終將數(shù)據(jù)發(fā)送到請(qǐng)求地址。同樣在你的系統(tǒng)中也有一個(gè)路由表,可以理解為你的數(shù)據(jù)投遞過程中的第一站。
如何查看系統(tǒng)路由表,因?yàn)槲业氖莡bunu系統(tǒng),因此下面都是linux系統(tǒng)的操作指令,當(dāng)然window也是異曲同工。
查看路由表
route -n
ubuntu:~$ route -n
內(nèi)核 IP 路由表
目標(biāo) 網(wǎng)關(guān) 子 網(wǎng)掩碼 標(biāo)志 躍點(diǎn) 引用 使用 接口
0.0.0.0 192.168.0.1 0.0.0.0 UG 600 0 0 eth1
0.0.0.0 146.10.0.1 0.0.0.0 UG 20600 0 0 eth2
192.168.146.1 0.0.0.0 255.255.255.0 U 600 0 0 eth1
隱去了真實(shí)信息,上面是我自己編寫的一個(gè)路由表,其中目標(biāo)ip和子網(wǎng)掩碼會(huì)計(jì)算出一個(gè)ip段,如果當(dāng)前請(qǐng)求地址處于這個(gè)ip段,那么數(shù)據(jù)包將會(huì)發(fā)到對(duì)應(yīng)的接口,也就是下一跳的地址中,其中192.168.146.1 就是我的虛擬機(jī)的ip,當(dāng)我創(chuàng)建了一個(gè)這個(gè)虛擬機(jī)的時(shí)候
所以我現(xiàn)在的目標(biāo)就是當(dāng)使用云桌面的時(shí)候,讓數(shù)據(jù)包轉(zhuǎn)發(fā)至有線網(wǎng)卡中,而其他的請(qǐng)求轉(zhuǎn)發(fā)至無線網(wǎng)卡中。比如現(xiàn)在云桌面的地址是147.20.0.111,那么如何在請(qǐng)求這個(gè)ip的時(shí)候讓其跳轉(zhuǎn)到有線網(wǎng)卡eth2中呢?
于是第二個(gè)的名詞就來了:子網(wǎng)掩碼(CIDR)。
什么是子網(wǎng)掩碼?
子網(wǎng)掩碼(subnet mask)又叫網(wǎng)絡(luò)掩碼、地址掩碼、子網(wǎng)絡(luò)遮罩,它用來指明一個(gè)IP地址的哪些位標(biāo)識(shí)的是主機(jī)所在的子網(wǎng),以及哪些位標(biāo)識(shí)的是主機(jī)的位掩碼。子網(wǎng)掩碼不能單獨(dú)存在,它必須結(jié)合IP地址一起使用。
通俗來說就是一種ip匹配規(guī)則,再直白點(diǎn)就是ip世界的正則表達(dá)式寫法,(只是為了方便理解)。
具體如何計(jì)算,大家可以自行檢索相關(guān)資料,在這里我簡(jiǎn)單說下計(jì)算規(guī)則。
比如一個(gè)ip 1.1.1.1,他的二進(jìn)制如下:
00000001 00000001 00000001 00000001
下面是子網(wǎng)掩碼
255.255.255.0
他的二進(jìn)制為
11111111 11111111 11111111 00000000
通過IP地址的二進(jìn)制格式與子網(wǎng)掩碼的二進(jìn)制格式進(jìn)行and運(yùn)算,相等,說明處于同一個(gè)子網(wǎng),可以直接通信。
如果這句話還不明白,可以這么理解:根據(jù)子網(wǎng)掩碼從左到右,當(dāng)?shù)扔?的時(shí)候,表示ip對(duì)應(yīng)的位置不可變,等于0的時(shí)候,代表可變1或者0,因此通過上面的計(jì)算ip段為
00000001 00000001 00000001 00000000
00000001 00000001 00000001 11111111
轉(zhuǎn)換為十進(jìn)制
1.1.1.0
1.1.1.255
這種情況下其中0是網(wǎng)絡(luò)地址,255為廣播地址,因此實(shí)際可用ip為1.1.1.1-1.1.1.254。
那么接下來我打算將147.20.0.0-147.20.255.255ip段指向網(wǎng)卡eth2,因此我需要設(shè)置ip 146.20.0.0的子網(wǎng)掩碼為255.255.0.0,于是執(zhí)行以下命令
#首先要?jiǎng)h除原來網(wǎng)卡自動(dòng)配置的路由表配置,具體可搜索route del用法
sudo route del -net 0.0.0.0 gw 146.1.224.1
#接著增加新的路由表配置
sudo route add -net 146.15.0.0/16 gw 146.1.224.1
#gw 是gateway網(wǎng)關(guān)的意思,可通過網(wǎng)卡屬性查看網(wǎng)關(guān)地址。
在這里使用了146.20.0.0/16的形式,這是子網(wǎng)掩碼的另一種表達(dá)方式:CIDR;
CIDR(Classless Inter-Domain Routing,無類域間路由選擇)它消除了傳統(tǒng)的A類、B類和C類地址以及劃分子網(wǎng)的概念,因而可以更加有效地分配IPv4的地址空間。它可以將好幾個(gè)IP網(wǎng)絡(luò)結(jié)合在一起,使用一種無類別的域際路由選擇算法,使它們合并成一條路由從而較少路由表中的路由條目減輕Internet路由器的負(fù)擔(dān)。
通俗來說就是子網(wǎng)掩碼的另一種形式,但是這種形式更加有效劃分網(wǎng)絡(luò)地址??梢栽?https://ip.liangwei.cc/network.html 這個(gè)網(wǎng)站計(jì)算CIDR值。文章來源:http://www.zghlxwxcb.cn/news/detail-401980.html
到此設(shè)置完路由表,打開程序?qū)崪y(cè)云桌面、外部網(wǎng)絡(luò)同時(shí)可用。
現(xiàn)在想來這些其實(shí)是大學(xué)期間計(jì)算機(jī)網(wǎng)絡(luò)很基礎(chǔ)的知識(shí),如果不是因?yàn)楣ぷ髦杏龅竭@個(gè)問題,估計(jì)我沒有機(jī)會(huì)重拾復(fù)習(xí)。而作為一名軟件研發(fā),不能僅停留來業(yè)務(wù)層面的CURD。文章來源地址http://www.zghlxwxcb.cn/news/detail-401980.html
到了這里,關(guān)于多網(wǎng)卡之指定程序訪問特定網(wǎng)卡的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!