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