通俗易懂網(wǎng)絡(luò)協(xié)議(IP)
之前寫(xiě)過(guò)一篇《通俗易懂TCP/IP(概述)》,廣受歡迎和好評(píng),有網(wǎng)友催更,便抽空續(xù)寫(xiě)IP章節(jié),回應(yīng)粉絲期待。
TCP/IP網(wǎng)絡(luò)模型
TCP/IP網(wǎng)絡(luò)模型分為4層,自下而上分布為鏈路層(又叫網(wǎng)絡(luò)接口層)、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層。

- 鏈路層:處理數(shù)據(jù)在媒介上的表示、傳輸以及與硬件交互的細(xì)節(jié)。
- 網(wǎng)絡(luò)層:IP層負(fù)責(zé)IP數(shù)據(jù)報(bào)的路由轉(zhuǎn)發(fā),所有的TCP、UDP、ICMP和IGMP數(shù)據(jù)都通過(guò)IP數(shù)據(jù)報(bào)傳輸。網(wǎng)絡(luò)層(IP)提供了一種盡力而為、無(wú)連接、不可靠的數(shù)據(jù)報(bào)交付服務(wù),IP負(fù)責(zé)將IP數(shù)據(jù)報(bào)(又叫分組)放入數(shù)據(jù)鏈路層傳輸,并處理分片和重組邏輯。
- 傳輸層:為端主機(jī)上運(yùn)行的應(yīng)用程序提供端到端服務(wù),包括TCP和UDP。
- TCP提供了帶流量控制、擁塞控制、有序、可靠的流交付,TCP需要處理丟包檢測(cè)重傳、重排序等IP層不處理的問(wèn)題,TCP面向連接,不保留消息邊界。
- UDP提供的功能基本上沒(méi)有超越IP,不提供速率控制和差錯(cuò)控制,不保證可靠性,UDP只是提供一套端口號(hào),用于復(fù)用、多路分解(即把收到的數(shù)據(jù)報(bào)交給應(yīng)用層對(duì)應(yīng)程序處理)和校驗(yàn)數(shù)據(jù)完整性(只檢錯(cuò)不糾錯(cuò)),UDP面向非連接,保留消息邊界。
- 應(yīng)用層:負(fù)責(zé)處理特定應(yīng)用的細(xì)節(jié),通常應(yīng)用的實(shí)現(xiàn)都是基于TCP/IP或者UDP/IP。應(yīng)用層與應(yīng)用細(xì)節(jié)相關(guān),與網(wǎng)絡(luò)數(shù)據(jù)傳輸無(wú)關(guān),而之下的三層(鏈路層、網(wǎng)絡(luò)層、傳輸層)則對(duì)應(yīng)用一無(wú)所知,但需要處理通信的細(xì)節(jié)。
分層&協(xié)議對(duì)照
OSI七層網(wǎng)絡(luò)模型和TCP/IP四層網(wǎng)絡(luò)模型的對(duì)應(yīng)關(guān)系如下圖,對(duì)應(yīng)層的常用協(xié)議也列于表中。

