IP協(xié)議頭格式的詳細(xì)分析
IP協(xié)議是我們學(xué)習(xí)網(wǎng)絡(luò)協(xié)議最開始,也是最基礎(chǔ)的協(xié)議。那么今天我們主要介紹一下有關(guān)于IP協(xié)議頭格式的基本狀態(tài)。那么就讓我們具體看以下有關(guān)于IP協(xié)議頭格式和Sniiffer Portable的IP頭的相關(guān)內(nèi)容吧。IP(Internet Protocol,因特網(wǎng)協(xié)議)是OSI第三層——網(wǎng)絡(luò)層協(xié)議,本節(jié)僅以IPv4版本為例進(jìn)行介紹。IP協(xié)議也是一個(gè)無(wú)連接的協(xié)議,主要就是負(fù)責(zé)在主機(jī)間尋址,并為數(shù)據(jù)包設(shè)定路由,在交換數(shù)據(jù)前它并不建立會(huì)話。因?yàn)樗槐WC正確傳遞。另一方面,數(shù)據(jù)在被收到時(shí),IP不需要收到確認(rèn),所以它是不可靠的。
IP協(xié)議頭格式
數(shù)據(jù)在經(jīng)過(guò)IP網(wǎng)絡(luò)層時(shí),也會(huì)對(duì)數(shù)據(jù)進(jìn)行封裝,也就有相應(yīng)的IP協(xié)議包頭了。在以太網(wǎng)幀中,IPv4包頭緊跟著以太網(wǎng)幀頭,同時(shí)以太網(wǎng)幀頭中的協(xié)議類型值設(shè)置為十六進(jìn)制的0800。
◆版本(Version)
指定IP協(xié)議的版本號(hào)。因?yàn)槟壳叭灾饕褂肐Pv4版本,所以這里的值通常是 0x4 (注意封包使用的數(shù)字通常都是十六進(jìn)位的)。占4位。
◆包頭長(zhǎng)度(Internet Header Length,IHL)
指明IPv4協(xié)議包頭長(zhǎng)度的字節(jié)數(shù)包含多少個(gè)32位。由于IPv4的包頭可能包含可變數(shù)量的可選項(xiàng),所以這個(gè)字段可以用來(lái)確定IPv4數(shù)據(jù)報(bào)中數(shù)據(jù)部分的偏移位置。IPv4包頭的最小長(zhǎng)度是20個(gè)字節(jié),因此IHL這個(gè)字段的最小值用十進(jìn)制表示就是5。占4位。由于它是一個(gè)4比特字段,因此首部最長(zhǎng)為60個(gè)字節(jié),但實(shí)際上目前最多仍為24個(gè)字節(jié)。
◆服務(wù)類型(Type of Service,TOS)
定義IP封包在傳送過(guò)程中要求的服務(wù)類型,共由8個(gè)bit組成其中每個(gè)bit的組合分別代表不同的意思。4bit中只能置其中1bit。如果所有4bit均為0,那么就意味著是一般服務(wù)。具體如下:
◆000..... (Routine): 過(guò)程字段,占3位。設(shè)置了數(shù)據(jù)包的重要性,取值越大數(shù)據(jù)越重要,取值范圍為:0(正常)~ 7(網(wǎng)絡(luò)控制)
◆...0....(Delay):延遲字段 ,占1位,取值:0(正常)、1(期特低的延遲)
◆....0...(Throughput):流量字段,占1位。取值:0(正常)、1(期特高的流量)
◆.....0..(Reliability) :可靠性字段,占1位。取值:0(正常)、1(期特高的可靠性)
◆…..0.(ECN-Capable Transport):顯式擁塞指示傳輸字段,占1位。由源端設(shè)置,以顯示源端節(jié)點(diǎn)的傳輸協(xié)議是支持ECN(Explicit Cogestion Notifica tion,顯式擁塞指示)的。取值:0(不支持ECN)、1(支持ECN)
◆.......0(Congestion Experienced):擁塞預(yù)警字段,占1位。取值:0(正常,不擁塞)、1(擁塞)
◆包長(zhǎng)度(Total Length,TL)
IP協(xié)議頭格式中指定IP包的總長(zhǎng),通常以byte做單位來(lái)表示該封包的總長(zhǎng)度此數(shù)值包括標(biāo)頭和數(shù)據(jù)的總和。它以字節(jié)為單位,占16位。利用首部長(zhǎng)度字段和總長(zhǎng)度字段,就可以知道IP數(shù)據(jù)報(bào)中數(shù)據(jù)內(nèi)容的起始位置和長(zhǎng)度。
由于該字段長(zhǎng)16比特,所以IP數(shù)據(jù)報(bào)最長(zhǎng)可達(dá)65535字節(jié)。盡管可以傳送一個(gè)長(zhǎng)達(dá)65535字節(jié)的IP數(shù)據(jù)報(bào),但是大多數(shù)的鏈路層都會(huì)對(duì)它進(jìn)行分段。而且,主機(jī)也要求不能接收超過(guò)576字節(jié)的數(shù)據(jù)報(bào)。由于TCP把用戶數(shù)據(jù)分成若干段,因此一般來(lái)說(shuō)這個(gè)限制不會(huì)影響TCP。UDP的應(yīng)用(如RIP、TFTP、BOOTP、DNS、SNMP等),都限制用戶數(shù)據(jù)報(bào)長(zhǎng)度為512字節(jié),小于576字節(jié)。但是,事實(shí)上現(xiàn)在大多數(shù)的實(shí)現(xiàn)允許超過(guò)8192字節(jié)的IP數(shù)據(jù)報(bào)。
總長(zhǎng)度字段是IP首部中必要的內(nèi)容,因?yàn)橐恍?shù)據(jù)鏈路(如以太網(wǎng))需要填充一些數(shù)據(jù)以達(dá)到最小長(zhǎng)度。盡管以太網(wǎng)的最小幀長(zhǎng)為46個(gè)字節(jié)(將在本章后面介紹),但是IP數(shù)據(jù)可能會(huì)更短。如果沒(méi)有總長(zhǎng)度字段,那么IP層就不知道46字節(jié)中有多少是IP數(shù)據(jù)報(bào)的內(nèi)容。
◆標(biāo)識(shí)(Identification)
每一個(gè)IP封包都有一個(gè)16位的唯一識(shí)別碼。當(dāng)程序產(chǎn)生的數(shù)據(jù)要通過(guò)網(wǎng)絡(luò)傳送時(shí)都會(huì)被拆散成封包形式發(fā)送,當(dāng)封包要進(jìn)行重組的時(shí)候這個(gè)ID就是依據(jù)了。占16位。
標(biāo)識(shí)字段唯一地標(biāo)識(shí)主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào)。通常每發(fā)送一份消息它的值就會(huì)加1。RFC791認(rèn)為標(biāo)識(shí)字段應(yīng)該由讓IP發(fā)送數(shù)據(jù)報(bào)的上層來(lái)選擇。假設(shè)有兩個(gè)連續(xù)的IP數(shù)據(jù)報(bào),其中一個(gè)是由TCP生成的,而另一個(gè)是由UDP生成的,那么它們可能具有相同的標(biāo)識(shí)字段。盡管這也可以照常工作(由重組算法來(lái)處理),但是在大多數(shù)從伯克利派生出來(lái)的系統(tǒng)中,每發(fā)送一個(gè)IP數(shù)據(jù)報(bào),IP層都要把一個(gè)內(nèi)核變量的值加1,不管交給IP的數(shù)據(jù)來(lái)自哪一層。內(nèi)核變量的初始值根據(jù)系統(tǒng)引導(dǎo)時(shí)的時(shí)間來(lái)設(shè)置。
◆標(biāo)記(Flags)
這是當(dāng)封包在傳輸過(guò)程中進(jìn)行***組合時(shí)使用的3個(gè)bit的識(shí)別記號(hào)。占3位。
◆000(Reserved Fragment):保留分段。當(dāng)此值為0的時(shí)候表示目前未被使用。
◆.0.(Don't Fragment):不分段。當(dāng)此值為0的時(shí)候表示封包可以被分段,如果為1則不能被分割。
◆..0( More Fragment):更多分段。當(dāng)上一個(gè)值為0時(shí),此值為0就示該封包是最後一個(gè)封包,如果為1則表示其後還有被分割的封包。
◆分段偏移(Fragment Offset,FO)
IP協(xié)議頭格式規(guī)定當(dāng)封包被分段之后,由于網(wǎng)路情況或其它因素影響其抵達(dá)順序不會(huì)和當(dāng)初切割順序一至,所以當(dāng)封包進(jìn)行分段的時(shí)候會(huì)為各片段做好定位記錄,以便在重組的時(shí)候就能夠?qū)μ?hào)入座。值為多少個(gè)字節(jié),如果封包并沒(méi)有被分段,則FO值為“0"。 占13位。 #p#
◆生存時(shí)間(Time To Live,TTL)
生存時(shí)間字段設(shè)置了數(shù)據(jù)報(bào)可以經(jīng)過(guò)的最多路由器數(shù),表示數(shù)據(jù)包在網(wǎng)絡(luò)上生存多久。TTL的初始值由源主機(jī)設(shè)置(通常為32或64),一旦經(jīng)過(guò)一個(gè)處理它的路由器,它的值就減去1。當(dāng)該字段的值為0時(shí),數(shù)據(jù)報(bào)就被丟棄,并發(fā)送ICMP消息通知源主機(jī)。這樣當(dāng)封包在傳遞過(guò)程中由於某些原因而未能抵達(dá)目的地的時(shí)候就可以避免其一直充斥在網(wǎng)路上面。占8位。
◆協(xié)議(Protocol,PROT)
指該封包所使用的網(wǎng)絡(luò)協(xié)議類型,如ICMP、DNS等。占8位。各協(xié)議對(duì)應(yīng)的值如表1所示。
表1 協(xié)議號(hào)
協(xié)議號(hào) |
協(xié)議 |
協(xié)議號(hào) |
協(xié)議 |
00 |
IP |
22 |
XNS-IDP |
01 |
ICMP |
27 |
RDP |
02 |
IGMP |
29 |
ISO-TP4 |
03 |
GGP |
36 |
XTP |
04 |
IP-ENCAP |
37 |
DDP |
05 |
ST |
39 |
IDPR-CMTP |
06 |
TCP |
73 |
RSPF |
08 |
EGP |
81 |
VMTP |
12 |
PUP |
89 |
OSPFIGP |
17 |
UDP |
94 |
IPIP |
20 |
HMP |
98 |
ENCAP |
◆頭校驗(yàn)和(Header checksum)
指IPv4數(shù)據(jù)報(bào)包頭的校驗(yàn)和。這個(gè)數(shù)值用來(lái)檢錯(cuò)用的,用以確保封包被正確無(wú)誤的接收到。當(dāng)封包開始進(jìn)行傳送后,接收端主機(jī)會(huì)利用這個(gè)檢驗(yàn)值會(huì)來(lái)檢驗(yàn)余下的封包,如果一切無(wú)誤就會(huì)發(fā)出確認(rèn)信息表示接收正常。與UDP和TCP協(xié)議包頭中的校驗(yàn)和作用是一樣的。占16位。
首部檢驗(yàn)和字段是根據(jù)IP首部計(jì)算的檢驗(yàn)和碼,不對(duì)首部后面的數(shù)據(jù)進(jìn)行計(jì)算。ICMP、IGMP、UDP和TCP協(xié)議在它們各自的首部中均含有同時(shí)覆蓋首部和數(shù)據(jù)檢驗(yàn)和碼。
IP協(xié)議頭格式規(guī)定了:計(jì)算一份數(shù)據(jù)報(bào)的IP檢驗(yàn)和,首先把檢驗(yàn)和字段置為0。然后,對(duì)首部中每個(gè)16位進(jìn)行二進(jìn)制反碼求和(整個(gè)首部看成是由一串16位的字組成),結(jié)果存在檢驗(yàn)和字段中。當(dāng)接收端收到一份IP數(shù)據(jù)報(bào)后,同樣對(duì)首部中每個(gè)16 位進(jìn)行二進(jìn)制反碼的求和。由于接收方在計(jì)算過(guò)程中包含了發(fā)送方存在首部中的檢驗(yàn)和,因此,如果首部在傳輸過(guò)程中沒(méi)有發(fā)生任何差錯(cuò),那么接收方計(jì)算的結(jié)果應(yīng)該為全1。如果結(jié)果不是全1(即檢驗(yàn)和錯(cuò)誤),那么IP就丟棄收到的數(shù)據(jù)報(bào)。但是不生成差錯(cuò)消息,由上層去發(fā)現(xiàn)丟失的數(shù)據(jù)報(bào)并進(jìn)行重傳。
ICMP、IGMP、UDP和TCP都采用相同的檢驗(yàn)和算法,盡管TCP和UDP除了本身的首部和數(shù)據(jù)外,在IP首部中還包含不同的字段。由于路由器經(jīng)常只修改TTL字段(減1),因此當(dāng)路由器轉(zhuǎn)發(fā)一份消息時(shí)可以增加它的檢驗(yàn)和,而不需要對(duì)IP整個(gè)首部進(jìn)行重新計(jì)算。
◆源地址(Source Address,SA)
發(fā)送IP數(shù)據(jù)包的IP地址。占32位。
◆目的地址(Destination Address)
接收IP數(shù)據(jù)包的IP地址。也占32位。
◆選項(xiàng)(Options)+填充(Padding)
這兩個(gè)選項(xiàng)較少使用,只有某些特殊的封包需要特定的控制才會(huì)利用到。共32位。這些選項(xiàng)通常包括:
◆安全和處理限制:用于軍事領(lǐng)域
◆記錄路徑:讓每個(gè)路由器都記下它的IP地址
◆時(shí)間戳:讓每個(gè)路由器都記下它的IP地址和時(shí)間
◆寬松的源站選路:為數(shù)據(jù)報(bào)指定一系列必須經(jīng)過(guò)的IP地址
◆嚴(yán)格的源站選路:與寬松的源站選路類似,但是要求只能經(jīng)過(guò)指定的這些地址,不能經(jīng)過(guò)其他的地址。
以上這些選項(xiàng)很少被使用,而且并非所有的主機(jī)和路由器都支持這些選項(xiàng)。選項(xiàng)字段一直都是以32位作為界限,在必要的時(shí)候插入值為0的填充字節(jié)。這樣就保證IP首部始終是32位的整數(shù)倍(這是首部長(zhǎng)度字段所要求的)。
從以上IP協(xié)議頭格式可以看出,IP協(xié)議包頭大小也有兩種:當(dāng)沒(méi)有“選項(xiàng)"這個(gè)字段時(shí),為160位,20個(gè)字節(jié);當(dāng)有“選項(xiàng)"字段時(shí)為192位,24個(gè)字節(jié)。它與TCP協(xié)議包頭大小是一樣的。