2012年10月6日 星期六

IP 封包表頭格式介紹






首先﹐讓我們看看IP封包的組成部份﹐以及各部件的長度﹕
Version (4)


Internet Header Length (4)


Type of Service (8)


Total Length (16)


Identification (16)


Flags (3)


Fragment Offset (13)


Time To Live (8)


Protocol (8)


Header checksum (16)


Source Address (32)


Destination Address (32)


Options (Variable)


Padding (0-24)


 
Data
....


      
IP 封包格式
每一行的總長度都是 32bit。事實上,真正的封包是由連續的位元依序排列在一起的,我們分別對各部件名稱解釋一下﹕
Version

版本 (VER)。表示的是 IP 規格版本﹐目前的 IP 規格多為版本 4 (version 4)﹐所以這裡的數值通常為 0x4 (注意﹕封包使用的數字通常都是十六進位的)
Internet Header Length

標頭長度 (IHL)。我們從 IP 封包規格中看到前面的 6 行為 header ﹐如果 Options Padding沒有設定的話﹐也就只有行的長度﹔我們知道每行有 32bit ﹐也就是4byte﹔那麼, 5 列就是 20byte 了。20 這個數值換成 16 進位就成了 0x14﹐所以﹐當封包標頭長度為最短的時候﹐這裡數值會被換算為 0x14 
Type of Service

服務類型 (TOS)。這裡指的是 IP 封包在傳送過程中要求的服務類型﹐其中一共由 8 bit 組成﹐每組 bit 組合分別代表不同的意思﹕
000.....


Routine


設定 IP 順序﹐預設為 0 ﹐否則﹐數值越高越優先


...0....


Delay


延遲要求﹐ 0 是正常值﹐ 1 為低要求


....0...


Throughput


通訊量要求﹐ 0 為正常值﹐ 1 為高要求


.....0..


Reliability


可靠性要求﹐為正常值﹐ 1 為高要求


......00


Not Used


未使用


Total Length

封包總長 (TL)。通常以 byte 做單位來表示該封包的總長度﹐此數值包括標頭和數據的總和。
Identification

識別碼 (ID)。每一個IP封包都有一個 16bit 的唯一識別碼。我們從 OSI  TCP/IP的網路層級知識裡面知道﹕當程式產生的數據要通過網路傳送時﹐都會在傳送層被拆散成封包形式發送﹐當封包要進行重組的時候﹐這個 ID 就是依據了。
Flag

旗標 (FL)。這是當封包在傳輸過程中進行最佳組合時使用的 3  bit 的識別記號。請參考下表﹕
000.


當此值為 0 的時候﹐表示目前未被使用。


.0..


當此值為 0 的時候﹐表示封包可以被分割﹐若為 1 則不能被分割。


..0.


當上一個值為 0 時﹐此值為 0 就示該封包是最後一個封包﹐如果為 1 則表示其後還有被分割的封包。


Fragment Offset

分割定位 (FO)。當一個大封包在經過一些傳輸單位(MTU)較小的路徑時﹐會被被切割成碎片(fragment) 再進行傳送(這個切割和傳送層的打包有所不同﹐它是由網路層決定的)。由於網路情況或其它因素影響﹐其抵達順序並不會和當初切割順序一至的。所以當封包進行切割的時候﹐會為各片段做好定位記錄﹐所以在重組的時候﹐就能夠依號入座了。
如果封包沒有被切割﹐那麼 FO 的值為“0”。
Time To Live

存活時間 (TTL)。這個 TTL 的概念﹐在許多網路協定中都會碰到。當一個封包被賦予 TTL (以秒或跳站數目(hop)為單位)﹐之後就會進行倒數計時。在 IP 協定中,TTL 是以 hop 為單位,每經過一個 router 就減一)﹐如果封包 TTL 值被降為 0的時候﹐就會被丟棄。這樣﹐當封包在傳遞過程中由於某些原因而未能抵達目的地的時候﹐就可以避免其一直充斥在網路上面。有隻叫做 traceroute 的程式﹐就是一個上佳的 TTL 利用實作﹐我們會在後面的章節裡面討論。
Protocol

協定(PROT)。這裡指的是該封包所使用的網路協定類型﹐例如﹕ICMP  TCP/UDP等等。要注意的是﹕這裡使用的協定是網路層的協定﹐這和上層的程式協定(如﹕FTPHTTP )是不同的。您可以從 Linux  /etc/protocol 這個檔案中找到這些協定和其代號﹔其內容如下﹕
------------------------------------------------------
ip      0       IP              # internet protocol, pseudo protocol number
icmp    1       ICMP            # internet control message protocol
igmp    2       IGMP            # Internet Group Management
ggp     3       GGP             # gateway-gateway protocol
ipencap 4       IP-ENCAP        # IP encapsulated in IP (officially ``IP'')
st      5       ST              # ST datagram mode
tcp     6       TCP             # transmission control protocol
egp     8       EGP             # exterior gateway protocol
pup     12      PUP             # PARC universal packet protocol
udp     17      UDP             # user datagram protocol
hmp     20      HMP             # host monitoring protocol
xns-idp 22      XNS-IDP         # Xerox NS IDP
rdp     27      RDP             # "reliable datagram" protocol
iso-tp4 29      ISO-TP4         # ISO Transport Protocol class 4
xtp     36      XTP             # Xpress Tranfer Protocol
ddp     37      DDP             # Datagram Delivery Protocol
idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport
rspf    73      RSPF            #Radio Shortest Path First.
vmtp    81      VMTP            # Versatile Message Transport
ospf    89      OSPFIGP         # Open Shortest Path First IGP
ipip    94      IPIP            # Yet Another IP encapsulation
encap   98      ENCAP           # Yet Another IP encapsulation
------------------------------------------------------
Header Checksum

標頭檢驗值(HC)。這個數值主要用來檢錯用的﹐用以確保封包被正確無誤的接收到。當封包開始進行傳送後﹐接收端主機會利用這個檢驗值會來檢驗餘下的封包﹐如果一切看來無誤﹐就會發出確認信息﹐表示接收正常。
Source IP Address

來源位址(SA)。相信這個不用多解釋了﹐就是發送端的 IP 位址是也﹐長度為 32 bit
Destination IP Address

目的地位址(DA)。也就是接收端的 IP 位址﹐長度為 32 bit
Options & Padding

這兩個選項甚少使用﹐只有某些特殊的封包需要特定的控制﹐才會利用到。這裡也不作細表啦。
前面所介紹的 IP 封包格式﹐請花點時間研究一下﹐因為在日後的網路生涯中﹐許多概念都要求設計者非常了解 IP 和 TCP 封包(標頭)的結構﹐例如﹕防火牆設定和 socket 程式設計。

0 意見:

張貼留言

 

MangoHost Copyright © 2009 Cookiez is Designed by Ipietoon for Free Blogger Template