官术网_书友最值得收藏!

1.4.1 IP協(xié)議

IP協(xié)議是TCP/IP協(xié)議族中最為核心的協(xié)議。它把上層數(shù)據(jù)報(bào)封裝成IP數(shù)據(jù)報(bào)后進(jìn)行傳輸。如果IP數(shù)據(jù)報(bào)太大,還要對(duì)數(shù)據(jù)報(bào)進(jìn)行分片后再傳輸,到了目的地址處再進(jìn)行組裝還原,以適應(yīng)不同物理網(wǎng)絡(luò)對(duì)一次所能傳輸數(shù)據(jù)大小的要求。

1.IP協(xié)議的特點(diǎn)

(1)不可靠

不可靠的意思是它不能保證IP數(shù)據(jù)報(bào)能成功地到達(dá)目的地。IP協(xié)議僅提供最好的傳輸服務(wù)。如果發(fā)生某種錯(cuò)誤時(shí),如某個(gè)路由器暫時(shí)用完了緩沖區(qū),IP有一個(gè)簡(jiǎn)單的錯(cuò)誤處理算法:丟棄該數(shù)據(jù)報(bào),然后發(fā)送ICMP消息報(bào)給信源端。任何要求的可靠性必須由上層協(xié)議來提供(如TCP協(xié)議)。

(2)無連接

無連接的意思是IP協(xié)議并不維護(hù)任何關(guān)于后續(xù)數(shù)據(jù)報(bào)的狀態(tài)信息。每個(gè)數(shù)據(jù)報(bào)的處理是相互獨(dú)立的。這也說明,IP數(shù)據(jù)報(bào)可以不按發(fā)送順序接收。如果一信源向相同的信宿發(fā)送兩個(gè)連續(xù)的數(shù)據(jù)報(bào)(先是A,然后是B),每個(gè)數(shù)據(jù)報(bào)都是獨(dú)立地進(jìn)行路由選擇,可能選擇不同的路線,因此B可能在A之前先到達(dá)。

(3)無狀態(tài)

無狀態(tài)的意思是通信雙方不同步傳輸數(shù)據(jù)的狀態(tài)信息,無法處理亂序和重復(fù)的IP數(shù)據(jù)報(bào);IP數(shù)據(jù)報(bào)提供了標(biāo)識(shí)字段用來唯一標(biāo)識(shí)IP數(shù)據(jù)報(bào),用來處理IP分片和重組,不指示接收順序。

2.IPv4數(shù)據(jù)報(bào)的報(bào)頭格式

IPv4數(shù)據(jù)報(bào)的報(bào)頭格式如圖1-8所示,主要說明IPv4的報(bào)頭結(jié)構(gòu),IPv6的報(bào)頭結(jié)構(gòu)與之不同。圖1-8中的“數(shù)據(jù)”以上部分就是IP報(bào)頭的內(nèi)容。因?yàn)橛辛诉x項(xiàng)部分,所以IP報(bào)頭長(zhǎng)度是不定的。如果選項(xiàng)部分沒有,則IP報(bào)頭的長(zhǎng)度為(4+4+8+16+16+3+13+8+8+16+32+32)bit=160bit=20字節(jié),這也是IP報(bào)頭的最小長(zhǎng)度。

圖1-8

· 版本(Version):占用4 bit,標(biāo)識(shí)目前采用的IP協(xié)議的版本號(hào),一般取值為0100(IPv4)和0110(IPv6)。

· 首部長(zhǎng)度(Header Length):即IP報(bào)頭長(zhǎng)度,這個(gè)字段的作用是為了描述IP報(bào)頭的長(zhǎng)度。該字段占用4 bit,由于在IP報(bào)頭中有變長(zhǎng)的可選部分,為了能多表示一些長(zhǎng)度,因此采用4字節(jié)(32 bit)為本字段數(shù)值的單位,比如,4 bit最大能表示為1111,即15,單位是4字節(jié),因此最多能表示的長(zhǎng)度為15×4=60字節(jié)。

· 服務(wù)類型(Type of Service,TOS):占用8 bit,可用PPPDTRC0這8個(gè)字符來表示,其中,PPP定義了數(shù)據(jù)報(bào)的優(yōu)先級(jí),取值越大表示數(shù)據(jù)越重要,取值如表1-1所示。