分層的目標(biāo)是隔離,通過(guò)分層實(shí)現(xiàn):下層對(duì)上層透明,而上層利用下層提供的能力。
分層的另一個(gè)優(yōu)點(diǎn)是協(xié)議復(fù)用,這種復(fù)用允許多種協(xié)議共存于同一基礎(chǔ)設(shè)施之中,復(fù)用可以發(fā)生在不同層,并在每層都有不同類型的標(biāo)識(shí)符區(qū)分,用于確定信息屬于哪個(gè)協(xié)議。
比如在鏈路層的數(shù)據(jù)幀(Frame)有一個(gè)協(xié)議標(biāo)識(shí)符字段,用來(lái)標(biāo)識(shí)鏈路層幀攜帶的協(xié)議是IP還是ARP;又比如在網(wǎng)絡(luò)層的IP數(shù)據(jù)報(bào)頭部有一個(gè)8位協(xié)議字段,標(biāo)識(shí)該IP數(shù)據(jù)報(bào)來(lái)自于TCP、還是UDP、亦或是ICMP、IGMP...
封裝
數(shù)據(jù)在發(fā)送端從上到下經(jīng)過(guò)TCP/IP協(xié)議棧,遵循應(yīng)用層->TCP/UDP->IP->鏈路層的順序。
當(dāng)某層的一個(gè)協(xié)議數(shù)據(jù)單元(PDU)對(duì)象轉(zhuǎn)換為由底層攜帶的數(shù)據(jù)格式表示,這個(gè)過(guò)程稱為在相鄰低層的封裝,即上層被封裝對(duì)象作為不透明數(shù)據(jù)充當(dāng)?shù)讓拥腜ayload部分,封裝是層層包裹的過(guò)程。

每層都有自己的消息對(duì)象(PDU)的概念。
- TCP層的PDU叫TCP段(segment)
- UDP層的PDU叫UDP數(shù)據(jù)報(bào)(Datagram)
- IP層的PDU叫IP數(shù)據(jù)報(bào)(Datagram)
- 鏈路層的PDU叫鏈路層幀(Frame)
封裝的本質(zhì)是將來(lái)自上層的數(shù)據(jù)看成不透明、無(wú)須解釋的信息,經(jīng)過(guò)本層的處理,在上層PDU的前面加上本層協(xié)議的頭部,有些協(xié)議是增加尾部(鏈路層),頭部用于在發(fā)送時(shí)復(fù)用數(shù)據(jù),接收方基于各層封裝過(guò)程中增加頭部中的分解標(biāo)識(shí)符執(zhí)行分解。
具體到TCP傳輸數(shù)據(jù)而言,發(fā)送端的數(shù)據(jù)要經(jīng)過(guò)三次封裝。
- 應(yīng)用層數(shù)據(jù)經(jīng)過(guò)TCP層的時(shí)候,會(huì)增加TCP頭部,產(chǎn)生TCP Segment,TCP頭部中的端口號(hào)是該層的分解標(biāo)識(shí)符。
- TCP Segment經(jīng)過(guò)IP層的時(shí)候,會(huì)增加IP頭部,產(chǎn)生IP Datagram,IP頭部中的協(xié)議類型字段是該層的分解標(biāo)識(shí)符。
- IP分組經(jīng)過(guò)鏈路層的時(shí)候,會(huì)增加以太網(wǎng)首部和尾部,產(chǎn)生以太網(wǎng)Frame,幀頭部中的以太網(wǎng)類型字段,可用于區(qū)分IPv4(0x8000)、IPv6(0x86DD)和ARP(0x0806)。
分用
數(shù)據(jù)到達(dá)接收端(是目的機(jī)器),會(huì)從下到上經(jīng)過(guò)TCP/IP協(xié)議棧,遵循鏈路層->IP->TCP/UDP->應(yīng)用層的順序。
接收端的數(shù)據(jù)還原也需要經(jīng)歷三次解封。
- 經(jīng)過(guò)鏈路層會(huì)剝離以太網(wǎng)首尾部,根據(jù)以太網(wǎng)類型字段,如果是IP Datagram則交給IP模塊。
- 經(jīng)過(guò)IP層會(huì)清除IP頭部,根據(jù)IP頭部中的協(xié)議類型字段,交給TCP、UDP或者ICMP、IGMP模塊。
- 經(jīng)過(guò)TCP/UDP層去掉TCP/UDP頭部,根據(jù)端口號(hào),最終將數(shù)據(jù)還原取出,并交付給應(yīng)用程序。

