新聞中心
Linux作為目前更流行的操作系統(tǒng)之一,其網(wǎng)絡(luò)路由功能也備受青睞。其中,IP路由就是其中之一。本文將從概念、分類(lèi)、原理等角度來(lái)分別介紹Linux IP路由機(jī)制。

成都創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)、網(wǎng)站重做改版、銅官網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開(kāi)發(fā)、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為銅官等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
一、概念
IP路由是指互聯(lián)網(wǎng)中數(shù)據(jù)包從一個(gè)節(jié)點(diǎn)(計(jì)算機(jī)、路由器等)通過(guò)一個(gè)或多個(gè)中間節(jié)點(diǎn)到達(dá)目標(biāo)節(jié)點(diǎn)的過(guò)程。其主要作用是保證數(shù)據(jù)能夠高效、快速地傳輸。
Linux IP路由機(jī)制是Linux系統(tǒng)中的一種實(shí)現(xiàn)路由的機(jī)制。在Linux系統(tǒng)中,可以通過(guò)配置路由表來(lái)實(shí)現(xiàn)數(shù)據(jù)包的轉(zhuǎn)發(fā)。
二、分類(lèi)
根據(jù)數(shù)據(jù)包的路由信息分類(lèi),可以將IP路由分為兩種:靜態(tài)路由和動(dòng)態(tài)路由。
靜態(tài)路由:靜態(tài)路由是指管理員手動(dòng)配置的路由。管理員需要手動(dòng)添加、刪除、修改路由表中的路由信息。靜態(tài)路由的優(yōu)點(diǎn)是其穩(wěn)定性高、工作原理簡(jiǎn)單。但由于需要手動(dòng)配置,其效率低,不適用于大型企業(yè)或數(shù)據(jù)中心中。
動(dòng)態(tài)路由:動(dòng)態(tài)路由是指路由器通過(guò)協(xié)議自動(dòng)學(xué)習(xí)、交換信息,動(dòng)態(tài)地更新路由表的路由。動(dòng)態(tài)路由技術(shù)廣泛應(yīng)用于大型網(wǎng)絡(luò)中。動(dòng)態(tài)路由協(xié)議有多種,包括RIP、OSPF、BGP等。
三、原理
Linux系統(tǒng)中IP路由的實(shí)現(xiàn)主要依賴(lài)于路由表。路由表是Linux系統(tǒng)中IP路由的核心部分之一,主要用于存儲(chǔ)路由器轉(zhuǎn)發(fā)數(shù)據(jù)包的策略。
Linux系統(tǒng)中的路由表主要由四個(gè)部分組成:目標(biāo)IP地址、子網(wǎng)掩碼、下一跳IP地址、路由策略。其中,目標(biāo)IP地址和子網(wǎng)掩碼用于匹配數(shù)據(jù)包的目標(biāo)IP地址,下一跳IP地址用于指示數(shù)據(jù)包的下一個(gè)路由器或目標(biāo)主機(jī)在網(wǎng)絡(luò)中的位置,路由策略則用于指示如何轉(zhuǎn)發(fā)數(shù)據(jù)包。
下一跳IP地址是路由表中的重點(diǎn)內(nèi)容之一。當(dāng)一個(gè)數(shù)據(jù)包到達(dá)路由器時(shí),路由器首先會(huì)根據(jù)路由表中的目標(biāo)IP地址和子網(wǎng)掩碼來(lái)判斷其應(yīng)該往哪里轉(zhuǎn)發(fā)。然后,根據(jù)路由表中的下一跳IP地址來(lái)確定應(yīng)該往哪一臺(tái)路由器或主機(jī)轉(zhuǎn)發(fā)數(shù)據(jù)包。
路由策略是Linux系統(tǒng)中IP路由機(jī)制的另一個(gè)重要組成部分。路由策略可以是一些強(qiáng)制性路由,也可以是一些優(yōu)先級(jí)路由。所謂強(qiáng)制性路由,就是指在數(shù)據(jù)包滿(mǎn)足路由表中的最長(zhǎng)前綴匹配規(guī)則時(shí),強(qiáng)制性地走固定的路徑。而優(yōu)先級(jí)路由則是根據(jù)不同的路由條目設(shè)置不同的優(yōu)先級(jí),數(shù)據(jù)包將按優(yōu)先級(jí)更高的路由條目進(jìn)行轉(zhuǎn)發(fā)。
四、
本文從概念、分類(lèi)、原理等角度介紹了Linux IP路由機(jī)制。路由表作為L(zhǎng)inux IP路由機(jī)制的核心部分之一,其作用是存儲(chǔ)路由器轉(zhuǎn)發(fā)數(shù)據(jù)包的策略。路由表中的目標(biāo)IP地址和子網(wǎng)掩碼、下一跳IP地址、路由策略是其組成部分之一。通過(guò)深入了解Linux IP路由機(jī)制,可以更好地掌握Linux系統(tǒng)的網(wǎng)絡(luò)路由功能,從而更好地維護(hù)和管理網(wǎng)絡(luò)環(huán)境。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
從ip addr add和ifconfig的區(qū)別看linux網(wǎng)卡ip地址的結(jié)構(gòu)
如果你非常理解網(wǎng)絡(luò)協(xié)議的原理以及網(wǎng)絡(luò)的分層架構(gòu)那么我想你就不會(huì)有這個(gè)問(wèn)題,實(shí)際上,每一個(gè)網(wǎng)卡設(shè)備都有一個(gè)mac地址,但是卻可 以有多個(gè)網(wǎng)絡(luò)層地址,比如IP地址,然而這個(gè)事實(shí)無(wú)法很好地像用戶(hù)提供操作接口,所以就引出了ip別名(IP aliases)和輔助ip(secondary IP addresses)的概念。其實(shí)很容易理解簡(jiǎn)凱這個(gè)事實(shí),按照分層的思想,下層總是為上層服務(wù),也就是為上層提供舞臺(tái),上層利用下層的服務(wù),而不必讓下層知 道自己的情況,如果一個(gè)擁有合理mac地址的網(wǎng)卡沒(méi)有配置網(wǎng)絡(luò)層地址(比如IP地址)這件事合理的話(huà),那么為這個(gè)設(shè)備配置多個(gè)IP地址也是合理的,正好像 一個(gè)ip可以對(duì)應(yīng)多個(gè)應(yīng)用層端口一樣,也就是說(shuō),下層對(duì)上層總是一對(duì)多的關(guān)系,在分層架構(gòu)中這種關(guān)系是合理的。下面我們就看一下linux的網(wǎng)卡的ip地 址結(jié)構(gòu)。剛才說(shuō)了在linux中,一個(gè)網(wǎng)卡可以有多個(gè)IP,那么這多個(gè)ip有什么關(guān)系呢?其實(shí)這些ip組成了一個(gè)吊鏈結(jié)構(gòu),所謂吊鏈結(jié)構(gòu)就是一些節(jié)點(diǎn)鏈接 成一條鏈,然后每個(gè)棚兆節(jié)點(diǎn)帶有自己的一條鏈
每個(gè)節(jié)點(diǎn)代表的ip地址標(biāo)識(shí)一個(gè)網(wǎng)段,這個(gè)節(jié)點(diǎn)的ip就是這個(gè)網(wǎng)段的 Primary地址,它下面所帶的ip就是這個(gè)網(wǎng)段的Secondary地址,也就是說(shuō)一個(gè)網(wǎng)卡可以帶有各個(gè)節(jié)點(diǎn)所帶鏈表長(zhǎng)度之和個(gè)ip地址,而且這些 ip不是線(xiàn)形的,而是上述的吊鏈結(jié)構(gòu)。我們看一下這么做有什么好處。玩過(guò)Cisco路由器的朋友可能都知道有個(gè)Secondary IP的概念,這個(gè)特性可以創(chuàng)建邏輯子網(wǎng),也就是說(shuō)在一個(gè)物理網(wǎng)口上連接兩個(gè)子網(wǎng),這咋看起來(lái)好像不可思議,其實(shí)很簡(jiǎn)單,比如這個(gè)網(wǎng)口接到一臺(tái)交換機(jī)上,如 果這個(gè)網(wǎng)口沒(méi)有配置Secondary IP的話(huà),那么這臺(tái)交換機(jī)只能連接一個(gè)網(wǎng)段的主機(jī),比如192.168.1.1/24,但是,如果它鏈咐租配置了Secondary IP,那么就可以連接兩個(gè)網(wǎng)段的主機(jī),比如192.168.1.1/24和10.0.0.1/24,道理就是這么簡(jiǎn)單,但是卻很有用,該機(jī)制可以被路由匯 總策略所使用。注意上面這個(gè)例子中的Secondary IP不是這里說(shuō)的linux的Secondary address,在linux中恰恰相反,只要一個(gè)網(wǎng)卡上配置的ip不是一個(gè)網(wǎng)段的,那么都是Primary IP,就是吊鏈結(jié)構(gòu)中上面的那條主鏈中的IP,linux中的Secondary address是主鏈結(jié)點(diǎn)的子鏈結(jié)點(diǎn)中的IP,這一點(diǎn)一定注意,概念是不能混淆的。前面說(shuō)的只是吊鏈中主鏈的作用,那么子鏈呢?其實(shí)想象一下也很簡(jiǎn)單,比 如一臺(tái)機(jī)器上運(yùn)行著一個(gè)代理服務(wù)器或者負(fù)載均衡服務(wù),代理服務(wù)器或者負(fù)載均衡服務(wù)和主服務(wù)器要監(jiān)聽(tīng)相同的端口,那么就可以用secondary address來(lái)解決了,只要需要在同一網(wǎng)段監(jiān)聽(tīng)同一個(gè)端口的應(yīng)用都是吊鏈中子鏈存在的原因,因此可以說(shuō),主鏈對(duì)外部或者說(shuō)對(duì)下面鏈路層虛擬了多塊網(wǎng)卡, 而子鏈向上層虛擬了多臺(tái)機(jī)器,配置了吊鏈結(jié)構(gòu)的linux主機(jī)如果說(shuō)只有一塊網(wǎng)卡,那么外部會(huì)認(rèn)為它有多塊網(wǎng)卡,對(duì)于內(nèi)部,應(yīng)用層會(huì)認(rèn)為彼此在不同的主機(jī) 上,這就是效果。
除了上面大體的介紹之外,還有很多細(xì)節(jié),吊鏈在主鏈上是沒(méi)有主次的,子鏈除了之一個(gè)節(jié)點(diǎn)其它節(jié)點(diǎn)也不分主次,都是平行的關(guān)系,但是子鏈中的之一個(gè)節(jié)點(diǎn)總是 鏈接在主鏈中,它們攜帶的地址就是primary地址,它們下面隸屬的子鏈攜帶的地址就是這個(gè)primary地址的secondary地址,如此看來(lái),一 旦主鏈上一個(gè)節(jié)點(diǎn)被刪除了,那么它的子鏈也將不復(fù)存在,所謂皮之不存毛將焉附。但是這種策略總是顯得不是那么優(yōu)美,因?yàn)楦赣H犯錯(cuò),兒子也要受連累,這在現(xiàn) 代社會(huì)早就不時(shí)行了,那么就需要改變機(jī)制了,因此linux中特意有了一個(gè)選項(xiàng),就是當(dāng)一個(gè)primary地址被刪除時(shí),如果它有secondary地址 的話(huà),那么它的之一個(gè)secondary地址(長(zhǎng)子)繼承被刪除的primary地址的位置成為primary地址,這樣就顯得很合理了,要不然在刪除 primary地址的時(shí)候,如果有程序用secondary地址,那么要么延遲刪除,要么程序崩潰,采用自動(dòng)提升策略的話(huà)就不會(huì)出現(xiàn)問(wèn)題。
至于說(shuō)IP aliases,那是以前版本有的了,就是一個(gè)實(shí)現(xiàn)問(wèn)題,解決的問(wèn)題和現(xiàn)在的secondary IP機(jī)制一樣,它主要就是在物理網(wǎng)卡名字后面加上后綴從而成為虛擬網(wǎng)絡(luò)接口,本質(zhì)上和secondary IP機(jī)制沒(méi)有區(qū)別,區(qū)別就是IP aliases顯得不是那么直觀,而secondary IP卻是真正讓?xiě)?yīng)用看到了一個(gè)網(wǎng)卡的多個(gè)地址,比如你要是用IP aliases的話(huà),有的時(shí)候你總是會(huì)問(wèn)eth0:0是什么?我就曾經(jīng)在內(nèi)核里面拼命找eth0:0這個(gè)網(wǎng)絡(luò)設(shè)備的注冊(cè)代碼,都要瘋掉了也沒(méi)有找到,其實(shí) 我并不是很傻,但是我卻因?yàn)槟莻€(gè)該死的名字作出了傻事。
下面就可以看看linux內(nèi)核的實(shí)現(xiàn)代碼了,首先弄明白一些數(shù)據(jù)結(jié)構(gòu),最重要的就是net_device,其次就是in_device,然后就是in_ifaddr,明白了這三個(gè)數(shù)據(jù)結(jié)構(gòu),一切就明白了,這是真的。
struct net_device
{
…
void *ip_ptr;//指向一個(gè)in_device結(jié)構(gòu),這字段從net_device中分離表明一個(gè)網(wǎng)卡可以支持多種網(wǎng)絡(luò)層協(xié)議的
…
}
struct in_device
{
struct net_device*dev;//指向它隸屬的net_device,也就是網(wǎng)卡
atomic_t refcnt;//引用計(jì)數(shù)
intdead;
struct in_ifaddr*ifa_list; //所有的ip地址鏈表
…
};
struct in_ifaddr //代表一個(gè)ip地址
{
struct in_ifaddr*ifa_next;//上面的in_device中的ifa_list字段就是靠這個(gè)字段連成鏈的
struct in_device*ifa_dev;//回指in_device結(jié)構(gòu)
struct rcu_headrcu_head;
uifa_local;//ip地址
uifa_address;
uifa_mask;//掩碼
uifa_broadcast; //廣播地址
uifa_anycast;
unsigned charifa_scope;
unsigned charifa_flags;//只有IFA_F_SECONDARY標(biāo)志,因?yàn)槌诉@個(gè)就是primary地址了
unsigned charifa_prefixlen;
char ifa_label; //名字,在ip aliases時(shí)代,它就可能是ethx:y的形式,在secondary ip時(shí)代,它統(tǒng)一就是ethx
};
注 意,上面的結(jié)構(gòu)并沒(méi)有將linux網(wǎng)卡的ip地址結(jié)構(gòu)表示為吊鏈結(jié)構(gòu),所謂的吊鏈結(jié)構(gòu)只是邏輯上的,在數(shù)據(jù)結(jié)構(gòu)上,一個(gè)網(wǎng)卡所有的ip地址全部都在 ifa_list中被鏈接成一個(gè)線(xiàn)性的鏈表,至于是primary地址還是secondary地址就看in_ifaddr的ifa_flags字段了。每 當(dāng)有新的地址被設(shè)置的時(shí)候,inet_insert_ifa總是被調(diào)用,linux為何沒(méi)有在代碼上將ip地址表示為吊鏈結(jié)構(gòu)呢?我也不知道,個(gè)人感覺(jué)一 個(gè)net_device帶有一個(gè)primary ip鏈表,然后每個(gè)primary ip節(jié)點(diǎn)帶有一個(gè)secondary ip鏈表,這樣會(huì)更好一些的,我覺(jué)得inet_insert_ifa實(shí)現(xiàn)的十分拙劣。添加地址可以通過(guò)兩個(gè)用戶(hù)空間程序搞定,一個(gè)是ifconfig,另 一個(gè)是ip addr add,ifconfig是基于ioctl進(jìn)行地址添加的,而ip程序是基于netlink進(jìn)行地址添加的,不管哪一種方式都可以達(dá)到目的,現(xiàn)在就可以看 看另一個(gè)問(wèn)題了:為何用ip addr add添加的ip地址用ifconfig看不到,而ifconfig設(shè)置的地址ip addr show卻是可以看到。這個(gè)問(wèn)題通過(guò)看代碼一眼就可以明白,在ifconfig獲得ip地址的時(shí)候,代碼:
for (ifap = &in_dev->ifa_list; (ifa = *ifap) != NULL; ifap = &ifa->ifa_next)
{
if (!strcmp(ifr.ifr_name, ifa->ifa_label) && sin_orig.sin_addr.s_addr == ifa->ifa_address)
{
break;
}
}
取 的是這個(gè)被找到的ifa的ip地址,而我們知道,所有的ifa鏈接成一個(gè)線(xiàn)性鏈表,那么找到了之一個(gè)就不會(huì)再往后走了,因此只能得到一個(gè)結(jié)果,就是鏈表最 前面的那個(gè),而ip add show就不同了,具體在函數(shù)inet_dump_ifaddr中實(shí)現(xiàn),該函數(shù)遍歷所有的ifa,并且傳到用戶(hù)空間緩沖區(qū)。這里可以做一個(gè)實(shí)驗(yàn):首先用 ip addr add添加幾個(gè)不在同一個(gè)網(wǎng)段的primary ip地址,然后再ifconfig一個(gè)和前面的ip都不在一個(gè)網(wǎng)段的ip,然后可以用ifconfig查看一下,發(fā)現(xiàn)不是剛剛用ifconfig設(shè)置進(jìn)去 的那個(gè)ip,而是用ip addr add添加進(jìn)去的,這就說(shuō)明ifconfig永遠(yuǎn)都是取的ifa鏈表最前面的那一個(gè),還有一點(diǎn)要注意,就是如果你用ip addr add添加了很多的secondary ip地址,那么恰好你用ifconfig設(shè)置的ip地址和那些secondary ip在一個(gè)網(wǎng)段,那么所有的secondary ip都將被刪除,這些都是sencondary ip的規(guī)范決定的,而且在代碼中也有體現(xiàn)。另外還要注意,路由表的表項(xiàng)都是基于primary ip的,因?yàn)樗械牟僮鞫际且詐rimary ip為主的,比如在添加路由的時(shí)候:
void fib_add_ifaddr(struct in_ifaddr *ifa)
{
struct in_device *in_dev = ifa->ifa_dev;
struct net_device *dev = in_dev->dev;
struct in_ifaddr *prim = ifa;
…
if (ifa->ifa_flags&IFA_F_SECONDARY) { //如果ifa是個(gè)sencondary地址,那么就找到它隸屬的primary地址后然后以這個(gè)primary為主進(jìn)行設(shè)置
prim = inet_ifa_byprefix(in_dev, prefix, mask);
if (prim == NULL) {
printk(KERN_DEBUG “fib_add_ifaddr: bug: prim == NULL/n”);
return;
}
}
fib_magic(RTM_NEWROUTE, RTN_LOCAL, addr, 32, prim); //添加進(jìn)路由表
…
}
到 此為止我們知道了不少東西,最重要的就是linux中網(wǎng)卡ip地址的吊鏈結(jié)構(gòu)以及這么設(shè)計(jì)的好處,另外就是設(shè)置ip地址的方式有ioctl和 netlink。其實(shí)網(wǎng)卡擁有多個(gè)ip并不會(huì)帶來(lái)什么沖突,本質(zhì)上ip和網(wǎng)卡沒(méi)有什么關(guān)系,它們唯一的關(guān)系就是靠網(wǎng)絡(luò)分層模型聯(lián)系在一起的,細(xì)節(jié)上就是靠 路由聯(lián)系在一起的,比如我添加路由的時(shí)候指定了一個(gè)目的地址和下一跳ip地址以及一個(gè)網(wǎng)卡出口,那么內(nèi)核會(huì)根據(jù)提供的目的地址將路由插在合式的位置,然后 將nh的網(wǎng)絡(luò)設(shè)備設(shè)置為你提供的網(wǎng)卡出口,等到傳輸數(shù)據(jù)的時(shí)候就會(huì)查找路由從而找到出口,就是這么簡(jiǎn)單,你自己手動(dòng)設(shè)置的路由可以隨意設(shè)置,即使完全錯(cuò)誤 內(nèi)核也會(huì)將之加入路由表的,還有一種路由是內(nèi)核自動(dòng)生成的,就是在網(wǎng)卡剛剛up的時(shí)候,這時(shí)通過(guò)網(wǎng)卡的net_device找到其in_device然后 找到其ip地址,這樣的路由稱(chēng)為鏈路路由。
通過(guò)secondary IP機(jī)制,你可以認(rèn)為你的機(jī)器有很多網(wǎng)卡,對(duì)于應(yīng)用,監(jiān)聽(tīng)同一端口的應(yīng)用會(huì)認(rèn)為它們?cè)诰钟蚓W(wǎng)中不同的機(jī)器上,你可以隨意使用這些ip地址而不會(huì)發(fā)生混亂,路由和底層的arp會(huì)處理好這一切,當(dāng)然前提是你將路由設(shè)置對(duì)。
附: 用戶(hù)空間有ifup/ifdown,/in/ip,ifconfig,還有netplugd守護(hù)進(jìn)程,這些有何關(guān)系嗎?這中間ip程序是最基本的,沒(méi) 有任何策略,策略就是參數(shù)指定,要么就是別的程序調(diào)用它,而netplugd就是一個(gè)監(jiān)控守護(hù)進(jìn)程,通過(guò)netlink監(jiān)控網(wǎng)卡狀態(tài),然后根據(jù)不同的監(jiān)控 結(jié)果調(diào)用/etc/netplug.d/netplug腳本,進(jìn)而可能調(diào)用ifup/ifdown腳本,而后者就是腳本,其中會(huì)調(diào)用ifup-eth腳 本,最終整理好參數(shù)后調(diào)用ip程序(典型的就是:ip link set eth0 up/down),當(dāng)然ip程序完全可以自己調(diào)用,比如ip addr add以及ip route add等等,而ifconfig沒(méi)有那么繞圈子,就是通過(guò)ioctl進(jìn)行設(shè)置,可以通過(guò)strace來(lái)觀察。這其中奧妙大了去了,說(shuō)白了就是策略和機(jī)制分 離,另外還體現(xiàn)出linux中的很多功能都是很小的程序組合而成的。
linux ip 路由機(jī)制的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux ip 路由機(jī)制,淺談Linux IP路由機(jī)制,從ip addr add和ifconfig的區(qū)別看linux網(wǎng)卡ip地址的結(jié)構(gòu)的信息別忘了在本站進(jìn)行查找喔。
四川成都云服務(wù)器租用托管【創(chuàng)新互聯(lián)】提供各地服務(wù)器租用,電信服務(wù)器托管、移動(dòng)服務(wù)器托管、聯(lián)通服務(wù)器托管,云服務(wù)器虛擬主機(jī)租用。成都機(jī)房托管咨詢(xún):13518219792
創(chuàng)新互聯(lián)(www.cdcxhl.com)擁有10多年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)、開(kāi)啟建站+互聯(lián)網(wǎng)銷(xiāo)售服務(wù),與企業(yè)客戶(hù)共同成長(zhǎng),共創(chuàng)價(jià)值。
當(dāng)前名稱(chēng):淺談LinuxIP路由機(jī)制(linuxip路由機(jī)制)
網(wǎng)站地址:http://fisionsoft.com.cn/article/djspcse.html


咨詢(xún)
建站咨詢(xún)