表1-1 數(shù)據(jù)報(bào)的取值及其含義

D:時(shí)延,0表示普通,1表示延遲盡量小

T:吞吐量,0表示普通,1表示流量盡量大

R:可靠性,0表示普通,1表示可靠性盡量大

C:傳輸成本,0表示普通,1表示成本盡量小

0:這是最后一位,被保留,恒定為0

· 總長(zhǎng)度:占用16 bit,該字段表示以字節(jié)為單位的IP數(shù)據(jù)報(bào)的總長(zhǎng)度(包括IP報(bào)頭部分和IP數(shù)據(jù)部分)。如果該字段全為1,就是最大長(zhǎng)度了,即216?1= 65535字節(jié)≈ 63.9990234375KB,有些書上寫最大是64KB,其實(shí)是達(dá)不到的,最大長(zhǎng)度只能是65535字節(jié),而不是65536字節(jié)。

· 標(biāo)識(shí):在協(xié)議棧中保持著一個(gè)計(jì)數(shù)器,每產(chǎn)生一個(gè)數(shù)據(jù)報(bào),計(jì)數(shù)器就加1,并將此值賦給標(biāo)識(shí)字段。注意這個(gè)“標(biāo)識(shí)符”并不是序號(hào),IP是無連接服務(wù),數(shù)據(jù)報(bào)不存在按序接收的問題。當(dāng)IP數(shù)據(jù)報(bào)由于長(zhǎng)度超過網(wǎng)絡(luò)的MTU(Maximum Transmission Unit,最大傳輸單元)而必須分片(把一個(gè)大的網(wǎng)絡(luò)數(shù)據(jù)報(bào)拆分成一個(gè)個(gè)小的數(shù)據(jù)報(bào))時(shí),這個(gè)標(biāo)識(shí)字段的值就被復(fù)制到所有的小分片的標(biāo)識(shí)字段中。相同的標(biāo)識(shí)字段的值使得分片后的各數(shù)據(jù)報(bào)片最后能正確地重裝成為原來的大數(shù)據(jù)報(bào)。該字段占用16 bit。

· 標(biāo)志(Flags):該字段占用3 bit,該字段最高位不使用,第二位稱DF(Don't Fragment)位,DF位設(shè)為1時(shí)表明路由器不對(duì)該上層數(shù)據(jù)報(bào)分片。如果一個(gè)上層數(shù)據(jù)報(bào)無法在不分段的情況下進(jìn)行轉(zhuǎn)發(fā),則路由器會(huì)丟棄該上層數(shù)據(jù)報(bào)并返回一個(gè)錯(cuò)誤信息。最低位稱MF(More Fragments)位,為1時(shí)說明這個(gè)IP數(shù)據(jù)報(bào)是分片的,并且后續(xù)還有數(shù)據(jù)報(bào);為0時(shí)說明這個(gè)IP數(shù)據(jù)報(bào)是分片的,但已經(jīng)是最后一個(gè)分片了。

· 片偏移:該字段的含義是某個(gè)分片在原IP數(shù)據(jù)報(bào)中的相對(duì)位置。第一個(gè)分片的偏移量為0。片偏移以8個(gè)字節(jié)為偏移單位。這樣,每個(gè)分片的長(zhǎng)度一定是8字節(jié)(64位)的整數(shù)倍。該字段占13 bit。

· 生存時(shí)間(TTL,Time to Live,也稱存活時(shí)間):表示數(shù)據(jù)報(bào)到達(dá)目標(biāo)地址之前的路由跳數(shù)。TTL是由發(fā)送端主機(jī)設(shè)置的一個(gè)計(jì)數(shù)器,每經(jīng)過一個(gè)路由節(jié)點(diǎn)就減1,減到為0時(shí),路由就丟棄該數(shù)據(jù)報(bào),向源端發(fā)送ICMP差錯(cuò)報(bào)文。這個(gè)字段的主要作用是防止數(shù)據(jù)報(bào)不斷在IP互聯(lián)網(wǎng)絡(luò)上循環(huán)轉(zhuǎn)發(fā)。該字段占8 bit。

· 協(xié)議:該字段用來標(biāo)識(shí)數(shù)據(jù)部分所使用的協(xié)議,比如取值1表示ICMP、取值2表示IGMP、取值6表示TCP、取值17表示UDP、取值88表示IGRP、取值89表示OSPF。該字段占8 bit。

· 首部校驗(yàn)和(Header Checksum):該字段用于對(duì)IP頭部的正確性檢測(cè),但不包含數(shù)據(jù)部分。由于每個(gè)路由器會(huì)改變TTL的值,所以路由器會(huì)為每個(gè)通過的數(shù)據(jù)報(bào)重新計(jì)算首部校驗(yàn)和。該字段占16 bit。

· 起源和目標(biāo)地址:用于標(biāo)識(shí)這個(gè)IP數(shù)據(jù)報(bào)的起源和目標(biāo)IP地址。值得注意的是,除非使用NAT(網(wǎng)絡(luò)地址轉(zhuǎn)換),否則整個(gè)傳輸?shù)倪^程中,這兩個(gè)地址不會(huì)改變。這兩個(gè)地段都占用32 bit。

