引言
IP協(xié)議是TCP/IP協(xié)議族中最核心的協(xié)議,所有的TCP,UDP、ICMP以及IGMP等協(xié)議都以IP數(shù)據(jù)報(bào)的格式傳輸。IP協(xié)議提供最好的傳輸服務(wù),其提供無連接、不可靠的數(shù)據(jù)傳輸?;蛟S這句話讀起來很矛盾,為什么說是最好的傳輸服務(wù),但同時(shí)又是不可靠的呢。
最好的傳輸可以認(rèn)為IP協(xié)議會盡一切能力到達(dá)目的主機(jī),若中途發(fā)生錯(cuò)誤無法到達(dá)目的主機(jī),也會返回一個(gè)ICMP錯(cuò)誤報(bào)文。收到IP協(xié)議返回的錯(cuò)誤報(bào)文后,本機(jī)就知道報(bào)文沒有成功到達(dá)目的主機(jī)。而接下來的傳輸可靠性,即重傳,則不屬于IP協(xié)議的范疇,而是通過TCP協(xié)議(或者自己實(shí)現(xiàn)的應(yīng)用層協(xié)議)來保證。
不可靠是指即使傳輸過程中出現(xiàn)錯(cuò)誤,IP協(xié)議并不負(fù)責(zé)處理報(bào)文重傳的工作,而是交給上層協(xié)議。
無連接是指IP協(xié)議的首部中不保存維護(hù)任何關(guān)于后續(xù)數(shù)據(jù)報(bào)的相關(guān)狀態(tài)信息。
3.2.IP首部
IP數(shù)據(jù)報(bào)的格式如圖3-1:
3-1
版本:IP協(xié)議的版本號,IPV4即為4
首部長度:包含任意選項(xiàng),以32位字為單位的長度。由于是一個(gè)4比特字段,可知IP首部最長為16*4字節(jié),即64字節(jié)
服務(wù)類型:包括一個(gè)3 bit的優(yōu)先權(quán)子字段(現(xiàn)在已被忽略),4 bit的TOS子字段和1 bit未用位但必須置0。4 bit的TOS分別代表:最小時(shí)延、最大吞吐量、最高可靠性和最小費(fèi)用。4 bit中只能置其中1 bit。如果所有4 bit均為0,那么就意味著是一般服務(wù)。
總長度:代表IP數(shù)據(jù)包的總長(包括其后承載的協(xié)議首部與用戶數(shù)據(jù)),由于其有16bit,單位為字節(jié)數(shù),可知IP數(shù)據(jù)報(bào)的總長度為65536字節(jié)。不過盡管IP首部允許其傳輸如此大的字節(jié)數(shù),以太網(wǎng)封裝的鏈路層也是不允許的,以太網(wǎng)封裝的鏈路層,最大允許承載的IP數(shù)據(jù)報(bào)長度為1500字節(jié)。并且主機(jī)也要求不能接收超過576字節(jié)的數(shù)據(jù)報(bào)。該限制不會影響到TCP協(xié)議,因?yàn)門CP協(xié)議會主動(dòng)將數(shù)據(jù)包分段傳輸。
標(biāo)識:唯一的標(biāo)識主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào),通常每發(fā)送一份數(shù)據(jù)報(bào)就會加1,在IP分片中起到順序重組的作用。
標(biāo)志:標(biāo)志該報(bào)文類型,在IP分片中代表該報(bào)文是否是分片報(bào)文
片偏移:分片報(bào)文中指明偏移量
生存時(shí)間TTL:設(shè)置數(shù)據(jù)報(bào)可以經(jīng)過的路由跳數(shù),每經(jīng)過一個(gè)路由則減1,減到0仍為到達(dá)目的主機(jī)則丟棄該報(bào)文??山鉀Q黑洞路由,報(bào)文一直占用帶寬的問題。TTL最大值為255.
協(xié)議:即指明IP首部后承載的協(xié)議類型,如ICMP/IGMP/TCP/UDP等,前文曾提到該字段。
首部檢驗(yàn)和:僅包括IP數(shù)據(jù)報(bào)首部的檢驗(yàn)和,檢驗(yàn)和的計(jì)算不包含其承載的IGMP/ICMP等協(xié)議的報(bào)文內(nèi)容。檢驗(yàn)和可以檢驗(yàn)IP數(shù)據(jù)報(bào)在傳輸過程中,首部是否出現(xiàn)的錯(cuò)誤。RFC 1071包含了如何計(jì)算檢驗(yàn)和的方法,感興趣可以了解。
源IP地址:即前文所述的32位互聯(lián)網(wǎng)地址,代表報(bào)文的始發(fā)主機(jī)。
目的ip地址:代表報(bào)文的目的主機(jī)。
選項(xiàng):是一個(gè)任選項(xiàng),可以用作以下領(lǐng)域,但很少被使用。
- 安全和處理限制(詳細(xì)內(nèi)容可參考RFC 1108)
- 記錄路徑(即報(bào)文傳輸過程中,讓經(jīng)過的路由器記錄其地址)
- 時(shí)間戳(即報(bào)文傳輸過程中,讓經(jīng)過的路由器記錄其時(shí)間與地址)
- 寬松的源站選路(為數(shù)據(jù)報(bào)選定一系列必須經(jīng)過的IP地址)
- 嚴(yán)格的源站選路(與寬松的源站選路類似,但是要求只能經(jīng)過指定的這些地址,不能經(jīng)過其他的地址)
很少被使用且并不是所有的主機(jī)與路由器都實(shí)現(xiàn)了這些選項(xiàng)。值得注意的是選項(xiàng)字段必須是32位的整數(shù)倍,因?yàn)槭撞块L度是32bit的整數(shù)倍。若未達(dá)到32位的整數(shù)倍,可以用0填充。
3.3.IP路由選路
IP協(xié)議提供的最本質(zhì)的服務(wù)之一就是為報(bào)文提供選路功能。
IP層的路由功能存在兩種模式,一種是路由器模式,一種是主機(jī)模式。一般來說,主機(jī)是不作為路由器模式使用。
路由器模式與主機(jī)模式的本質(zhì)區(qū)別在于系統(tǒng)是否轉(zhuǎn)發(fā)從網(wǎng)絡(luò)口接收進(jìn)來的報(bào)文。若配置為主機(jī)模式,則對目的ip非本機(jī)的報(bào)文,系統(tǒng)做丟棄處理,而路由器則會去查找路由表(提供選路信息的轉(zhuǎn)發(fā)表),若查找到則將該報(bào)文從對應(yīng)的網(wǎng)絡(luò)接口轉(zhuǎn)發(fā)出去,轉(zhuǎn)發(fā)之前需要更改報(bào)文的源目MAC地址,且TTL-1(如前文所述,為了防止黑洞路由占用帶寬),若TTL被減為0,則做丟棄處理不轉(zhuǎn)發(fā)。兩種模式對于目的ip屬于本機(jī)或者為廣播地址(廣播地址即前文所述的5類互聯(lián)網(wǎng)地址中主機(jī)號為全1的互聯(lián)網(wǎng)地址)的報(bào)文,數(shù)據(jù)報(bào)就被送到由I P首部協(xié)議字段所指定的協(xié)議模塊進(jìn)行處理。
包含選路信息的路由表中,一般都包含以下這些信息:
目的IP地址:可以是一個(gè)主機(jī)地址(即全掩碼的IP地址,主機(jī)號包含非0值,這種稱為主機(jī)路由),也可以是一個(gè)網(wǎng)絡(luò)地址(即非全掩碼的IP地址,主機(jī)號為全0,這種稱為網(wǎng)絡(luò)路由)
下一跳路由器的IP地址或直連IP的網(wǎng)絡(luò)地址:下一跳路由器的IP地址即報(bào)文需要轉(zhuǎn)發(fā)到的下一個(gè)網(wǎng)絡(luò)接口的IP地址(這個(gè)網(wǎng)絡(luò)接口與當(dāng)前的路由器直連);而直連IP的網(wǎng)絡(luò)地址會直接標(biāo)明該網(wǎng)段IP地址的路由出口,報(bào)文直接從該出口轉(zhuǎn)發(fā)(前提是該報(bào)文的目的IP必須存在,可通過ARP報(bào)文探測驗(yàn)證)。
標(biāo)志:指明路由的類型,例如路由是直連網(wǎng)絡(luò)地址還是真正的下一跳地址,路由時(shí)OSPF協(xié)議計(jì)算地址還是BGP協(xié)議學(xué)習(xí)地址等。
網(wǎng)絡(luò)接口:為數(shù)據(jù)報(bào)傳輸指定一個(gè)網(wǎng)絡(luò)接口。
IP路由選擇是逐跳地(hop-by-hop)進(jìn)行的。從這個(gè)路由表信息可以看出,IP并不知道到達(dá)任何目的的完整路徑(當(dāng)然,除了那些與主機(jī)直接相連的目的)。所有的I P路由選擇只為數(shù)據(jù)報(bào)傳輸提供下一站路由器的IP地址。它假定下一站路由器比發(fā)送數(shù)據(jù)報(bào)的主機(jī)更接近目的,而且下一站路由器與該主機(jī)是直接相連的。
IP路由選擇主要完成以下這些功能:
如果上面這些步驟都沒有成功,那么該數(shù)據(jù)報(bào)就不能被傳送。如果不能傳送的數(shù)據(jù)報(bào)來自本機(jī),那么一般會向生成數(shù)據(jù)報(bào)的應(yīng)用程序返回一個(gè)“主機(jī)不可達(dá)”或“網(wǎng)絡(luò)不可達(dá)”(即IP協(xié)議附屬ICMP協(xié)議報(bào)文)的錯(cuò)誤。
圖3-2,是我在一個(gè)路由器查看路由表的結(jié)果:
3-2
S代表該路由時(shí)靜態(tài)配置,不是通過協(xié)議生成。重點(diǎn)關(guān)注標(biāo)注的三條路由,分別是主機(jī)路由、網(wǎng)絡(luò)路由和默認(rèn)路由。查表時(shí),優(yōu)先查找主機(jī)路由表,若能匹配中,則報(bào)文直接按照查表結(jié)果轉(zhuǎn)發(fā)。若無法匹配中,則繼續(xù)查找網(wǎng)絡(luò)路由表,若匹配中網(wǎng)絡(luò)路由則按照查表結(jié)果轉(zhuǎn)發(fā)。若仍無法匹配中,查找是否存在默認(rèn)路由,存在的話匹配默認(rèn)路由轉(zhuǎn)發(fā)。若所有的都無法匹配中,那么丟棄該報(bào)文。
舉個(gè)例子,一個(gè)目的IP是200.1.1.2的報(bào)文進(jìn)來,那么直接命中主機(jī)路由表,報(bào)文直接按照查表結(jié)果,往下一跳網(wǎng)絡(luò)接口IP為192.168.3.1的路由器轉(zhuǎn)發(fā)。若進(jìn)來的報(bào)文目的IP為200.1.1.3,那么無法命中主機(jī)路由表,而命中了網(wǎng)絡(luò)路由表,那么就往下一跳網(wǎng)絡(luò)接口IP為192.168.4.1的路由器轉(zhuǎn)發(fā)。若進(jìn)來的報(bào)文目的IP為100.1.1.2,那么既不能命中主機(jī)路由表,也不能命中網(wǎng)絡(luò)路由表,只能命中默認(rèn)路由,那么就往下一跳網(wǎng)絡(luò)接口IP為101.0.0.1的路由器轉(zhuǎn)發(fā).
這里有人可能會疑問,明顯主機(jī)路由能更精確匹配,直接全部使用主機(jī)路由就完事了,為什么還需要網(wǎng)絡(luò)路由的存在。這里主要考慮的是資源容量問題,硬件資源是有限的,一個(gè)路由表不可能無限大,能讓你容納那么多的主機(jī)路由。因此,網(wǎng)絡(luò)路由是很有必要的,網(wǎng)絡(luò)路由的存在大大縮減了對路由表容量的要求。
值得注意的是,在這個(gè)轉(zhuǎn)發(fā)過程中,報(bào)文中的目的IP地址始終都未修改(使用源路由選項(xiàng)時(shí)會修改,但這種情況很少出現(xiàn)),所有的路由決策都是通過這個(gè)目的IP來決策。
3.4.子網(wǎng)尋址與子網(wǎng)掩碼
現(xiàn)在所有的主機(jī)都要求支持子網(wǎng)尋址(RFC 950規(guī)定)。不再把一個(gè)互聯(lián)網(wǎng)IP地址單純的認(rèn)作由網(wǎng)絡(luò)號與主機(jī)號組成,而是將主機(jī)號再次進(jìn)行劃分,主機(jī)號分為子網(wǎng)號和主機(jī)號兩部分。這么做的主要好處在于使得互聯(lián)網(wǎng)地址的使用更加靈活,因?yàn)橥粋€(gè)網(wǎng)絡(luò)號后是用不了這么多主機(jī)的,例如B類的互聯(lián)網(wǎng)地址,有16位的主機(jī)號,即可以包含2^16的主機(jī)數(shù)量,而往往這一個(gè)網(wǎng)絡(luò)號下不會存在這么多主機(jī),存在極大的浪費(fèi)。圖3-3展示了B類地址的一種子網(wǎng)編址方式。
3-3
這種對B類地址的子網(wǎng)劃分是比較典型的劃分方法,這種方式在利用點(diǎn)分十進(jìn)制的方式表示IP地址時(shí),可以很容易的區(qū)分子網(wǎng)號和主機(jī)號。大部分對互聯(lián)網(wǎng)地址的劃分都是對B類互聯(lián)網(wǎng)地址的劃分,其實(shí)對C類地址也是可以劃分的,只是C類地址的主機(jī)號本身只有8位,可用來劃分的位數(shù)較少。不止C類地址,A類地址也是經(jīng)常會被劃分。
總結(jié)一句,這種劃分子網(wǎng)的方式非常靈活,不一定需要8位一個(gè)整體的劃分,可以通過子網(wǎng)掩碼來精確劃分到具體的位。例如一個(gè)A類地址表示成40.40.40.2/24,那么24就標(biāo)識前24位屬于網(wǎng)絡(luò)號+子網(wǎng)號,而我們知道A類地址的網(wǎng)絡(luò)號只有8位,可以知道該地址的網(wǎng)絡(luò)號為前8位,即40,而子網(wǎng)號有16位,即40.40,主機(jī)號為2。掩碼有一種經(jīng)常使用的表示方法,40.40.40.2/24這個(gè)也可以等價(jià)表示為40.40.40.2 255.255.255.0,其中255.255.255.0就是我們所說的真正的子網(wǎng)掩碼。
3.5.ifconfig命令與netstat命令
既然我們已經(jīng)了解了所謂的IP地址與子網(wǎng)掩碼,那么在我們的主機(jī)上可以如何查看自己的網(wǎng)絡(luò)接口所屬的IP地址與相應(yīng)的子網(wǎng)掩碼呢。
在unix系統(tǒng)與類unix系統(tǒng)(linux)上可以使用ifconfig命令查看相應(yīng)的ip地址,圖3-4是我在一個(gè)linux系統(tǒng)上用命令查看的結(jié)果
3-4
可以看到存在多個(gè)網(wǎng)絡(luò)接口,分別分配有B類地址,C類地址與環(huán)回地址,其中netmask即子網(wǎng)掩碼,可以發(fā)現(xiàn)在這臺主機(jī)上,子網(wǎng)掩碼與互聯(lián)網(wǎng)地址的網(wǎng)絡(luò)號位數(shù)相同。同時(shí)可以發(fā)現(xiàn),各個(gè)網(wǎng)絡(luò)接口的MTU最大值為1500(前文鏈路層所述,以太網(wǎng)接口的IP數(shù)據(jù)報(bào)MTU范圍為46-1500),而環(huán)回接口的MTU為65536,是IP首部所能承載的最大數(shù)據(jù)報(bào)字節(jié)數(shù)。這是因?yàn)榄h(huán)回接口接收的包是由本機(jī)發(fā)出,不需經(jīng)過網(wǎng)絡(luò)傳輸(前文TCP/IP簡介所述,MTU的限制與傳輸時(shí)延相關(guān)),因此可以發(fā)最大的IP數(shù)據(jù)報(bào)。
除了ifconfig可以查詢本機(jī)網(wǎng)絡(luò)接口的信息,也可以通過netstat -in來查看主機(jī)的網(wǎng)絡(luò)接口與IP地址。
3.6.小結(jié)
本篇主要講述了