ip協議的乙個核心任務是資料報的路由,即決定傳送資料報到目標機器的路徑。為了理解ip路由過程,我們先簡要分析ip模組的基本工作流程。
ip模組基本工作流程如圖2-3所示。
我們從右往左來分析圖2-3。當ip模組接收到來自資料鏈路層的ip資料報時,它首先對該資料報的頭部做crc校驗,確認無誤之後就分析其頭部的具體資訊。
如果該ip資料報的頭部設定了源站選路選項(鬆散源路由選擇或嚴格源路由選擇),則ip模組呼叫資料報**子模組來處理該資料報。如果該ip資料報的頭部中目標ip位址是本機的某個ip位址,或者是廣播位址,即該資料報是傳送給本機的,則ip模組就根據資料報頭部中的協議欄位來決定將它派發給哪個上層應用(分用)。如果ip模組發現這個資料報不是傳送給本機的,則也呼叫資料報**子模組來處理該資料報。
資料報**子模組將首先檢測系統是否允許**,如果不允許,ip模組就將資料報丟棄。如果允許,資料報**子模組將對該資料報執行一些操作,然後將它交給ip資料報輸出子模組。我們將在後面討論資料報**的具體過程。
ip資料報應該傳送至哪個下一跳路由(或者目標機器),以及經過哪個網絡卡來傳送,就是ip路由過程,即圖2-3中「計算下一跳路由」子模組。ip模組實現資料報路由的核心資料結構是路由表。這個表按照資料報的目標ip位址分類,同一型別的ip資料報將被發往相同的下一跳路由器(或者目標機器)。我們將在後面討論ip路由過程。
ip輸出佇列中存放的是所有等待傳送的ip資料報,其中除了需要**的ip資料報外,還包括封裝了本機上層資料(icmp報文、tcp報文段和udp資料報)的ip資料報。
圖2-3中的虛線箭頭顯示了路由表更新的過程。這一過程是指通過路由協議或者route命令調整路由表,使之更適應最新的網路拓撲結構,稱為ip路由策略。我們將在後面簡單討論它。
要研究ip路由機制,需要先了解路由表的內容。我們可以使用route命令或netstat命令檢視路由表。在測試機器ernest-laptop上執行route命令,輸出內容如**清單2-2所示。
該路由表包含兩項,每項都包含8個字段,如表2-2所示。
**清單2-2所示的路由表中,第一項的目標位址是default,即所謂的預設路由項。該項包含乙個「g」標誌,說明路由的下一跳目標是閘道器,其位址是192.168.1.1(這是測試網路中路由器的本地ip位址)。另外乙個路由項的目標位址是192.168.1.0,它指的是本地區域網。該路由項的閘道器位址為*,說明資料報不需要路由中轉,可以直接傳送到目標機器。
1)查詢路由表中和資料報的目標ip位址完全匹配的主機ip位址。如果找到,就使用該路由項,沒找到則轉步驟2。
2)查詢路由表中和資料報的目標ip位址具有相同網路id的網路ip位址(比如**清單2-2所示的路由表中的第二項)。如果找到,就使用該路由項;沒找到則轉步驟3。
3)選擇預設路由項,這通常意味著資料報的下一跳路由是閘道器。
因此,對於測試機器ernest-laptop而言,所有傳送到ip位址為192.168.1.*的機器的ip資料報都可以直接傳送到目標機器(匹配路由表第二項),而所有訪問網際網路的請求都將通過閘道器來**(匹配預設路由項)。
路由表必須能夠更新,以反映網路連線的變化,這樣ip模組才能準確、高效地**資料報。route命令可以修改路由表。我們看如下幾個例子(在機器ernest-laptop上執行):
$ sudo route add –host 192.168.1.109 dev eth0
$ sudo route del -net 192.168.1.0 netmask 255.255.255.0
$ sudo route del default
$ sudo route add default gw 192.168.1.109 dev eth0
第1行表示新增主機192.168.1.109(機器kongming20)對應的路由項。這樣設定之後,所有從ernest-laptop傳送到kongming20的ip資料報將通過網絡卡eth0直接傳送至目標機器的接收網絡卡。第2行表示刪除網路192.168.1.0對應的路由項。這樣,除了機器kongming20外,測試機器ernest-laptop將無法訪問該區域網上的任何其他機器(能訪問到kongming20是由於執行了上一條命令)。第3行表示刪除預設路由項,這樣做的後果是無法訪問網際網路。第4行表示重新設定預設路由項,不過這次其閘道器是機器kongming20(而不是能直接訪問網際網路的路由器)!經過上述修改後的路由表如下:
kernel ip routing table
destination gateway genmask flags metric ref use iface
kongming20 * 255.255.255.255 uh 0 0 0 eth0
default kongming20 0.0.0.0 ug 0 0 0 eth0
這個新的路由表中,第乙個路由項是主機路由項,所以它被設定了「h」標誌。我們設計這樣乙個路由表的目的是為後文討論icmp重定向提供環境。
通過route命令或其他工具手工修改路由表,是靜態的路由更新方式。對於大型的路由器,它們通常通過bgp(border gateway protocol,邊際閘道器協議)、rip(routing information protocol,路由資訊協議)、ospf等協議來發現路徑,並更新自己的路由表。這種更新方式是動態的、自動的。這部分內容超出了本書的討論範圍,感興趣的讀者可閱讀參考資料1。
linux高效能伺服器程式設計
linux高效能伺服器程式設計 當當網 亞馬遜 目錄 第一章 tcp ip協議族 第二章 ip協議族 第三章 tcp協議詳解 第四章 tcp ip通訊案例 訪問internet 第五章 linux網路程式設計基礎api 第六章 高階io函式 第七章 linux伺服器程式規範 第八章 高效能伺服器框架...
linux 高效能伺服器程式設計
1.高效能定時器 時間輪,時間堆 處理超時時間,如nginx使用紅黑樹,找出最可能超時的事件 2.高效能伺服器程式框架 nginx 使用的是基於事件模型,epoll,不阻塞,非同步處理 兩種高效的事件處理模式 reactor模式 proactor模式 兩種高效的併發模式 半同步 半非同步模式 領導者...
linux高效能伺服器程式設計(1)
linux網路程式設計基礎api 1 socket位址api 2 sockt基礎api sockt的api全部定義在sys socket.h檔案中,包括 建立socket,命名socket,監聽socket,接受連線,發起連線,讀寫資料,獲取位址資訊,檢測帶外標記,以及讀取和設定socket選項。3...