· 選項(xiàng)(可選):這是一個(gè)可變長(zhǎng)的字段。該字段屬于可選項(xiàng),主要是給一些特殊的情況使用,最大長(zhǎng)度是40字節(jié)。

· 填充(Padding):由于IP報(bào)頭長(zhǎng)度這個(gè)字段的單位為32bit,所以IP報(bào)頭的長(zhǎng)度必須為32bit的整數(shù)倍。因此,在可選項(xiàng)后面,IP協(xié)議會(huì)填充若干個(gè)0,以達(dá)到32bit的整數(shù)倍。

在Linux源碼中,IP報(bào)頭的定義如下:

     struct iphdr {
     #if defined(__LITTLE_ENDIAN_BITFIELD)
        __u8    ihl:4,
            version:4;
     #elif defined (__BIG_ENDIAN_BITFIELD)
        __u8    version:4,
              ihl:4;
     #else
     #error    "Please fix <asm/byteorder.h>"
     #endif
        __u8    tos;
        __be16    tot_len;
        __be16    id;
        __be16    frag_off;
        __u8    ttl;
        __u8    protocol;
        __sum16    check;
        __be32    saddr;
        __be32    daddr;
        /*The options start here. */
     };

這個(gè)定義可以在源碼目錄的include/uapi/linux/ip.h查到。

3.IP數(shù)據(jù)報(bào)分片

IP協(xié)議在傳輸數(shù)據(jù)報(bào)時(shí),將數(shù)據(jù)報(bào)分為若干分片(小數(shù)據(jù)報(bào))后進(jìn)行傳輸,并在目的系統(tǒng)中進(jìn)行重組,這一過程稱為分片(Fragmentation)。

要理解IP分片,首先要理解MTU,物理網(wǎng)絡(luò)一次傳送的數(shù)據(jù)是有最大長(zhǎng)度的,因此網(wǎng)絡(luò)層的下層(數(shù)據(jù)鏈路層)的傳輸單元(數(shù)據(jù)幀)也有一個(gè)最大長(zhǎng)度,這個(gè)最大長(zhǎng)度值就是MTU,每一種物理網(wǎng)絡(luò)都會(huì)規(guī)定鏈路層數(shù)據(jù)幀的最大長(zhǎng)度,比如以太網(wǎng)的MTU為1500字節(jié)。

IP協(xié)議在傳輸數(shù)據(jù)報(bào)時(shí),若IP數(shù)據(jù)報(bào)加上數(shù)據(jù)幀頭部后長(zhǎng)度大于MTU,則將數(shù)據(jù)報(bào)切分成若干分片后再進(jìn)行傳輸,并在目標(biāo)系統(tǒng)中進(jìn)行重組。IP分片既可能在源端主機(jī)進(jìn)行,也可能發(fā)生在中間的路由器處,因?yàn)椴煌W(wǎng)絡(luò)的MTU是不一樣的,而傳輸?shù)恼麄€(gè)過程可能會(huì)經(jīng)過不同的物理網(wǎng)絡(luò)。如果傳輸路徑上的某個(gè)網(wǎng)絡(luò)的MTU比源端網(wǎng)絡(luò)的MTU要小,路由器就可能對(duì)IP數(shù)據(jù)報(bào)再次進(jìn)行分片。分片數(shù)據(jù)的重組只會(huì)發(fā)生在目的端的IP層。

