㈠ vue實現路由跳轉的原理是什麼,是調用js底層什麼方法
前端路由是直接找到與地址匹配的一個組件或對象並將其渲染出來。改變瀏覽器地址而不向伺服器發出請求有兩種方式:
1. 在地址中加入#以欺騙瀏覽器,地址的改變是由於正在進行頁內導航
2. 使用H5的window.history功能,使用URL的Hash來模擬一個完整的URL。
當打包構建應用時,Javascript 包會變得非常大,影響頁面載入。如果我們能把不同路由對應的組件分割成不同的代碼塊,然後當路由被訪問的時候才載入對應組件,這樣就更加高效了。
目錄結構
先來看看整體的目錄結構
和流程相關的主要需要關注點的就是 components、history 目錄以及 create-matcher.js、create-route-map.js、index.js、install.js。下面就從 basic 應用入口開始來分析 vue-router 的整個流程。
import Vue from 'vue'
import VueRouter from 'vue-router'
// 1. 插件
// 安裝 <router-view> and <router-link> 組件
// 且給當前應用下所有的組件都注入 $router and $route 對象
Vue.use(VueRouter)
// 2. 定義各個路由下使用的組件,簡稱路由組件
const Home = { template: '<div>home</div>' }
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
// 3. 創建 VueRouter 實例 router
const router = new VueRouter({
mode: 'history',
base: __dirname,
routes: [
{ path: '/', component: Home },
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
})
// 4. 創建 啟動應用
// 一定要確認注入了 router
// 在 <router-view> 中將會渲染路由組件
new Vue({
router,
template: ` <div id="app">
<h1>Basic</h1>
<ul>
<li><router-link to="/">/</router-link></li>
<li><router-link to="/foo">/foo</router-link></li>
<li><router-link to="/bar">/bar</router-link></li>
<router-link tag="li" to="/bar">/bar</router-link>
</ul>
<router-view class="view"></router-view>
</div>
`
}).$mount('#app')04142
作為插件
上邊代碼中關鍵的第 1 步,利用 Vue.js 提供的插件機制 .use(plugin) 來安裝 VueRouter,而這個插件機制則會調用該 plugin 對象的 install 方法(當然如果該 plugin 沒有該方法的話會把 plugin 自身作為函數來調用);下邊來看下 vue-router 這個插件具體的實現部分。
VueRouter 對象是在 src/index.js 中暴露出來的,這個對象有一個靜態的 install 方法:
/* @flow */
// 導入 install 模塊
import { install } from './install'// ...import { inBrowser, supportsHistory } from './util/dom'// ...export default class VueRouter {
// ...}
// 賦值 install
VueRouter.install = install
// 自動使用插件if (inBrowser && window.Vue) {
window.Vue.use(VueRouter)
}123456789101112131415161718
可以看到這是一個 Vue.js 插件的經典寫法,給插件對象增加 install 方法用來安裝插件具體邏輯,同時在最後判斷下如果是在瀏覽器環境且存在 window.Vue 的話就會自動使用插件。
install 在這里是一個單獨的模塊,繼續來看同級下的 src/install.js 的主要邏輯:
// router-view router-link 組件import View from './components/view'import Link from './components/link'// export 一個 Vue 引用export let _Vue// 安裝函數export function install (Vue) {
if (install.installed) return
install.installed = true
// 賦值私有 Vue 引用
_Vue = Vue // 注入 $router $route
Object.defineProperty(Vue.prototype, '$router', {
get () { return this.$root._router }
}) Object.defineProperty(Vue.prototype, '$route', {
get () { return this.$root._route }
}) // beforeCreate mixin
Vue.mixin({
beforeCreate () { // 判斷是否有 router
if (this.$options.router) { // 賦值 _router
this._router = this.$options.router // 初始化 init
this._router.init(this) // 定義響應式的 _route 對象
Vue.util.defineReactive(this, '_route', this._router.history.current)
}
}
}) // 注冊組件
Vue.component('router-view', View)
Vue.component('router-link', Link)// ...}0414243
這里就會有一些疑問了?
· 為啥要 export 一個 Vue 引用?
插件在打包的時候是肯定不希望把 vue 作為一個依賴包打進去的,但是呢又希望使用 Vue 對象本身的一些方法,此時就可以採用上邊類似的做法,在 install 的時候把這個變數賦值 Vue ,這樣就可以在其他地方使用 Vue 的一些方法而不必引入 vue 依賴包(前提是保證 install 後才會使用)。
· 通過給 Vue.prototype 定義 $router、$route 屬性就可以把他們注入到所有組件中嗎?
在 Vue.js 中所有的組件都是被擴展的 Vue 實例,也就意味著所有的組件都可以訪問到這個實例原型上定義的屬性。
beforeCreate mixin 這個在後邊創建 Vue 實例的時候再細說。
實例化 VueRouter
在入口文件中,首先要實例化一個 VueRouter ,然後將其傳入 Vue 實例的 options 中。現在繼續來看在 src/index.js 中暴露出來的 VueRouter 類:
// ...import { createMatcher } from './create-matcher'// ...export default class VueRouter {
// ...
constructor (options: RouterOptions = {}) {
this.app = null
this.options = options
this.beforeHooks = []
this.afterHooks = []
// 創建 match 匹配函數
this.match = createMatcher(options.routes || [])
// 根據 mode 實例化具體的 History
let mode = options.mode || 'hash'
this.fallback = mode === 'history' && !supportsHistory if (this.fallback) {
mode = 'hash'
} if (!inBrowser) {
mode = 'abstract'
}
this.mode = mode switch (mode) {
case 'history':
this.history = new HTML5History(this, options.base) break
case 'hash':
this.history = new HashHistory(this, options.base, this.fallback) break
case 'abstract':
this.history = new AbstractHistory(this) break
default:
assert(false, `invalid mode: ${mode}`)
}
}
// ...}
里邊包含了重要的一步:創建 match 匹配函數。
match 匹配函數
匹配函數是由 src/create-matcher.js 中的 createMatcher 創建的:
/* @flow */
import Regexp from 'path-to-regexp'// ...import { createRouteMap } from './create-route-map'// ...export function createMatcher (routes: Array<RouteConfig>): Matcher {
// 創建路由 map
const { pathMap, nameMap } = createRouteMap(routes)
// 匹配函數 function match (
raw: RawLocation,
currentRoute?: Route,
redirectedFrom?: Location
): Route {
// ...
} function redirect (
record: RouteRecord,
location: Location
): Route {
// ...
} function alias (
record: RouteRecord,
location: Location,
matchAs: string
): Route {
// ...
} function _createRoute (
record: ?RouteRecord,
location: Location,
redirectedFrom?: Location
): Route { if (record && record.redirect) { return redirect(record, redirectedFrom || location)
} if (record && record.matchAs) { return alias(record, location, record.matchAs)
} return createRoute(record, location, redirectedFrom)
}
// 返回 return match
}
// ...04142434445464748495051
具體邏輯後續再具體分析,現在只需要理解為根據傳入的 routes 配置生成對應的路由 map,然後直接返回了 match 匹配函數。
繼續來看 src/create-route-map.js 中的 createRouteMap 函數:
/* @flow */import { assert, warn } from './util/warn'import { cleanPath } from './util/path'// 創建路由 mapexport function createRouteMap (routes: Array<RouteConfig>): {
pathMap: Dictionary<RouteRecord>,
nameMap: Dictionary<RouteRecord>
} { // path 路由 map
const pathMap: Dictionary<RouteRecord> = Object.create(null) // name 路由 map
const nameMap: Dictionary<RouteRecord> = Object.create(null) // 遍歷路由配置對象 增加 路由記錄
routes.forEach(route => {
addRouteRecord(pathMap, nameMap, route)
}) return {
pathMap,
nameMap
}
}// 增加 路由記錄 函數function addRouteRecord (
pathMap: Dictionary<RouteRecord>,
nameMap: Dictionary<RouteRecord>,
route: RouteConfig,
parent?: RouteRecord,
matchAs?: string
) {
// 獲取 path 、name
const { path, name } = route
assert(path != null, `"path" is required in a route configuration.`) // 路由記錄 對象
const record: RouteRecord = {
path: normalizePath(path, parent),
components: route.components || { default: route.component },
instances: {},
name, parent,
matchAs,
redirect: route.redirect,
beforeEnter: route.beforeEnter,
meta: route.meta || {}
} // 嵌套子路由 則遞歸增加 記錄
if (route.children) {// ...
route.children.forEach(child => {
addRouteRecord(pathMap, nameMap, child, record)
})
} // 處理別名 alias 邏輯 增加對應的 記錄
if (route.alias !== undefined) { if (Array.isArray(route.alias)) {
route.alias.forEach(alias => {
addRouteRecord(pathMap, nameMap, { path: alias }, parent, record.path)
})
} else {
addRouteRecord(pathMap, nameMap, { path: route.alias }, parent, record.path)
}
} // 更新 path map
pathMap[record.path] = record // 更新 name map
if (name) { if (!nameMap[name]) {
nameMap[name] = record
} else {
warn(false, `Duplicate named routes definition: { name: "${name}", path: "${record.path}" }`)
}
}
}function normalizePath (path: string, parent?: RouteRecord): string {
path = path.replace(/\/$/, '') if (path[0] === '/') return path if (parent == null) return path return cleanPath(`${parent.path}/${path}`)
}57677787980818283
可以看出主要做的事情就是根據用戶路由配置對象生成普通的根據 path 來對應的路由記錄以及根據 name 來對應的路由記錄的 map,方便後續匹配對應。
實例化 History
這也是很重要的一步,所有的 History 類都是在 src/history/ 目錄下,現在呢不需要關心具體的每種 History 的具體實現上差異,只需要知道他們都是繼承自 src/history/base.js 中的 History 類的:
/* @flow */// ...import { inBrowser } from '../util/dom'import { runQueue } from '../util/async'import { START, isSameRoute } from '../util/route'// 這里從之前分析過的 install.js 中 export _Vueimport { _Vue } from '../install'export class History {// ...
constructor (router: VueRouter, base: ?string) { this.router = router this.base = normalizeBase(base) // start with a route object that stands for "nowhere"
this.current = START this.pending = null
}// ...}// 得到 base 值function normalizeBase (base: ?string): string { if (!base) { if (inBrowser) { // respect <base> tag
const baseEl = document.querySelector('base') base = baseEl ? baseEl.getAttribute('href') : '/'
} else { base = '/'
}
} // make sure there's the starting slash
if (base.charAt(0) !== '/') { base = '/' + base
㈡ 路由的作用和工作原理
路由器工作原理
傳統地,路由器工作於OSI七層協議中的第三層,其主要任務是接收來自一個網路介面的數據包,根據其中所含的目的地址,決定轉發到下一個目的地址。因此,路由器首先得在轉發路由表中查找它的目的地址,若找到了目的地址,就在數據包的幀格前添加下一個MAC地址,同時IP數據包頭的TTL(Time To Live)域也開始減數,並重新計算校驗和。當數據包被送到輸出埠時,它需要按順序等待,以便被傳送到輸出鏈路上。
路由器在工作時能夠按照某種路由通信協議查找設備中的路由表。如果到某一特定節點有一條以上的路徑,則基本預先確定的路由准則是選擇最優(或最經濟)的傳輸路徑。由於各種網路段和其相互連接情況可能會因環境變化而變化,因此路由情況的信息一般也按所使用的路由信息協議的規定而定時更新。
網路中,每個路由器的基本功能都是按照一定的規則來動態地更新它所保持的路由表,以便保持路由信息的有效性。為了便於在網路間傳送報文,路由器總是先按照預定的規則把較大的數據分解成適當大小的數據包,再將這些數據包分別通過相同或不同路徑發送出去。當這些數據包按先後秩序到達目的地後,再把分解的數據包按照一定順序包裝成原有的報文形式。路由器的分層定址功能是路由器的重要功能之一,該功能可以幫助具有很多節點站的網路來存儲定址信息,同時還能在網路間截獲發送到遠地網段的報文,起轉發作用;選擇最合理的路由,引導通信也是路由器基本功能;多協議路由器還可以連接使用不同通信協議的網路段,成為不同通信協議網路段之間的通信平台。
一般來說,路由器的主要工作是對數據包進行存儲轉發,具體過程如下:
第一步:當數據包到達路由器,根據網路物理介面的類型,路由器調用相應的鏈路層功能模塊,以解釋處理此數據包的鏈路層協議報頭。這一步處理比較簡單,主要是對數據的完整性進行驗證,如CRC校驗、幀長度檢查等。
第二步:在鏈路層完成對數據幀的完整性驗證後,路由器開始處理此數據幀的IP層。這一過程是路由器功能的核心。根據數據幀中IP包頭的目的IP地址,路由器在路由表中查找下一跳的IP地址;同時,IP數據包頭的TTL(Time To Live)域開始減數,並重新計算校驗和(Checksum)。
第三步:根據路由表中所查到的下一跳IP地址,將IP數據包送往相應的輸出鏈路層,被封裝上相應的鏈路層包頭,最後經輸出網路物理介面發送出去。
簡單地說,路由器的主要工作就是為經過路由器的每個數據包尋找一條最佳傳輸路徑,並將該數據包有效地傳送到目的站點。由此可見,選擇最佳路徑策略或叫選擇最佳路由演算法是路由器的關鍵所在。為了完成這項工作,在路由器中保存著各種傳輸路徑的相關數據——路由表(Routing Table),供路由選擇時使用。上述過程描述了路由器的主要而且關鍵的工作過程,但沒有說明其它附加性能,例如訪問控制、網路地址轉換、排隊優先順序等。
㈢ 路由器的工作原理詳細解析
我們知道路由器是用來連接不同網段或網路的,在一個區域網中,如果不需與外界網路進行通信的話,內部網路的各工作站都能識別其它各節點,完全可以通過交換機就可以實現目的發送,根本用不上路由器來記憶區域網的各節點MAC地址。路由器識別不同網路的方法是通過識別不同網路的網路ID號進行的,所以為了保證路由成功,每個網路都必須有一個唯一的網路編號。路由器要識別另一個網路,首先要識別的就是對方網路的路由器IP地址的網路ID,看是不是與目的節點地址中的網路ID號相一致。如果是當然就向這個網路的路由器發送了,接收網路的路由器在接收到源網路發來的報文後,根據報文中所包括的目的節點IP地址中的主機ID號來識別是發給哪一個節點的,然後再直接發送。
為了更清楚地說明路由器的工作原理,現在我們假設有這樣一個簡單的網路。假設其中一個網段網路ID號為"A",在同一網段中有4台終端設備連接在一起,這個網段的每個設備的IP地址分別假設為:A1、A2、A3和A4。連接在這個網段上的一台路由器是用來連接其它網段的,路由器連接於A網段的那個埠IP地址為A5。同樣路由器連接另一網段為B網段,這個網段的網路ID號為"B",那連接在B網段的另幾台工作站設備設的IP地址我們設為:B1、B2、B3、B4,同樣連接與B網段的路由器埠的IP地址我們設為B5,結構如圖1所示。
圖1
在這樣一個簡單的網路中同時存在著兩個不同的網段,現如果A網段中的A1用戶想發送一個數據給B網段的B2用戶,有了路由器就非常簡單了。
首先A1用戶把所發送的數據及發送報文准備好,以數據幀的形式通過集線器或交換機廣播發給同一網段的所有節點(集線器都是採取廣播方式,而交換機因為不能識別這個地址,也採取廣播方式),路由器在偵聽到A1發送的數據幀後,分析目的節點的IP地址信息(路由器在得到數據包後總是要先進行分析)。得知不是本網段的,就把數據幀接收下來,進一步根據其路由表分析得知接收節點的網路ID號與B5埠的網路ID號相同,這時路由器的A5埠就直接把數據幀發給路由器B5埠。B5埠再根據數據幀中的目的節點IP地址信息中的主機ID號來確定最終目的節點為B2,然後再發送數據到節點B2。這樣一個完整的數據幀的路由轉發過程就完成了,數據也正確、順利地到達目的節點。
當然實際上像以上這樣的網路算是非常簡單的,路由器的功能還不能從根本上體現出來,一般一個網路都會同時連接其它多個網段或網路,就像圖2所示的一樣,A、B、C、D四個網路通過路由器連接在一起。
㈣ 前端路由和後台路由有什麼區別
區別在於express是伺服器端的路由,也就是說需要向後台伺服器發送請求,然後伺服器來決定來render那個.html,這也就是最早的mvc架構模式,而前端的路由是將這一過程放在瀏覽器端,也就是前台寫js代碼控制,不在請求伺服器,前台一般利用histroy和hash來控制,達到不刷新頁面可以使顯示內容發生變化,這樣好處是js代碼不發生變化(瀏覽器端可以維護一個穩定的model);一般單頁應用就是前台來控制路由,這樣速度更快,用戶體驗更好。單頁應用還將模板拿到了瀏覽器端,從而解放了服務端,服務端趨於服務化。
㈤ 路由工作原理是什麼
路由器原理及路由協議
來源:中國電信網站
本文通過闡述TCP/IP網路中路由器的基本工作原理,介紹了IP路由器的幾大功能,給出了靜態路由協議和動態路由協議,以及內部網關協議和外部網關協議的概念,同時簡要介紹了目前最常見的RIP、OSPF、BGP和BGP-4這幾種路由協議,然後描述了路由演算法的設計目標和種類,著重介紹了鏈路狀態法和距離向量法。在文章的最後,扼要講述了新一代路由器的特徵。
——近十年來,隨著計算機網路規模的不斷擴大,大型互聯網路(如Internet)的迅猛發展,路由技術在網路技術中已逐漸成為關鍵部分,路由器也隨之成為最重要的網路設備。用戶的需求推動著路由技術的發展和路由器的普及,人們已經不滿足於僅在本地網路上共享信息,而希望最大限度地利用全球各個地區、各種類型的網路資源。而在目前的情況下,任何一個有一定規模的計算機網路(如企業網、校園網、智能大廈等),無論採用的是快速以大網技術、FDDI技術,還是ATM技術,都離不開路由器,否則就無法正常運作和管理。
1 網路互連
——把自己的網路同其它的網路互連起來,從網路中獲取更多的信息和向網路發布自己的消息,是網路互連的最主要的動力。網路的互連有多種方式,其中使用最多的是網橋互連和路由器互連。
1.1 網橋互連的網路
——網橋工作在OSI模型中的第二層,即鏈路層。完成數據幀(frame)的轉發,主要目的是在連接的網路間提供透明的通信。網橋的轉發是依據數據幀中的源地址和目的地址來判斷一個幀是否應轉發和轉發到哪個埠。幀中的地址稱為「MAC」地址或「硬體」地址,一般就是網卡所帶的地址。
——網橋的作用是把兩個或多個網路互連起來,提供透明的通信。網路上的設備看不到網橋的存在,設備之間的通信就如同在一個網上一樣方便。由於網橋是在數據幀上進行轉發的,因此只能連接相同或相似的網路(相同或相似結構的數據幀),如乙太網之間、乙太網與令牌環(token ring)之間的互連,對於不同類型的網路(數據幀結構不同),如乙太網與X.25之間,網橋就無能為力了。
——網橋擴大了網路的規模,提高了網路的性能,給網路應用帶來了方便,在以前的網路中,網橋的應用較為廣泛。但網橋互連也帶來了不少問題:一個是廣播風暴,網橋不阻擋網路中廣播消息,當網路的規模較大時(幾個網橋,多個乙太網段),有可能引起廣播風暴(broadcasting storm),導致整個網路全被廣播信息充滿,直至完全癱瘓。第二個問題是,當與外部網路互連時,網橋會把內部和外部網路合二為一,成為一個網,雙方都自動向對方完全開放自己的網路資源。這種互連方式在與外部網路互連時顯然是難以接受的。問題的主要根源是網橋只是最大限度地把網路溝通,而不管傳送的信息是什麼。
1.2 路由器互連網路
——路由器互連與網路的協議有關,我們討論限於TCP/IP網路的情況。
——路由器工作在OSI模型中的第三層,即網路層。路由器利用網路層定義的「邏輯」上的網路地址(即IP地址)來區別不同的網路,實現網路的互連和隔離,保持各個網路的獨立性。路由器不轉發廣播消息,而把廣播消息限制在各自的網路內部。發送到其他網路的數據茵先被送到路由器,再由路由器轉發出去。
——IP路由器只轉發IP分組,把其餘的部分擋在網內(包括廣播),從而保持各個網路具有相對的獨立性,這樣可以組成具有許多網路(子網)互連的大型的網路。由於是在網路層的互連,路由器可方便地連接不同類型的網路,只要網路層運行的是IP協議,通過路由器就可互連起來。
——網路中的設備用它們的網路地址(TCP/IP網路中為IP地址)互相通信。IP地址是與硬體地址無關的「邏輯」地址。路由器只根據IP地址來轉發數據。IP地址的結構有兩部分,一部分定義網路號,另一部分定義網路內的主機號。目前,在Internet網路中採用子網掩碼來確定IP地址中網路地址和主機地址。子網掩碼與IP地址一樣也是32bit,並且兩者是一一對應的,並規定,子網掩碼中數字為「1」所對應的IP地址中的部分為網路號,為「0」所對應的則為主機號。網路號和主機號合起來,才構成一個完整的IP地址。同一個網路中的主機IP地址,其網路號必須是相同的,這個網路稱為IP子網。
——通信只能在具有相同網路號的IP地址之間進行,要與其它IP子網的主機進行通信,則必須經過同一網路上的某個路由器或網關(gateway)出去。不同網路號的IP地址不能直接通信,即使它們接在一起,也不能通信。
——路由器有多個埠,用於連接多個IP子網。每個埠的IP地址的網路號要求與所連接的IP子網的網路號相同。不同的埠為不同的網路號,對應不同的IP子網,這樣才能使各子網中的主機通過自己子網的IP地址把要求出去的IP分組送到路由器上。
2 路由原理
——當IP子網中的一台主機發送IP分組給同一IP子網的另一台主機時,它將直接把IP分組送到網路上,對方就能收到。而要送給不同IP於網上的主機時,它要選擇一個能到達目的子網上的路由器,把IP分組送給該路由器,由路由器負責把IP分組送到目的地。如果沒有找到這樣的路由器,主機就把IP分組送給一個稱為「預設網關(default gateway)」的路由器上。「預設網關」是每台主機上的一個配置參數,它是接在同一個網路上的某個路由器埠的IP地址。
——路由器轉發IP分組時,只根據IP分組目的IP地址的網路號部分,選擇合適的埠,把IP分組送出去。同主機一樣,路由器也要判定埠所接的是否是目的子網,如果是,就直接把分組通過埠送到網路上,否則,也要選擇下一個路由器來傳送分組。路由器也有它的預設網關,用來傳送不知道往哪兒送的IP分組。這樣,通過路由器把知道如何傳送的IP分組正確轉發出去,不知道的IP分組送給「預設網關」路由器,這樣一級級地傳送,IP分組最終將送到目的地,送不到目的地的IP分組則被網路丟棄了。
——目前TCP/IP網路,全部是通過路由器互連起來的,Internet就是成千上萬個IP子網通過路由器互連起來的國際性網路。這種網路稱為以路由器為基礎的網路(router based network),形成了以路由器為節點的「網間網」。在「網間網」中,路由器不僅負責對IP分組的轉發,還要負責與別的路由器進行聯絡,共同確定「網間網」的路由選擇和維護路由表。
——路由動作包括兩項基本內容:尋徑和轉發。尋徑即判定到達目的地的最佳路徑,由路由選擇演算法來實現。由於涉及到不同的路由選擇協議和路由選擇演算法,要相對復雜一些。為了判定最佳路徑,路由選擇演算法必須啟動並維護包含路由信息的路由表,其中路由信息依賴於所用的路由選擇演算法而不盡相同。路由選擇演算法將收集到的不同信息填入路由表中,根據路由表可將目的網路與下一站(nexthop)的關系告訴路由器。路由器間互通信息進行路由更新,更新維護路由表使之正確反映網路的拓撲變化,並由路由器根據量度來決定最佳路徑。這就是路由選擇協議(routing protocol),例如路由信息協議(RIP)、開放式最短路徑優先協議(OSPF)和邊界網關協議(BGP)等。
——轉發即沿尋徑好的最佳路徑傳送信息分組。路由器首先在路由表中查找,判明是否知道如何將分組發送到下一個站點(路由器或主機),如果路由器不知道如何發送分組,通常將該分組丟棄;否則就根據路由表的相應表項將分組發送到下一個站點,如果目的網路直接與路由器相連,路由器就把分組直接送到相應的埠上。這就是路由轉發協議(routed protocol)。
——路由轉發協議和路由選擇協議是相互配合又相互獨立的概念,前者使用後者維護的路由表,同時後者要利用前者提供的功能來發布路由協議數據分組。下文中提到的路由協議,除非特別說明,都是指路由選擇協議,這也是普遍的習慣。
3 路由協議
——典型的路由選擇方式有兩種:靜態路由和動態路由。
——靜態路由是在路由器中設置的固定的路由表。除非網路管理員干預,否則靜態路由不會發生變化。由於靜態路由不能對網路的改變作出反映,一般用於網路規模不大、拓撲結構固定的網路中。靜態路由的優點是簡單、高效、可靠。在所有的路由中,靜態路由優先順序最高。當動態路由與靜態路由發生沖突時,以靜態路由為准。
——動態路由是網路中的路由器之間相互通信,傳遞路由信息,利用收到的路由信息更新路由器表的過程。它能實時地適應網路結構的變化。如果路由更新信息表明發生了網路變化,路由選擇軟體就會重新計算路由,並發出新的路由更新信息。這些信息通過各個網路,引起各路由器重新啟動其路由演算法,並更新各自的路由表以動態地反映網路拓撲變化。動態路由適用於網路規模大、網路拓撲復雜的網路。當然,各種動態路由協議會不同程度地佔用網路帶寬和CPU資源。
——靜態路由和動態路由有各自的特點和適用范圍,因此在網路中動態路由通常作為靜態路由的補充。當一個分組在路由器中進行尋徑時,路由器首先查找靜態路由,如果查到則根據相應的靜態路由轉發分組;否則再查找動態路由。
——根據是否在一個自治域內部使用,動態路由協議分為內部網關協議(IGP)和外部網關協議(EGP)。這里的自治域指一個具有統一管理機構、統一路由策略的網路。自治域內部採用的路由選擇協議稱為內部網關協議,常用的有RIP、OSPF;外部網關協議主要用於多個自治域之間的路由選擇,常用的是BGP和BGP-4。下面分別進行簡要介紹。
3.1 RIP路由協議
——RIP協議最初是為Xerox網路系統的Xerox parc通用協議而設計的,是Internet中常用的路由協議。RIP採用距離向量演算法,即路由器根據距離選擇路由,所以也稱為距離向量協議。路由器收集所有可到達目的地的不同路徑,並且保存有關到達每個目的地的最少站點數的路徑信息,除到達目的地的最佳路徑外,任何其它信息均予以丟棄。同時路由器也把所收集的路由信息用RIP協議通知相鄰的其它路由器。這樣,正確的路由信息逐漸擴散到了全網。
——RIP使用非常廣泛,它簡單、可靠,便於配置。但是RIP只適用於小型的同構網路,因為它允許的最大站點數為15,任何超過15個站點的目的地均被標記為不可達。而且RIP每隔30s一次的路由信息廣播也是造成網路的廣播風暴的重要原因之一。
3.2 OSPF路由協議
——80年代中期,RIP已不能適應大規模異構網路的互連,0SPF隨之產生。它是網間工程任務組織(1ETF)的內部網關協議工作組為IP網路而開發的一種路由協議。
——0SPF是一種基於鏈路狀態的路由協議,需要每個路由器向其同一管理域的所有其它路由器發送鏈路狀態廣播信息。在OSPF的鏈路狀態廣播中包括所有介面信息、所有的量度和其它一些變數。利用0SPF的路由器首先必須收集有關的鏈路狀態信息,並根據一定的演算法計算出到每個節點的最短路徑。而基於距離向量的路由協議僅向其鄰接路由器發送有關路由更新信息。
——與RIP不同,OSPF將一個自治域再劃分為區,相應地即有兩種類型的路由選擇方式:當源和目的地在同一區時,採用區內路由選擇;當源和目的地在不同區時,則採用區間路由選擇。這就大大減少了網路開銷,並增加了網路的穩定性。當一個區內的路由器出了故障時並不影響自治域內其它區路由器的正常工作,這也給網路的管理、維護帶來方便。
3.3 BGP和BGP-4路由協議
——BGP是為TCP/IP互聯網設計的外部網關協議,用於多個自治域之間。它既不是基於純粹的鏈路狀態演算法,也不是基於純粹的距離向量演算法。它的主要功能是與其它自治域的BGP交換網路可達信息。各個自治域可以運行不同的內部網關協議。BGP更新信息包括網路號/自治域路徑的成對信息。自治域路徑包括到達某個特定網路須經過的自治域串,這些更新信息通過TCP傳送出去,以保證傳輸的可靠性。
——為了滿足Internet日益擴大的需要,BGP還在不斷地發展。在最新的BGp4中,還可以將相似路由合並為一條路由。
3.4 路由表項的優先問題
——在一個路由器中,可同時配置靜態路由和一種或多種動態路由。它們各自維護的路由表都提供給轉發程序,但這些路由表的表項間可能會發生沖突。這種沖突可通過配置各路由表的優先順序來解決。通常靜態路由具有默認的最高優先順序,當其它路由表表項與它矛盾時,均按靜態路由轉發。
4 路由演算法
——路由演算法在路由協議中起著至關重要的作用,採用何種演算法往往決定了最終的尋徑結果,因此選擇路由演算法一定要仔細。通常需要綜合考慮以下幾個設計目標:
——(1)最優化:指路由演算法選擇最佳路徑的能力。
——(2)簡潔性:演算法設計簡潔,利用最少的軟體和開銷,提供最有效的功能。
——(3)堅固性:路由演算法處於非正常或不可預料的環境時,如硬體故障、負載過高或操作失誤時,都能正確運行。由於路由器分布在網路聯接點上,所以在它們出故障時會產生嚴重後果。最好的路由器演算法通常能經受時間的考驗,並在各種網路環境下被證實是可靠的。
——(4)快速收斂:收斂是在最佳路徑的判斷上所有路由器達到一致的過程。當某個網路事件引起路由可用或不可用時,路由器就發出更新信息。路由更新信息遍及整個網路,引發重新計算最佳路徑,最終達到所有路由器一致公認的最佳路徑。收斂慢的路由演算法會造成路徑循環或網路中斷。
——(5)靈活性:路由演算法可以快速、准確地適應各種網路環境。例如,某個網段發生故障,路由演算法要能很快發現故障,並為使用該網段的所有路由選擇另一條最佳路徑。
——路由演算法按照種類可分為以下幾種:靜態和動態、單路和多路、平等和分級、源路由和透明路由、域內和域間、鏈路狀態和距離向量。前面幾種的特點與字面意思基本一致,下面著重介紹鏈路狀態和距離向量演算法。
——鏈路狀態演算法(也稱最短路徑演算法)發送路由信息到互聯網上所有的結點,然而對於每個路由器,僅發送它的路由表中描述了其自身鏈路狀態的那一部分。距離向量演算法(也稱為Bellman-Ford演算法)則要求每個路由器發送其路由表全部或部分信息,但僅發送到鄰近結點上。從本質上來說,鏈路狀態演算法將少量更新信息發送至網路各處,而距離向量演算法發送大量更新信息至鄰接路由器。
——由於鏈路狀態演算法收斂更快,因此它在一定程度上比距離向量演算法更不易產生路由循環。但另一方面,鏈路狀態演算法要求比距離向量演算法有更強的CPU能力和更多的內存空間,因此鏈路狀態演算法將會在實現時顯得更昂貴一些。除了這些區別,兩種演算法在大多數環境下都能很好地運行。
——最後需要指出的是,路由演算法使用了許多種不同的度量標准去決定最佳路徑。復雜的路由演算法可能採用多種度量來選擇路由,通過一定的加權運算,將它們合並為單個的復合度量、再填入路由表中,作為尋徑的標准。通常所使用的度量有:路徑長度、可靠性、時延、帶寬、負載、通信成本等。
5 新一代路由器
——由於多媒體等應用在網路中的發展,以及ATM、快速乙太網等新技術的不斷採用,網路的帶寬與速率飛速提高,傳統的路由器已不能滿足人們對路由器的性能要求。因為傳統路由器的分組轉發的設計與實現均基於軟體,在轉發過程中對分組的處理要經過許多環節,轉發過程復雜,使得分組轉發的速率較慢。另外,由於路由器是網路互連的關鍵設備,是網路與其它網路進行通信的一個「關口」,對其安全性有很高的要求,因此路由器中各種附加的安全措施增加了CPU的負擔,這樣就使得路由器成為整個互聯網上的「瓶頸」。
——傳統的路由器在轉發每一個分組時,都要進行一系列的復雜操作,包括路由查找、訪問控製表匹配、地址解析、優先順序管理以及其它的附加操作。這一系列的操作大大影響了路由器的性能與效率,降低了分組轉發速率和轉發的吞吐量,增加了CPU的負擔。而經過路由器的前後分組間的相關性很大,具有相同目的地址和源地址的分組往往連續到達,這為分組的快速轉發提供了實現的可能與依據。新一代路由器,如IP Switch、Tag Switch等,就是採用這一設計思想用硬體來實現快速轉發,大大提高了路由器的性能與效率。
——新一代路由器使用轉發緩存來簡化分組的轉發操作。在快速轉發過程中,只需對一組具有相同目的地址和源地址的分組的前幾個分組進行傳統的路由轉發處理,並把成功轉發的分組的目的地址、源地址和下一網關地址(下一路由器地址)放人轉發緩存中。當其後的分組要進行轉發時,茵先查看轉發緩存,如果該分組的目的地址和源地址與轉發緩存中的匹配,則直接根據轉發緩存中的下一網關地址進行轉發,而無須經過傳統的復雜操作,大大減輕了路由器的負擔,達到了提高路由器吞吐量的目標。
㈥ 簡述路由器的工作原理
網路中的設備相互通信主要是用它們的IP地址,路由器只能根據具體的IP地址來轉發數據。IP地址由網路地址和主機地址兩部分組成。在Internet中採用的是由子網掩碼來確定網路地址和主機地址。
子網掩碼與IP地址一樣都是32位的,並且這兩者是一一對應的,子網掩碼中「1」對應IP地址中的網路地址,「0」對應的是主機地址,網路地址和主機地址就構成了一個完整的IP地址。在同一個網路中,IP地址的網路地址必須是相同的。
計算機之間的通信只能在具有相同網路地址的IP地址之間進行,如果想要與其他網段的計算機進行通信,則必須經過路由器轉發出去。不同網路地址的IP地址是不能直接通信的,即便它們距離非常近,也不能進行通信。
路由器的多個埠可以連接多個網段,每個埠的IP地址的網路地址都必須與所連接的網段的網路地址一致。不同的埠它的網路地址是不同的,所對應的網段也是不同的,這樣才能使各個網段中的主機通過自己網段的IP地址把數據發送到路由器上。
應用
路由器可能具有用於不同類型物理層連接的介面,例如銅纜、光纖或無線傳輸。它還可以支持不同的網路層傳輸標准。每個網路介面用於使數據包能夠從一個傳輸系統轉發到另一個傳輸系統。路由器還可用於連接兩個或多個邏輯組的計算機設備,稱為子網,每個組具有不同的網路前綴。
路由器可以提供企業內部、企業與互聯網之間或互聯網服務提供商(ISP) 網路之間的連接。最大的路由器(例如Cisco CRS-1或JuniperPTX)與各種 ISP 互連,或者可能用於大型企業網路。較小的路由器通常為典型的家庭和辦公室網路提供連接。
在企業內部可以找到各種尺寸的路由器。最強大的路由器通常存在於 ISP、學術和研究機構中。大型企業可能還需要更強大的路由器來應對不斷增長的內網數據流量需求。一個分層的網路互聯模型在大型網路互連路由器是普遍使用。
以上內容參考網路-路由器
㈦ 詳解路由器的工作原理
很多人都知道路由器是現在很重要的上網連接設備,但可能都不太了解路由器的工作原理,下面是我整理的一些關於路由器的相關資料,供你參考。
詳解路由器的工作原理
我們知道路由器是用來連接不同網段或網路的,在一個區域網中,如果不需與外界網路進行通信的話,內部網路的各工作站都能識別 其它 各節點,完全可以通過交換機就可以實現目的發送,根本用不上路由器來記憶區域網的各節點MAC地址。路由器識別不同網路的 方法 是通過識別不同網路的網路ID號進行的,所以為了保證路由成功,每個網路都必須有一個唯一的網路編號。路由器要識別另一個網路,首先要識別的就是對方網路的路由器IP地址的網路ID,看是不是與目的節點地址中的網路ID號相一致。如果是當然就向這個網路的路由器發送了,接收網路的路由器在接收到源網路發來的報文後,根據報文中所包括的目的節點IP地址中的主機ID號來識別是發給哪一個節點的,然後再直接發送。
為了更清楚地說明路由器的工作原理,現在我們假設有這樣一個簡單的網路。假設其中一個網段網路ID號為"A",在同一網段中有4台終端設備連接在一起,這個網段的每個設備的IP地址分別假設為:A1、A2、A3和A4。連接在這個網段上的一台路由器是用來連接其它網段的,路由器連接於A網段的那個埠IP地址為A5。同樣路由器連接另一網段為B網段,這個網段的網路ID號為"B",那連接在B網段的另幾台工作站設備設的IP地址我們設為:B1、B2、B3、B4,同樣連接與B網段的路由器埠的IP地址我們設為B5。
在這樣一個簡單的網路中同時存在著兩個不同的網段,現如果A網段中的A1用戶想發送一個數據給B網段的B2用戶,有了路由器就非常簡單了。
首先A1用戶把所發送的數據及發送報文准備好,以數據幀的形式通過集線器或交換機廣播發給同一網段的所有節點(集線器都是採取廣播方式,而交換機因為不能識別這個地址,也採取廣播方式),路由器在偵聽到A1發送的數據幀後,分析目的節點的IP地址信息(路由器在得到數據包後總是要先進行分析)。得知不是本網段的,就把數據幀接收下來,進一步根據其路由表分析得知接收節點的網路ID號與B5埠的網路ID號相同,這時路由器的A5埠就直接把數據幀發給路由器B5埠。B5埠再根據數據幀中的目的節點IP地址信息中的主機ID號來確定最終目的節點為B2,然後再發送數據到節點B2。這樣一個完整的數據幀的路由轉發過程就完成了,數據也正確、順利地到達目的節點。
當然實際上像以上這樣的網路算是非常簡單的,路由器的功能還不能從根本上體現出來,一般一個網路都會同時連接其它多個網段或網路,就像圖2所示的一樣,A、B、C、D四個網路通過路由器連接在一起。
現在我們來看一下在如圖2所示網路環境下路由器又是如何發揮其路由、數據轉發作用的。我們同樣需要假設,各網路用戶的IP地址分配就不多講了,圖2已有標注。現假設網路A中一個用戶A1要向C網路中的C3用戶發送一個請求信號時,信號傳遞的步驟如下:
第1步:用戶A1將目的用戶C3的地址C3,連同數據信息以數據幀的形式通過集線器或交換機以廣播的形式發送給同一網路中的所有節點,當路由器A5埠偵聽到這個地址後,分析得知所發目的節點不是本網段的,需要路由轉發,就把數據幀接收下來。
第2步:路由器A5埠接收到用戶A1的數據幀後,先從報頭中取出目的用戶C3的IP地址,並根據路由表計算出發往用戶C3的最佳路徑。因為從分析得知到C3的網路ID號與路由器的C5網路ID號相同,所以由路由器的A5埠直接發向路由器的C5埠應是信號傳遞的最佳途經。
第3步:路由器的C5埠再次取出目的用戶C3的IP地址,找出C3的IP地址中的主機ID號,如果在網路中有交換機則可先發給交換機,由交換機根據MAC地址表找出具體的網路節點位置;如果沒有交換機設備則根據其IP地址中的主機ID直接把數據幀發送給用戶C3,這樣一個完整的數據通信轉發過程也完成了。
從上面可以看出,不管網路有多麼復雜,路由器其實所作的工作就是這么幾步,所以整個路由器的工作原理都差不多。當然在實際的網路中還遠比上圖2所示的要復雜許多,實際的步驟也不會像上述那麼簡單,但總的過程是這樣的。
路由器使用分類互聯網各種級別的網路中隨處都可見到路由器。接入網路使得家庭和小型企業可以連接到某個互聯網服務提供商;企業網中的路由器連接一個校園或企業內成千上萬的計算機;骨幹網上的路由器終端系統通常是不能直接訪問的,它們連接長距離骨幹網上的ISP和企業網路。互聯網的快速發展無論是對骨幹網、企業網還是接入網都帶來了不同的挑戰。骨幹網要求路由器能對少數鏈路進行高速路由轉發。企業級路由器不但要求埠數目多、價格低廉,而且要求配置起來簡單方便,並提供QoS,像飛魚星的企業級路由器就提供SmartQoSIII。
接入
接入路由器連接家庭或ISP內的小型企業客戶。接入路由器已經開始不只是提供SLIP或PPP連接。諸如ADSL等技術將很快提高各家庭的可用帶寬,這將進一步增加接入路由器的負擔。由於這些趨勢,接入路由器將來會支持許多異構和高速埠,並在各個埠能夠運行多種協議,同時還要避開電話交換網。
企業級
企業或校園級路由器連接許多終端系統,其主要目標是以盡量便宜的方法實現盡可能多的端點互連,並且進一步要求支持不同的服務質量。許多現有的企業網路都是由Hub或網橋連接起來的乙太網段。盡管這些設備價格便宜、易於安裝、無需配置,但是它們不支持服務等級。相反,有路由器參與的網路能夠將機器分成多個碰撞域,並因此能夠控制一個網路的大小。此外,路由器還支持一定的服務等級,至少允許分成多個優先順序別。但是路由器的每埠造價要貴些,並且在能夠使用之前要進行大量的配置工作。因此,企業路由器的成敗就在於是否提供大量埠且每埠的造價很低,是否容易配置,是否支持QoS。另外『還要求企業級路由器有效地支持廣播和組播。企業網路還要處理歷史遺留的各種LAN技術,支持多種協議,包括IP、IPX和Vine。它們還要支持防火牆、包過濾以及大量的管理和安全策略以及VLAN。
骨幹級
骨幹級路由器實現企業級網路的互聯。對它的要求是速度和可靠性,而代價則處於次要地位。
硬體可靠性可以採用電話交換網中使用的技術,如熱備份、雙電源、雙數據通路等來獲得。這些技術對所有骨幹路由器而言差不多是標準的。骨幹IP路由器的主要性能瓶頸是在轉發表中查找某個路由所耗的時間。當收到一個包時,輸入埠在轉發表中查找該包的目的地址以確定其目的埠,當包越短或者當包要發往許多目的埠時,勢必增加路由查找的代價。因此,將一些常訪問的目的埠放到緩存中能夠提高路由查找的效率。不管是輸入緩沖還是輸出緩沖路由器,都存在路由查找的瓶頸問題。除了性能瓶頸問題,路由器的穩定性也是一個常被忽視的問題。
太比特
在未來核心互聯網使用的三種主要技術中,光纖和DWDM都已經是很成熟的並且是現成的。如果沒有與現有的光纖技術和DWDM技術提供的原始帶寬對應的路由器,新的網路基礎設施將無法從根本上得到性能的改善,因此開發高性能的骨幹交換/路由器(太比特路由器)已經成為一項迫切的要求。太比特路由器技術還主要處於開發實驗階段。
多WAN
雙WAN路由器具有物理上的2個WAN口作為外網接入,這樣內網電腦就可以經過雙WAN路由器的負載均衡功能同時使用2條外網接入線路,大幅提高了網路帶寬。當前雙WAN路由器主要有「帶寬匯聚」和「一網雙線」的應用優勢,這是傳統單WAN路由器做不到的。
3G無線
3G無線路由器採用32位高性能工業級ARM9通信處理器,以嵌入式實時 操作系統 RTOS為軟體支撐平台,系統集成了全系列從邏輯鏈路層到應用層通信協議,支持靜態及動態路由、PPP server及PPP client、(包括、PPTP和IPSEC)、DHCP server及DHCP client、DDNS、防火牆、NAT、DMZ主機等功能。為用戶提供安全、高速、穩定可靠,各種協議路由轉發的無線路由網路。
隨著3G 無線網路 的發展,人們越來越享受無線網路給人們帶來的價值,市場上有多種類的3G無線路由器,其中有小黑A8 系列,小黑華為e5等。3G無線路由器在改變人們的生活。
路由器的相關 文章 :
1. 如何查看路由器地址
2. 教你簡單安裝路由器的方法大全
3.解除 路由器用戶名及密碼的詳細圖文教程
4. 如何挑一個最適合自己的路由器
5. 路由器有幾種類型