封裝發(fā)生在發(fā)送方,拆封(還原)發(fā)生在接收方。
消息邊界
應(yīng)用層將協(xié)議攜帶的數(shù)據(jù)寫(xiě)入消息,消息邊界是兩次寫(xiě)入操作之間的位置或字節(jié)偏移量。
保留消息邊界的協(xié)議(UDP)在接收方能獲得發(fā)送方的消息邊界,而不保留消息邊界的協(xié)議(TCP)在接收方將不能獲得發(fā)送方的消息邊界。

比如發(fā)送端通過(guò)UDP協(xié)議先后發(fā)送2個(gè)大小分別為100、200字節(jié)的消息,接收端通過(guò)UDP協(xié)議接收數(shù)據(jù),將分2次分別接收到100、200字節(jié)的消息,但不保證接收100、200消息的先后順序。
而TCP是數(shù)據(jù)流協(xié)議,如果發(fā)送端通過(guò)TCP協(xié)議先后發(fā)送2個(gè)大小為100和200字節(jié)的消息,接收端會(huì)收到300字節(jié)數(shù)據(jù),但每次接收返回的不一定是100、200字節(jié)消息,接收端丟失了發(fā)送端的消息邊界。
網(wǎng)絡(luò)地址
IP地址用于IP層,IPv4的IP地址是32位整數(shù),最多可以表示40多億個(gè)IP地址,按8位一字節(jié),則分為4字節(jié),每個(gè)字節(jié)是一個(gè)0~255的無(wú)符號(hào)整數(shù),所以可以表示為“abc.def.ghi.jkl”的點(diǎn)分十進(jìn)制格式,也可以表示為32位無(wú)符號(hào)整數(shù)。
點(diǎn)分十進(jìn)制和無(wú)符號(hào)32位無(wú)符號(hào)整數(shù)可以很容易換算。
IPv4地址空間分成五大類,A、B、C類用于Internet單播,D類地址供組播使用,E類地址保留。
IPv4的32位又被劃分為網(wǎng)絡(luò)號(hào)和主機(jī)號(hào),可以把網(wǎng)絡(luò)號(hào)想象成到小區(qū)的郵政地址,而主機(jī)號(hào)想象成房間號(hào)。

鏈路層使用48bit的MAC地址,ARP和RARP用于IP地址和MAC地址之間的相互換算。
應(yīng)用程序編程接口
操作系統(tǒng)通過(guò)提供編程接口(API)來(lái)支持應(yīng)用程序的網(wǎng)絡(luò)開(kāi)發(fā),目前***的API是套接字(Socket),也叫Berkeley套接字。
Socket抽象層位于應(yīng)用層跟傳輸層之間,提供創(chuàng)建、綁定、監(jiān)聽(tīng)、連接、發(fā)送、接收、關(guān)閉等常用方法。

Internet協(xié)議
IP是TCP/IP協(xié)議族中的核心協(xié)議,為傳輸層提供IP數(shù)據(jù)報(bào)的交付能力,它負(fù)責(zé)將IP數(shù)據(jù)報(bào)從網(wǎng)絡(luò)一端傳遞到另一端,實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)發(fā)。
IP的另一個(gè)作用是:在發(fā)送端,接收來(lái)自傳輸層的協(xié)議數(shù)據(jù)單元(PDU),添加IP首部封裝為IP數(shù)據(jù)報(bào),交給協(xié)議族的下一層鏈路層。
在接收端(包括中間路由器),接收來(lái)自鏈路層的PDU,去掉IP首部,根據(jù)IP首部中的協(xié)議類型,將數(shù)據(jù)分發(fā)給TCP、UDP或者其他。
IP只是完成分組交換(轉(zhuǎn)發(fā)),如果你希望得到可靠性保證,IP會(huì)說(shuō):對(duì)不起,做不了。
發(fā)送一個(gè)IP數(shù)據(jù)報(bào)猶如寄一個(gè)快遞,只需把目的地收件人寫(xiě)在快遞上,快遞公司會(huì)路由分發(fā),但中間有可能丟件,丟了不管,而且到了,也不會(huì)有確認(rèn),一切隨緣。
基于TCP/IP協(xié)議族構(gòu)建的網(wǎng)絡(luò),可以區(qū)分為端系統(tǒng)(兩邊的主機(jī))和中間系統(tǒng)(中間路由器),端主機(jī)實(shí)現(xiàn)網(wǎng)絡(luò)所有層,而路由器實(shí)現(xiàn)傳輸層之下的所有層,IP使用逐跳協(xié)議,IP之上的各層使用端到端協(xié)議。
路由器
路由器工作于網(wǎng)絡(luò)層,是IP層的核心設(shè)備。
路由器有兩個(gè)或兩個(gè)以上的網(wǎng)絡(luò)接口,用于連接兩個(gè)或多個(gè)網(wǎng)絡(luò),負(fù)責(zé)將IP數(shù)據(jù)報(bào)(分組)從一個(gè)網(wǎng)絡(luò)接口轉(zhuǎn)發(fā)到另一個(gè)網(wǎng)絡(luò)接口。
帶有多網(wǎng)絡(luò)接口(網(wǎng)卡)的主機(jī)也能承擔(dān)轉(zhuǎn)發(fā)分組的功能,這種主機(jī)稱為作為路由器使用的主機(jī)。