4.IP地址的定義

IP協(xié)議中有個(gè)概念叫IP地址。所謂IP地址,就是Internet中主機(jī)的標(biāo)識(shí),Internet中的主機(jī)要與別的主機(jī)通信必須具有一個(gè)IP地址。就像房子要有個(gè)門牌號(hào),這樣郵遞員才能根據(jù)信封上的地址送到目的地。

IP地址現(xiàn)在有兩個(gè)版本,分別是32位的IPv4和128位的IPv6,后者是為了解決前者不夠用的問題而產(chǎn)生的。每個(gè)IP數(shù)據(jù)報(bào)都必須攜帶目的IP地址和源IP地址,路由器依靠此信息為數(shù)據(jù)報(bào)選擇路由。

這里以IPv4為例,IP地址由四個(gè)數(shù)字組成,數(shù)字之間用小圓點(diǎn)隔開,每個(gè)數(shù)字的取值范圍在0~255之間(包括0和255)。通常有兩種表示形式:

(1)十進(jìn)制表示,比如192.168.0.1。

(2)二進(jìn)制表示,比如11000000.10101000.00000000.00000001。

兩種方式可以相互轉(zhuǎn)換,每8位二進(jìn)制數(shù)對(duì)應(yīng)一位十進(jìn)制數(shù),如圖1-9所示。

圖1-9

實(shí)際應(yīng)用中多用十進(jìn)制表示,比如172.16.100.2。

5.IP地址的兩級(jí)分類編址

互聯(lián)網(wǎng)有很多網(wǎng)絡(luò)構(gòu)成,每個(gè)網(wǎng)絡(luò)上都有很多主機(jī),這樣便構(gòu)成了一個(gè)有層次的結(jié)構(gòu)。IP地址在設(shè)計(jì)的時(shí)候就考慮到地址分配的層次特點(diǎn),把每個(gè)IP地址分割成網(wǎng)絡(luò)號(hào)(NetID)和主機(jī)號(hào)(HostID)兩個(gè)部分,網(wǎng)絡(luò)號(hào)表示主機(jī)屬于互聯(lián)網(wǎng)中的哪一個(gè)網(wǎng)絡(luò),而主機(jī)號(hào)則表示其屬于該網(wǎng)絡(luò)中的哪一臺(tái)主機(jī),兩者之間是主從關(guān)系。同一網(wǎng)絡(luò)中絕對(duì)不能有主機(jī)號(hào)完全相同的兩臺(tái)計(jì)算機(jī),否則會(huì)報(bào)出IP地址沖突。IP地址分為兩部分后,IP數(shù)據(jù)報(bào)從網(wǎng)際上的一個(gè)網(wǎng)絡(luò)到達(dá)另一個(gè)網(wǎng)絡(luò)時(shí),選擇路徑時(shí)可以基于網(wǎng)絡(luò)而不是主機(jī)。在大型的網(wǎng)際中,這一優(yōu)勢(shì)特別明顯,因?yàn)槁酚杀碇兄淮鎯?chǔ)網(wǎng)絡(luò)信息而不是主機(jī)信息,這樣可以大大簡(jiǎn)化路由表,方便路由器的IP尋址。

根據(jù)網(wǎng)絡(luò)地址和主機(jī)地址在IP地址中所占的位數(shù)可將IP地址分為A、B、C、D、E五類,每一類網(wǎng)絡(luò)可以從IP地址的第一個(gè)數(shù)字看出,如圖1-10所示。

圖1-10

這5類IP地址中,A類地址,第一位為0,第二至八位為網(wǎng)絡(luò)地址,第九至三十二位為主機(jī)地址,這類地址適用于為數(shù)不多的主機(jī)數(shù)大于65536(216)的大型網(wǎng)絡(luò),A類網(wǎng)絡(luò)地址的數(shù)量最多不超過126(27?2)個(gè),每個(gè)A類網(wǎng)絡(luò)最多可以容納16777214(224?2)臺(tái)主機(jī)。

