from http://joy0626.pixnet.net/blog/post/2109687-%5B%E8%AA%B2%E6%A5%AD%5D-ip%E8%A1%A8%E9%A0%AD%E6%A0%BC%E5%BC%8F%E4%BB%8B%E7%B4%B9
首先﹐讓我們看看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沒有設定的話﹐也就只有5 行的長度﹔我們知道每行有 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
|
可靠性要求﹐0 為正常值﹐ 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等等。要注意的是﹕這裡使用的協定是網路層的協定﹐這和上層的程式協定(如﹕FTP﹑HTTP 等)是不同的。您可以從 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 意見:
張貼留言