IP,提供不可靠,無鏈接的數據包傳送服務.其中:網絡
不可靠;即將數據交付給IP協議傳送,IP協議並不能保證將數據成功傳送過去;若數據在傳輸過程當中遇到任何錯誤,IP協議會丟棄數據,併發送ICMP錯誤報文給信源端.併發
無鏈接;即在將數據交付給IP協議傳送以前,是不須要創建鏈接的;一個鮮明的對比是TCP協議,將數據交付給TCP協議以前,須要創建鏈接以後,才能發送數據.學習
此處對 IP 首部的介紹並不涉及 IP 選項部分測試
版本號;4bit;代表當前IP數據包的版本號,當前取值爲4,代表是IPV4數據包.spa
首部長度;4bit;代表當前IP數據包的首部長度,單位:4byte,通常狀況下,該值爲5,代表IP首部長度爲5*4byte,即20bytes.net
服務類型;8bit;分爲以下子字段:代理
優先權;3bit;已過期;code
TOS;4bit;應用程序可根據須要來設置相應的位,但具體如何解釋取決於實現,blog
最小時延,如: telnet/rlogin 交互應用程序通常設置了該位.接口
最大吞吐量,如: FTP 在傳輸文件時,通常設置了該位.
最高可靠性,如: ICMP 在發送報文時,通常設置了該位.
最小費用.
數據包長度;16bit;指明瞭當前IP數據包的長度(包括IP首部,以及數據),單位:字節
標識;16bit;惟一標示主機發送的每個IP數據包,
標誌;3bit;參考 IP 分片
More Fragments 1 bit,若 IP 數據包在發送過程當中被分紅若干片,則除了最後一片外,其他片中的該位必須置位,代表該片不是最後一片.
Don't fragment 1 bit.若設置則代表該 IP 數據包在發送中不能被分片.若是 IP 數據包沒法在不分片的狀況下進行轉發,則路由器會丟棄該 IP 數據包並經過 ICMP 將一個錯誤信息發送至源端.
片偏移;13bit;參考 IP 分片.
TTL;8bit;指名了當前IP數據包在網絡中的生存時間,網絡中的節點對TTL的處理大體以下:
if(ip數據包.目的IP地址 == 節點自身地址) 將ip數據包交付給節點的上層協議進行處理; else --ip數據包.ttl; if(ip數據包.ttl == 0) 丟棄該 ip數據包; 轉發給 ip 數據包;
上層協議;8bit;指名了IP數據包應該交付的上層協議.
首部檢驗和;16b;該檢驗和只是用來驗證ip數據包的首部,即只使用ip數據包的首部計算得來.
源IP地址;目的IP地址
子網編址,即不把 IP 地址當作由單純的一個網絡號和一個主機號組成,而是把主機號再分紅一個子網號和一個主機號.即此時 IP 地址由網絡號,子網號,主機號組成.
通常狀況下,一個子網中僅能容納一個物理網絡,但當使用 ARP 代理後,多個物理網絡能夠共享一個子網號.
全爲 0,或全爲 1 的子網號,主機號具備特殊的意義,因此不能夠被使用.
子網編址的優勢(TODO 因爲沒有實際例子,因此顯得抽象...):
子網對外部路由器來講隱藏了內部網絡組織(一個校園或公司內部)的細節
子網劃分縮減了路由表的規模.
子網掩碼,用來肯定在主機號中有多少位用於子網號,又有多少位用於主機號.是一個 32 bit的值,值爲 1 的比特留給網絡號和子網號,爲 0 的比特留給主機號.
根據 IP 地址的前綴能夠肯定 IP 地址所屬類,即肯定網絡號的位數.
根據子網掩碼來肯定子網號以及主機號的位數.
網絡接口(即網絡適配器)與 IP 地址,IP 子網掩碼一一對應.即一個網絡接口具備惟一的 IP 地址以及子網掩碼.
即容許含有子網的網絡使用多個子網掩碼,子網編址是將主機號分爲子網號與主機號,而變長子網則是在分配後的主機號中再一次進行分配子網號與主機號.
通常狀況下,一個 A,B,C 類網絡中只有一個子網掩碼,因此當兩個 IP 地址具備相同的網絡號,通常就能夠確定他們具備相同的子網掩碼,所以能夠分析出這 2 個 IP 地址的子網號,以及主機號.
接受 IP 數據包,IP 協議可能會從 IGMP,ICMP,UDP,TCP 等上層協議中接受數據,也有可能從一個網絡接口接收數據報:
發送 IP 數據包
搜索內核 IP 路由表,由匹配路由條目,或者默認路由條目,肯定下一跳的地址以及網絡接口; if(下一跳的地址 == 0) /* 直接路由 */ 將 (IP 數據包目的地址,IP 數據包) 發送給指定的網絡接口; else /* 間接路由,此時下一跳地址是默認路由器的 IP 地址,由該路由器負責轉發分組. */ 將 (下一跳的地址,IP 數據包) 發送給指定的網絡接口; /* 內核 IP 路由表通常以下: */ $ route -n 內核 IP 路由表 目標 網關(下一跳地址) 子網掩碼 接口 0.0.0.0 192.168.16.1 0.0.0.0 wlan0 /* 默認路由條目 */ 192.168.16.0 0.0.0.0 255.255.255.0 wlan0 /* 直接路由 */
即若是目的主機與源主機直接相連(如點對點鏈路)或都在一個共享網絡上(以太網或令牌環網),那麼IP數據報就直接送到目的主機上.不然,主機把數據報發往一默認的路由器上,由路由器來轉發該數據報.
網絡接口發送數據幀
發送 ARP 請求報文獲取下一跳地址的 MAC 地址; /* 此時下一跳地址多是 IP 數據包的目的地址,也多是默認路由器的 IP 地址 */ 構建數據幀,而後發送該數據幀;
如何搜索內核 IP 路由表
var 匹配路由表條目=默認條目; var 匹配優先級=0; /* 用來表示匹配路由表條目的匹配程度. * 若匹配路由表條目是默認條目,則優先級爲 0. * 若僅網絡號匹配(即匹配路由表條目.網絡號==下一跳地址.網絡號),則優先級爲 1; * 若網絡號與子網號都匹配,則優先級爲 2; * 若網絡號,子網號,主機號都匹配,則優先級爲 3; */ for(路由表條目 in 內核 IP 路由表) /* 遍歷內核 IP 路由表 */ if(路由表條目.目標.類別 == 下一跳地址.類別 && 路由表條目.目標.網絡號 == 下一跳地址.網絡號 ) /* 具備相同的網絡號 */ if(匹配優先級 < 1){ /* 原匹配路由表條目匹配程度不高 */ 匹配路由表條目=路由表條目; 匹配優先級 = 1; } if(路由表條目.目標.子網號 == 下一跳地址.子網號){ 匹配路由表條目=路由表條目; 匹配優先級=2; }else continue;/* 子網號不相同,直接測試下一個路由表條目 */ if(路由表條目.目標.主機號 == 下一跳地址.主機號) { 匹配路由表條目=路由表條目; break;/* 找到最佳匹配路由表條目 */ } }
0 表示所有的比特位全爲 0;1表示全部的比特位全爲 1;netid,subnetid 和 hostid 分別表示不爲全 0 或全1的對應字段.
當主機號不進行子網劃分時,
TODO 問題: '表示網絡上的(特定)主機'中'網絡'是指以太網這種局域網,仍是 A,B,C 類這類大網絡?(我以爲是以太網..),'特定'又是什麼意思?
當主機號又進行子網編址時
選路機制,決定了如何從衆多路由表條目章肯定匹配的路由表條目;目前的選路機制:根據網絡號,子網號,主機號肯定匹配的路由表條目.
選路策略,決定了將哪些路由表條目放在路由表中
當沒法爲一個 IP 數據包選路,如: 路由表中沒有默認項,也沒有匹配項
若是 IP 數據包爲本機應用程序產生,則就給發送該數據報的應用程序返回一個差錯,或者是"主機不可達差錯"或者是"網絡不可達差錯".
不然,就給 IP 數據包的原主機發送一個 ICMP 不可達的差錯報文.
TODO,此時只關注了選路機制,對於選路策略沒有進行學習...