B類地址前兩位分別為1和0,第三至第十六位為網(wǎng)絡(luò)地址,第十七至三十二位為主機(jī)地址,此類地址用于主機(jī)數(shù)介于256~65536(28~216)之間的中型網(wǎng)絡(luò),B類網(wǎng)絡(luò)數(shù)量最多16382(214?2)個(gè)。

C類地址前三位分別為1、1、0,四到二十四位為網(wǎng)絡(luò)地址,其余為主機(jī)地址,用于每個(gè)網(wǎng)絡(luò)只能容納254(28?2)臺(tái)主機(jī)的大量小型網(wǎng),C類網(wǎng)絡(luò)數(shù)量上限為2097150(221?2)個(gè)。

D類地址前四位為1、1、1、0,其余為多目地址。

E類地址前五位為1、1、1、1、0,其余位數(shù)留待后用。

A類IP的第一個(gè)字節(jié)范圍是0到126,B類IP的第一個(gè)字節(jié)范圍是128到191,C類IP的第一個(gè)字節(jié)范圍是192到223,例如192.X.X.X肯定是C類IP地址,根據(jù)IP地址的第一個(gè)字節(jié)的范圍就能夠推導(dǎo)出該IP屬于A類、B類或C類。

IP地址以A、B、C三類為主,又以B、C兩類地址更為常見。除此之外還有一些特殊用途的IP地址:廣播地址(主機(jī)地址全為1,用于廣播,這里的廣播是指同時(shí)向網(wǎng)上所有主機(jī)發(fā)送報(bào)文,不是指我們?nèi)粘B牭哪欠N廣播)、有限廣播地址(所有地址全為1,用于本網(wǎng)廣播)、本網(wǎng)地址(網(wǎng)絡(luò)地址全為0,后面的主機(jī)號(hào)表示本網(wǎng)地址)、回送測(cè)試地址(127.X.X.X型,用于網(wǎng)絡(luò)軟件測(cè)試及本地機(jī)進(jìn)程間通信)、主機(jī)位全0地址(這種地址的網(wǎng)絡(luò)地址就是本網(wǎng)地址)及保留地址(網(wǎng)絡(luò)號(hào)全為1和32位全為0兩種)。由此可見,網(wǎng)絡(luò)位全1或全0和主機(jī)位全1或全0都是不能隨意分配的。這也就是前面的A、B、C類網(wǎng)絡(luò)的網(wǎng)絡(luò)數(shù)及主機(jī)數(shù)要減2的原因。

總之,主機(jī)號(hào)全為0或全為1時(shí)分別作為本網(wǎng)絡(luò)地址和廣播地址使用,這種IP地址不能分配給用戶使用。D類網(wǎng)絡(luò)用于廣播,它可以將信息同時(shí)傳送到網(wǎng)上的所有設(shè)備,而不是點(diǎn)對(duì)點(diǎn)的信息傳送,這種網(wǎng)絡(luò)可以用來召開電視電話會(huì)議。E類網(wǎng)絡(luò)常用于試驗(yàn)。網(wǎng)絡(luò)管理員在配置網(wǎng)絡(luò)時(shí)不應(yīng)該采用D類和E類網(wǎng)絡(luò)。特殊的IP地址如表1-2所示。

表1-2 特殊的IP地址

當(dāng)前,A類地址已經(jīng)全部分配完,B類也不多了,為了有效并連續(xù)地利用剩下的C類地址,互聯(lián)網(wǎng)采用CIDR(Classless Inter Domain Routing,無類別域間路由)方式把許多C類地址合起來作B類地址分配,全球被分為四個(gè)地區(qū),每個(gè)地區(qū)分配一段連續(xù)的C類地址:歐洲(194.0.0.0~195.255.255.255)、北美(198.0.0.0~199.255.255.255)、中南美(200.0.0.0~201.255.255.255)、亞太地區(qū)(202.0.0.0~203.255.255.255)、保留備用(204.0.0.0~223.255.255.255)。這樣每一地區(qū)都有約3200萬個(gè)網(wǎng)址供使用。

6.網(wǎng)絡(luò)掩碼