如果把一個(gè)村莊比喻成一個(gè)小的局域網(wǎng),那路由器就相當(dāng)于連接村莊的橋梁,路由器屬于中間系統(tǒng),所以連接不同網(wǎng)絡(luò)的路由器需要實(shí)現(xiàn)不同的鏈路層協(xié)議,完成不同鏈路層的翻譯轉(zhuǎn)換功能。
另一方面,路由器實(shí)現(xiàn)鏈路層+網(wǎng)絡(luò)層這2層就夠了,而不必實(shí)現(xiàn)傳輸層和應(yīng)用層,這是由它的功能(實(shí)現(xiàn)分組交換)決定的。
每個(gè)IP分組都是一個(gè)IP數(shù)據(jù)報(bào),包含發(fā)送方和接收方的第三層地址(IP地址),即32位的IPv4或128位的IPv6,IP數(shù)據(jù)報(bào)首部中的目的地址決定將該數(shù)據(jù)報(bào)發(fā)往何處,而做出決定和發(fā)送數(shù)據(jù)報(bào)到下一跳的過(guò)程叫轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)依賴于路由表,是存儲(chǔ)于內(nèi)存中的一個(gè)數(shù)據(jù)結(jié)構(gòu)。
IP協(xié)議格式
在貼出IP協(xié)議格式之前,我們可以設(shè)想一下,IP協(xié)議需要包括哪些信息,這比直接上圖+死記硬背要好。
根據(jù)之前封裝的描述,顯然,IP數(shù)據(jù)報(bào)應(yīng)該是包括IP首部+數(shù)據(jù)負(fù)載,而這個(gè)不透明的負(fù)載(Payload)來(lái)自于TCP、UDP或者其他。
所以我們講IP數(shù)據(jù)報(bào)格式,其實(shí)就是IP首部的組成和結(jié)構(gòu),因?yàn)閿?shù)據(jù)負(fù)載來(lái)自于上層,而封裝的本質(zhì)要求上層的數(shù)據(jù)對(duì)下層隱藏、無(wú)須解釋,既然IP的Payload對(duì)于IP層透明,那自然沒(méi)什么可講的。
IP首部由各種不同用途和含義的字段組成。
因?yàn)镮P分32位的IPv4和128位的IPv6,所以IP首部需要包括版本號(hào)字段用來(lái)區(qū)分這兩種情況。
因?yàn)镮P負(fù)責(zé)分組轉(zhuǎn)發(fā),所以IP首部應(yīng)該包括目的IP地址,用于路由轉(zhuǎn)發(fā)邏輯的處理,另外接收端可能需要找到該分組的來(lái)源,所以也應(yīng)該包含來(lái)源IP地址。
TCP、UDP、ICMP、IGMP都通過(guò)IP數(shù)據(jù)報(bào)傳輸,所以在IP首部,需要包含一個(gè)協(xié)議字段,用于區(qū)分該IP數(shù)據(jù)報(bào)承載的是哪種類型的協(xié)議。
IP不糾錯(cuò),但是需要檢查錯(cuò)誤,數(shù)據(jù)在傳輸過(guò)程中,有可能出錯(cuò),導(dǎo)致接收到的數(shù)據(jù)跟發(fā)送的不一樣,所以接收端需要有方法知道傳輸過(guò)程中,數(shù)據(jù)是否跟發(fā)送端一致,所以頭部校驗(yàn)和字段也是必要的。
因?yàn)镮P要處理分片和重組,所以IP首部需要包含相關(guān)信息,以支持該功能。
IP分IPv4和IPv6兩種,協(xié)議格式不同,本文講述以IPv4為主,先給一個(gè)IPv4的數(shù)據(jù)報(bào)圖,不帶選項(xiàng)的IP數(shù)據(jù)報(bào)頭部為20字節(jié)。

