本文將介紹理解路由問題所需要的IP協(xié)議知識。互聯(lián)網(wǎng)上的大多數(shù)東西都使用IP協(xié)議。與以太網(wǎng)不同,了解這個(gè)協(xié)議對于理解網(wǎng)絡(luò)在更大范圍的應(yīng)用非常重要。在以后發(fā)表的文章中,這個(gè)講座將介紹TCP和UDP協(xié)議、路由理論、然后再深入研究具體的路由協(xié)議。
IP協(xié)議直接位于2層數(shù)據(jù)鏈路層之上,負(fù)責(zé)生成發(fā)往目的地的數(shù)據(jù)報(bào)。IP協(xié)議原來在RFC 791中定義,后來進(jìn)行了修改并且進(jìn)行了多次重新修訂。但是,IP協(xié)議的基本設(shè)計(jì)思想仍沒有變。IP層不提供任何類型的流量控制或者排序功能。這些功能留給上層。我們將使用“數(shù)據(jù)報(bào)” (datagram)這個(gè)詞匯指一個(gè)完整的IP信息,使用“數(shù)據(jù)包”(packet)這個(gè)詞匯指一個(gè)單個(gè)的IP數(shù)據(jù)包。
IP協(xié)議負(fù)責(zé)接收和發(fā)送指定IP地址數(shù)據(jù)包。但是,IP協(xié)議并不保證數(shù)據(jù)傳遞的可靠性。在IP協(xié)議層中沒有“重試一下”的概念。由于各種原因,數(shù)據(jù)包有可能出現(xiàn)丟失、損壞、重復(fù)、不按照順序傳遞或者延遲等問題。IP協(xié)議還負(fù)責(zé)處理IP選項(xiàng)并且以ICMP錯(cuò)誤和控制消息等方式提供反饋信息。
IP數(shù)據(jù)報(bào)頭有20個(gè)字節(jié)長,緊接在2層報(bào)頭后面(因?yàn)镮P協(xié)議是第3層協(xié)議)。IP數(shù)據(jù)部分包含一個(gè)完整的TCP或者UDP數(shù)據(jù)包等一切其它的信息,如下面的圖表所示。還要指出的是,如果使用IP選項(xiàng),IP數(shù)據(jù)報(bào)頭可以超過20個(gè)字節(jié)。
以太網(wǎng)報(bào)頭 | IPv4包頭 | 數(shù)據(jù)(TCP等) |
IP協(xié)議的目標(biāo)很簡單:生成發(fā)往目的地的數(shù)據(jù)報(bào),而且除了把這個(gè)數(shù)據(jù)包發(fā)送到下一跳路由器之外,不需要擔(dān)心任何事情。實(shí)際上,IP協(xié)議很復(fù)雜,否則,IP數(shù)據(jù)報(bào)頭就不需要那么多的字段。認(rèn)真研究IP數(shù)據(jù)報(bào)頭是非常重要的。這些字段從第一個(gè)字節(jié)開始的含義是:
•版本:使用的IP協(xié)議的版本。IPv4數(shù)據(jù)包將把這個(gè)字段設(shè)置為“4”。
•報(bào)頭長度:以4個(gè)字節(jié)的倍數(shù)的方式說明報(bào)頭的長度。因?yàn)楹苌偈褂肐P選項(xiàng)功能。因此,你很可能你看到它的值將是“5”,意味著報(bào)頭的長度是5個(gè)4字節(jié),也就是20個(gè)字節(jié)。
•服務(wù)類型:這個(gè)字段很少使用。但是,在理論上,這個(gè)字段旨在向路由器提供轉(zhuǎn)發(fā)隊(duì)列中特定IP數(shù)據(jù)報(bào)優(yōu)先級順序信息。主要用于提高服務(wù)質(zhì)量。主機(jī)可以選擇設(shè)置各種選項(xiàng),如低延遲、高數(shù)據(jù)吞吐量或者高可靠性等。大多數(shù)路由器都忽略這些選項(xiàng)。
•總長度:以字節(jié)為單位具體說明包括報(bào)頭在內(nèi)的整個(gè)IP數(shù)據(jù)包的總長度。因?yàn)檫@個(gè)字段有16位,所以IP數(shù)據(jù)包長度限制在65K之內(nèi)。這個(gè)數(shù)字定義的是字段所在的IP數(shù)據(jù)包,而不是整個(gè)IP數(shù)據(jù)報(bào)的長度。
•IP數(shù)據(jù)報(bào)ID:有時(shí)候稱作“段標(biāo)識符”。這個(gè)標(biāo)識符用來確定一個(gè)具體的IP數(shù)據(jù)包屬于哪一個(gè)IP數(shù)據(jù)報(bào)。如果IP協(xié)議需要把多個(gè)單個(gè)的IP數(shù)據(jù)包組合成一個(gè)IP數(shù)據(jù)報(bào),這個(gè)字段是必要的。
•標(biāo)志:DF(不分片)位在這個(gè)字段中用來指示路由器不要把IP數(shù)據(jù)包分段。這里也可以使用MF(更多地分片)標(biāo)識。
•段內(nèi)偏移量:原來數(shù)據(jù)報(bào)中的分段的偏移量,用64位的塊表示。
•生存時(shí)間(TTL):IP數(shù)據(jù)包在被銷毀之前包含的跳數(shù)。生存時(shí)間是為了避免無法發(fā)送的數(shù)據(jù)包永遠(yuǎn)在互聯(lián)網(wǎng)上流動。
•協(xié)議類型:具
當(dāng)路由器收到一個(gè)IP數(shù)據(jù)包的時(shí)候,路由器首先要檢查這個(gè)數(shù)據(jù)包的目的地。如果這臺路由器有一個(gè)通向目的地的路由,這臺路由器將減少這個(gè)數(shù)據(jù)包的TTL,重新計(jì)算校驗(yàn)和,然后再把這個(gè)數(shù)據(jù)包發(fā)出去。如果出現(xiàn)錯(cuò)誤,將會發(fā)出相應(yīng)的ICMP錯(cuò)誤通知,這個(gè)數(shù)據(jù)包將被丟棄。IP協(xié)議就是以這種最簡單的方式工作的:它遇到每一個(gè)數(shù)據(jù)包都要重復(fù)上述的步驟。
IP分段對于IP功能是非常重要的,它提供了這些報(bào)頭字段的真正含義。并非每一個(gè)發(fā)送數(shù)據(jù)包的物理網(wǎng)絡(luò)都能夠接受同樣大小的數(shù)據(jù)包。各種各樣的2層幀格式允許同時(shí)發(fā)送不同大小的數(shù)據(jù)。允許的最大的MTU是65KB,最小的是68字節(jié)。RFC 1122規(guī)定,所有的主機(jī)必須能夠重新組合最多為576字節(jié)的數(shù)據(jù)報(bào),但實(shí)際上是應(yīng)該能夠重新組合與系統(tǒng)接口的MTU規(guī)格相同的數(shù)據(jù)報(bào)。
當(dāng)在互聯(lián)網(wǎng)上發(fā)送一個(gè)IP數(shù)據(jù)報(bào)的時(shí)候,你不知道沿著每一個(gè)2層鏈路前進(jìn)的MTU將發(fā)生什么情況。你可能通過以太網(wǎng)連接自己的ISP。但是,你正在設(shè)法訪問的遠(yuǎn)程站點(diǎn)也許是在一個(gè)ISDN鏈路上。因此,你的IP數(shù)據(jù)包在到達(dá)最后一個(gè)跳點(diǎn)之前必須要分段。分段可能需要進(jìn)行多次。如果我們要向一個(gè)通過ISDN連接的遠(yuǎn)程站點(diǎn)發(fā)送一個(gè)2000個(gè)字節(jié)的數(shù)據(jù)包,我們原來可能把這個(gè)數(shù)據(jù)包分段以便符合我們的1500個(gè)字節(jié)的鏈路要求。但它大于576字節(jié)(ISDN的MTU)。因此,在到達(dá)ISDN鏈路之前的最后一個(gè)路由器必須還要對這個(gè)數(shù)據(jù)包分段。
應(yīng)該知道,IP不是一個(gè)可靠的協(xié)議。因此,如果任何IP分段在傳輸?shù)穆窂街衼G失,整個(gè)數(shù)據(jù)報(bào)必須要重新發(fā)送。IP沒有辦法要求得到數(shù)據(jù)報(bào)中丟失的特定部分。因此,當(dāng)出現(xiàn)錯(cuò)誤時(shí),其結(jié)果是重新發(fā)送該數(shù)據(jù)報(bào)所有的分段。有時(shí)候,阻塞的路由器不得不丟棄一些數(shù)據(jù)包。如果被丟棄的數(shù)據(jù)包恰巧是一個(gè)65KB數(shù)據(jù)報(bào)的一部分,那么,整個(gè)數(shù)據(jù)報(bào)必須要重新發(fā)送。TCP或者其它上層協(xié)議一般都知道一個(gè)完整的數(shù)據(jù)報(bào)是否全丟失了,并且能夠要求重新發(fā)送。然而,TCP協(xié)議不能告訴你一個(gè)數(shù)據(jù)報(bào)的片段是否丟失了,因?yàn)镮P收到數(shù)據(jù)報(bào)將是不完整的,并且永遠(yuǎn)不會向上層TCP協(xié)議發(fā)送這個(gè)數(shù)據(jù)報(bào)。如果TCP協(xié)議從來沒有收到這個(gè)數(shù)據(jù)報(bào),這個(gè)數(shù)據(jù)報(bào)最終將被重新發(fā)送。顯然,65K數(shù)據(jù)包的一小部分的丟失對于緩解一個(gè)阻塞的鏈路并沒有什么幫助,而是會引起更嚴(yán)重的阻塞。UDP應(yīng)用程序發(fā)送時(shí)的大小一般不超過576字節(jié),這有兩個(gè)原因。第一,MTU小于576字節(jié)的鏈路并不多,因此,這個(gè)IP數(shù)據(jù)報(bào)將不會分段。第二,要記住,576是所有采用IP協(xié)議的端點(diǎn)系統(tǒng)的特殊數(shù)字:它們必須能夠把數(shù)據(jù)報(bào)重新組合為這個(gè)大小。配置有限內(nèi)存的設(shè)備對于處理大于這個(gè)規(guī)格的數(shù)據(jù)可能會遇到困難,因此,這個(gè)做法值得推薦。
假設(shè)我們是一臺主機(jī),我們想發(fā)送一個(gè)1550個(gè)字節(jié)的數(shù)據(jù)報(bào)(1530個(gè)字節(jié)的數(shù)據(jù)+20個(gè)字節(jié)的報(bào)頭)。但是,我們的MTU是1500個(gè)字節(jié)。我們必須要分為兩個(gè)數(shù)據(jù)包發(fā)送,相關(guān)的IP報(bào)頭看起來是這樣的:
• fragment 0, offset = 0, size = 1480, MF位設(shè)置.
• fragment 1, offset = 1480, size = 50
分段中的IP ID和IP地址總是與原來IP數(shù)據(jù)報(bào)中內(nèi)容是一樣的。但是,報(bào)頭的校驗(yàn)值、偏離量和字段長度肯定要發(fā)生變化。當(dāng)另一方收到第一個(gè)數(shù)據(jù)包并且看到這個(gè)數(shù)據(jù)包是一個(gè)分段的時(shí)候,另一方將等待獲得其它的分段,并且把這些分段重新組合在一起,然后再發(fā)送給上層協(xié)議。
在這個(gè)數(shù)據(jù)報(bào)發(fā)出之后,假如在IP標(biāo)志中沒有設(shè)置DF字節(jié),我們就不會聽到任何有關(guān)這個(gè)數(shù)據(jù)報(bào)的消息。但是,如果這個(gè)鏈路的某一個(gè)地方的MTU是400字節(jié)會發(fā)生什么情況呢?在可以發(fā)送1480字節(jié)的數(shù)據(jù)包之前,這個(gè)鏈路中的路由器會先對這個(gè)數(shù)據(jù)包分段。上一篇教程的MTU路徑可用來解決中間路由器為數(shù)據(jù)包分段的問題。分段要耗費(fèi)時(shí)間和寶貴的路由器資源。我們避免過度分段的主要原因就是因?yàn)檫^度分段將不可避免地引起通信的延遲。
對數(shù)據(jù)包的重新組合總是在最后的目的地完成。因此,中間路由器不需要存儲IP數(shù)據(jù)報(bào)。這也意味著IP數(shù)據(jù)包能夠在不同的路徑上單獨(dú)地路由,而不會引起混亂。這是一個(gè)需要理解的重要的概念。這將使IP協(xié)議有多種用途。無論接收方以什么順序收到這個(gè)數(shù)據(jù)包,接收方都能夠根據(jù)IP報(bào)頭中的分段偏移量字段重新把數(shù)據(jù)報(bào)組合起來。
現(xiàn)在,我們理解了分段。我們發(fā)現(xiàn)分段提出了這樣一個(gè)問題:IP真的與數(shù)據(jù)鏈路層無關(guān)嗎?
小結(jié)
IP協(xié)議是不可靠的。當(dāng)IP數(shù)據(jù)包丟失的時(shí)候,要更高一層的協(xié)議認(rèn)識到數(shù)據(jù)包的丟失并且要求重新發(fā)送。
路由器在每一次發(fā)送IP數(shù)據(jù)包的時(shí)候都必須要重新計(jì)算IP報(bào)頭的校驗(yàn)值。
IP分段能夠讓路由器延遲發(fā)送一個(gè)數(shù)據(jù)包或者在多個(gè)鏈路上發(fā)送數(shù)據(jù)包。端點(diǎn)系統(tǒng)將能過重新組合整個(gè)IP數(shù)據(jù)報(bào)。
體指明下一個(gè)協(xié)議。也就是在IP數(shù)據(jù)包的數(shù)據(jù)部分中將遇到的報(bào)頭。
•頭校驗(yàn)和:一個(gè)報(bào)頭的校驗(yàn)和,而不是數(shù)據(jù)的校驗(yàn)和。
•IP源:原來發(fā)送數(shù)據(jù)包的主機(jī)的IP地址。
聯(lián)系客服