在IP地址的兩級(jí)編址中,IP地址由網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)兩部分組成,如果我們把主機(jī)號(hào)部分全部置零,此時(shí)得到的地址就是網(wǎng)絡(luò)地址,網(wǎng)絡(luò)地址可以用于確定主機(jī)所在的網(wǎng)絡(luò),為此路由器只需計(jì)算出IP地址中的網(wǎng)絡(luò)地址,然后與路由表中存儲(chǔ)的網(wǎng)絡(luò)地址相比較就知道這個(gè)分組應(yīng)該從哪個(gè)接口發(fā)送出去。當(dāng)分組達(dá)到目的網(wǎng)絡(luò)后,再根據(jù)主機(jī)號(hào)抵達(dá)目的主機(jī)。

要計(jì)算出IP地址中的網(wǎng)絡(luò)地址,需要借助于網(wǎng)絡(luò)掩碼,或稱默認(rèn)掩碼。它是一個(gè)32位的數(shù),前面n位全部為1,后邊32~n位連續(xù)為0。A、B、C三類地址的網(wǎng)絡(luò)掩碼分別為255.0.0.0、255.255.0.0和255.255.255.0。我們通過IP地址和網(wǎng)絡(luò)掩碼進(jìn)行與運(yùn)算,得到的結(jié)果就是該IP地址的網(wǎng)絡(luò)地址。網(wǎng)絡(luò)地址相同的兩臺(tái)主機(jī),就是處于同一個(gè)網(wǎng)絡(luò)中,它們可以直接通信,而不必借助于路由器了。

舉個(gè)例子,現(xiàn)在有兩臺(tái)主機(jī)A和B,A的IP地址為192.168.0.1,網(wǎng)絡(luò)掩碼為255.255.255.0;B的IP地址為192.168.0.254,網(wǎng)絡(luò)掩碼為255.255.255.0。我們先對(duì)A運(yùn)行,把它的IP地址和子網(wǎng)掩碼每位相與:

     IP:          11010000.10101000.00000000.00000001
     子網(wǎng)掩碼:    11111111.11111111.11111111.00000000
     AND運(yùn)算
     網(wǎng)絡(luò)號(hào):      11000000.10101000.00000000.00000000
     轉(zhuǎn)換為十進(jìn)制:192.168.0.0

再把B的IP地址和子網(wǎng)掩碼每位相與:

     IP:          11010000.10101000.00000000.11111110
     子網(wǎng)掩碼:    11111111.11111111.11111111.00000000
     AND運(yùn)算
     網(wǎng)絡(luò)號(hào):      11000000.10101000.00000000.00000000
     轉(zhuǎn)換為十進(jìn)制:192.168.0.0

可以看到,A和B的兩臺(tái)主機(jī)的網(wǎng)絡(luò)號(hào)是相同的,因此可以認(rèn)為它們處于同一網(wǎng)絡(luò)。

由于IP地址越來越不夠用,為了不浪費(fèi),人們對(duì)每類網(wǎng)絡(luò)進(jìn)一步劃分出子網(wǎng),為此IP地址的編址又有了三級(jí)編址的方法,即子網(wǎng)內(nèi)的某個(gè)主機(jī)IP地址={<網(wǎng)絡(luò)號(hào)>,<子網(wǎng)號(hào)>,<主機(jī)號(hào)>},該方法中有了子網(wǎng)掩碼的概念。后來又提出了超網(wǎng)、無分類編址和IPv6。限于篇幅,這里不再贅述。

主站蜘蛛池模板: 云和县| 安陆市| 张北县| 保亭| 丹江口市| 裕民县| 茂名市| 永丰县| 虹口区| 莱州市| 阿克苏市| 泰来县| 公安县| 习水县| 外汇| 资中县| 徐闻县| 济阳县| 开阳县| 昭苏县| 辽阳县| 津市市| 沁阳市| 讷河市| 邯郸县| 会东县| 固始县| 武穴市| 沈丘县| 阿克陶县| 昌邑市| 叙永县| 太仆寺旗| 民丰县| 溧阳市| 来安县| 旬邑县| 郸城县| 鄂尔多斯市| 海丰县| 中江县|