- 版本,IP協(xié)議的***個(gè)字段都是版本字段,這也是IPv4和IPv6唯一相同的字段,IP數(shù)據(jù)報(bào)的版本字段為4對(duì)應(yīng)IPv4,為6對(duì)應(yīng)IPv6,主機(jī)或者路由器可以根據(jù)版本字段,分別處理IPv4或IPv6(稱為雙棧)。
- IHL,Internet頭部長(zhǎng)度,該字段為4位,表示頭部(包括選項(xiàng))32位字的數(shù)量,也就是說(shuō),真正的用字節(jié)表示的頭部長(zhǎng)度應(yīng)該是IHL的值,再乘以4(32位=4字節(jié)),因?yàn)?位能表示的***2進(jìn)制為1111,對(duì)應(yīng)十進(jìn)制15,所以IPv4的首部最多60(15*4)字節(jié)。
- DS,服務(wù)類型字段占6bit,顯示控制通知(ECN)占2bit,一共8bit,該8bit用來(lái)替換了最初版本的服務(wù)類型(ToS)字段,原因是ToS其實(shí)沒(méi)怎么被用。
- 總長(zhǎng)度字段,是IP數(shù)據(jù)報(bào)的總長(zhǎng)度,包括首部和數(shù)據(jù)。
接下來(lái)的32位字(4字節(jié)),標(biāo)識(shí)(16bit)+標(biāo)志(3bit)+分片偏移(13bit)用于分片和重組邏輯。
- TTL,生存期字段用于設(shè)置數(shù)據(jù)報(bào)可經(jīng)過(guò)路由器數(shù)量的上限。超此上限的IP數(shù)據(jù)報(bào)將被丟棄。
- 協(xié)議字段,8bit,提供多路分解功能,滿足IP協(xié)議可用于攜帶多種(TCP、UDP、ICMP、IGMP等)協(xié)議類型的有效載荷的要求,TCP對(duì)應(yīng)值17,UDP對(duì)應(yīng)值為6。
- 頭部校驗(yàn)和字段,僅計(jì)算IPv4頭部,不包括數(shù)據(jù),數(shù)據(jù)(Payload)的校驗(yàn)由傳輸層協(xié)議去保證,校驗(yàn)和的含義很簡(jiǎn)單明了,在發(fā)送端根據(jù)IP頭部的各位計(jì)算出一個(gè)數(shù)值,接收端根據(jù)接收到的IP頭部的各位重算一個(gè)數(shù)值,如果該值等于校驗(yàn)和字段,那就哦了,否則,傳輸過(guò)程中出錯(cuò)了,這個(gè)IP數(shù)據(jù)報(bào)不靠譜,扔了吧。
分片和重組
鏈路層對(duì)可傳輸?shù)膸幸粋€(gè)***長(zhǎng)度的限制,以太網(wǎng)對(duì)數(shù)據(jù)幀的長(zhǎng)度上限是1500字節(jié),鏈路層可傳輸幀的長(zhǎng)度限制叫做***傳輸單元(MTU)。
如果IP層有一個(gè)數(shù)據(jù)報(bào)要傳,且數(shù)據(jù)長(zhǎng)度比鏈路層的MTU還大,那么IP層就需要對(duì)該數(shù)據(jù)報(bào)分片(fragmentation),把超限的數(shù)據(jù)報(bào)切分為若干片,使得每片都小于MTU限制。
IP層接收到一份要發(fā)送的數(shù)據(jù)報(bào)時(shí),通過(guò)選路邏輯來(lái)決定向哪個(gè)接口(網(wǎng)卡)發(fā)送數(shù)據(jù),發(fā)送數(shù)據(jù)之前,需要查詢?cè)摻涌讷@得其MTU,然后將數(shù)據(jù)報(bào)長(zhǎng)度與MTU進(jìn)行比較,如果需要,則進(jìn)行分片,分片可以發(fā)生在原始發(fā)送端主機(jī),也可以發(fā)生在中間路由器上。
IP數(shù)據(jù)報(bào)分片后,到達(dá)目的地后才進(jìn)行重新組裝,恢復(fù)分片前的IP數(shù)據(jù)報(bào)信息,重組由目的主機(jī)的IP層完成。因此,分片和重組對(duì)傳輸層(TCP、UDP)透明,IP首部中的標(biāo)識(shí)、標(biāo)志、分片偏移字段為分片和重組提供了足夠的信息。
IP數(shù)據(jù)報(bào)首部中的標(biāo)識(shí)(16bit)保存分片的唯一值,這意味著屬于同一IP數(shù)據(jù)報(bào)的多個(gè)分片擁有相同的標(biāo)識(shí)值。
標(biāo)志(3bit)字段中的一位用來(lái)表示“是否有更多的片”,除***一片外,其他組成數(shù)據(jù)報(bào)的分片該位設(shè)1,***一片置0表示沒(méi)有更多的片,也就是***一片;片偏移字段用來(lái)標(biāo)識(shí)該片在原始IP數(shù)據(jù)報(bào)中的位置。
當(dāng)IP數(shù)據(jù)報(bào)切分為多個(gè)分片(IP數(shù)據(jù)報(bào))后,每個(gè)分片的總長(zhǎng)度字段(16bit)要更改為該片的長(zhǎng)度值。
對(duì)鏈路層而言,不管是完整的IP數(shù)據(jù)報(bào),還是IP數(shù)據(jù)報(bào)的一個(gè)分片,都以IP分組同等視之,分組是IP層把數(shù)據(jù)報(bào)傳遞給鏈路層的一個(gè)概念,既可能是一個(gè)獨(dú)立IP數(shù)據(jù)報(bào)也可能是一個(gè)IP數(shù)據(jù)報(bào)的分片。每個(gè)分組(分片)都有自己的IP首部,并在選路時(shí)與其他分組(分片)獨(dú)立路由,所以這些分片到達(dá)目的端可能失序,但I(xiàn)P首部有足夠信息重新組裝這些片。
任何一個(gè)分片的丟失,都要導(dǎo)致重傳整個(gè)數(shù)據(jù)報(bào),這是因?yàn)橹貍鳈C(jī)制在傳輸層,而分片對(duì)傳輸層透明。

上圖是UDP數(shù)據(jù)報(bào)在IP層的分片示例,可見(jiàn)UDP首部只存在***個(gè)分組(分片)之中,這很容易理解,因?yàn)榻?jīng)傳輸層封裝后的數(shù)據(jù)報(bào)對(duì)于IP層而言是透明的,IP不區(qū)分UDP首部和UDP數(shù)據(jù),它們都是不透明的Payload。
接收端在收到IP分片后,相同標(biāo)識(shí)值的分片屬于同一個(gè)被切分的數(shù)據(jù)報(bào),然后對(duì)分片偏移排序,更多片標(biāo)志位為0的分組是***一片,排序后的分組,如果分配偏移連續(xù),且***一個(gè)分組也到達(dá),則表示整個(gè)數(shù)據(jù)報(bào)都到達(dá)了,則恢復(fù)數(shù)據(jù)報(bào),否則繼續(xù)等待。
IP轉(zhuǎn)發(fā)
IP轉(zhuǎn)發(fā)的概念很簡(jiǎn)單,就是路由器為IP數(shù)據(jù)報(bào)挑選一個(gè)接口發(fā)送出去。
從發(fā)送端到目的端,之間經(jīng)歷的所有路由器構(gòu)成網(wǎng)絡(luò)路由的完整路徑,這跟從家到公司經(jīng)過(guò)的所有路口構(gòu)成的路徑類似。
當(dāng)網(wǎng)絡(luò)接口(網(wǎng)卡)收到數(shù)據(jù)報(bào)時(shí),IP模塊檢查數(shù)據(jù)報(bào)目的地址是否為自己的IP地址,如果是,數(shù)據(jù)報(bào)交付給由協(xié)議字段指定的協(xié)議模塊(TCP、UDP等),如果不是,則判斷IP層是否配置為路由器,如果是,則轉(zhuǎn)發(fā),如果不是,丟棄,因?yàn)橹鳈C(jī)不轉(zhuǎn)發(fā)那些不是由它生成的數(shù)據(jù)報(bào)。
IP層包含一些位于內(nèi)存中的信息,稱為路由表,每次轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)時(shí),都要查詢路由表,執(zhí)行最長(zhǎng)前綴匹配法,決定挑選哪個(gè)路由表項(xiàng)做數(shù)據(jù)轉(zhuǎn)發(fā)。IP轉(zhuǎn)發(fā)逐跳進(jìn)行,每次轉(zhuǎn)發(fā)假設(shè)離目的地更近一步,路由器和主機(jī)不包含到目的地的完整路徑信息。
路由表是路由條目的列表,每個(gè)路由條目包括以下幾項(xiàng)關(guān)鍵信息。
- 目的地:一個(gè)32位字段,用于與掩碼操作結(jié)果相匹配。
- 掩碼:一個(gè)32位字段,用于與IP數(shù)據(jù)報(bào)中的目的IP地址做按位與操作。
- 下一跳:下一個(gè)IP實(shí)體(路由器或者主機(jī))的32位IP地址,數(shù)據(jù)報(bào)將被轉(zhuǎn)發(fā)到該地址。
- 接口:用于將數(shù)據(jù)報(bào)發(fā)送給下一跳的網(wǎng)絡(luò)接口(網(wǎng)卡)。
選路過(guò)程:
- 首先取出數(shù)據(jù)報(bào)中的目的IP地址,然后與路由條目的掩碼字段進(jìn)行按位與,按位與的結(jié)果如果等于路由條目的目的地,則該條目與目的地IP匹配,該條目進(jìn)入候選集合。
- 從候選集合中選擇最匹配的條目,即掩碼最多位為1的條目,取出下一跳字段作為轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)的下一跳IP地址。
- 通過(guò)最匹配條目的網(wǎng)絡(luò)接口,發(fā)送到下一跳。
- 如果沒(méi)有匹配條目,則數(shù)據(jù)報(bào)無(wú)法交付,通過(guò)ICMP發(fā)送“主機(jī)不可達(dá)”通知發(fā)送主機(jī)。
通常路由表會(huì)有一個(gè)默認(rèn)路由項(xiàng)目,用于默認(rèn)路由,每經(jīng)過(guò)一個(gè)路由器,IP首部中的TTL字段都要自減1。




























