網際網路協定( IP )是整個 TCP/IP 協定的基礎﹐它的一些功能在前面的介紹 OSI 和 TCP/IP 模型的時候已經略略提過了﹐不過﹐由於它的重要性實在太值得了解﹐因此我們在這裡再深入的探討一下網際網路層的協定
而事實上
若 IP 這個環節若不過關的話
我會勸您別償試網路相關的工作了
否則會桶苦一輩子!
大體而言
網際網路協定的功能包括如下﹕
· 定義資網際網路中傳輸的基本單位
· 定義網際網路的定址方式
· 負責網路存取層和傳送層之間的資料傳遞
· 決定資料傳送的路由路徑
· 執行資料的分解和重組
這層協定主要要做的事情﹐是將從傳送層傳來的資料准確的送到遠端機器上
讓我們溫習一下剛學過的 ARP 協定﹐我們知道當主機獲得應該 IP 後﹐如果在 ARP 表格中找不到目的主機的實體位址的時候(因為底層的傳送是以實體位址為依據的)﹐那麼就理由 ARP 協定是以廣播的方式去尋問對方的實體位址
不過﹐這裡有一個限制﹕廣播封包是有限制的﹐只能在同一個網段( segment )上的節點才能收到廣播封包
假如當我們有一個封包﹐從教室傳到網際網路上地球另一邊的主機﹐那這時候要如何處理呢﹖
Okay﹐這就是 IP 協定要解決的問題了
讓我們先看看 IP 封包的格式吧
IP 封包表頭格式
首先﹐讓我們看看IP封包的組成部份﹐以及各部件的長度﹕
在上圖中﹐括號之內的數字就是各部件的長度 (bit)﹐如果您夠細心﹐就會計算得出每一行的總長度都是
bit
事實上
真正的封包是有連續的位元依序排列在一起的
之所以分行
完全是因為排版的關系
下面
我們分別對各部件名稱解釋一下﹕
Version
版本 (VER)
表示的是 IP 規格版本﹐目前的 IP 規格多為版本
(version
)﹐所以這裡的數值通常為
x
(注意﹕封包使用的數字通常都是十六進位的)
Internet Header Length
標頭長度 (IHL)
我們從 IP 封包規格中看到前面的
行為 header ﹐如果 Options 和 Padding沒有設定的話﹐也就只有
行的長度﹔我們知道每行有
bit ﹐也就是
byt e﹔那麼
列就是
byte 了
這個數值換成
進位就成了
x
﹐所以﹐當封包標頭長度為最短的時候﹐這裡數值會被換算為
x
Type of Service
服務類型 (TOS)
這裡指的是 IP 封包在傳送過程中要求的服務類型﹐其中一共由
個 bit 組成﹐每組 bit 組合分別代表不同的意思﹕
Total Length
封包總長 (TL)
通常以 byte 做單位來表示該封包的總長度﹐此數值包括標頭和數據的總和
Identification
識別碼 (ID)
每一個IP封包都有一個
bit 的唯一識別碼
我們從 OSI 和 TCP/IP 的網路層級知識裡面知道﹕當程式產生的數據要通過網路傳送時﹐都會在傳送層被拆散成封包形式發送﹐當封包要進行重組的時候﹐這個 ID 就是依據了
Flag
旗標 (FL)
這是當封包在傳輸過程中進行最佳組合時使用的
個 bit 的識別記號
請參考下表﹕
當此值為
的時候﹐表示目前未被使用
當此值為
的時候﹐表示封包可以被分割﹐若為
則不能被分割
當上一個值為
時﹐此值為
就示該封包是最後一個封包﹐如果為
則表示其後還有被分割的封包
Fragment Offset
分割定位 (FO)
當一個大封包在經過一些傳輸單位(MTU)較小的路徑時﹐會被被切割成碎片(fragment) 再進行傳送(這個切割和傳送層的打包有所不同﹐它是由網路層決定的)
由於網路情況或其它因素影響﹐其抵達順序並不會和當初切割順序一至的
所以當封包進行切割的時候﹐會為各片段做好定位記錄﹐所以在重組的時候﹐就能夠依號入座了
如果封包沒有被切割﹐那麼 FO 的值為
Time To Live
存活時間 (TTL)
這個 TTL 的概念﹐在許多網路協定中都會碰到
當一個封包被賦予 TTL 值(以秒或跳站數目(hop)為單位)﹐之後就會進行倒數計時
在 IP 協定中
TTL 是以 hop 為單位
每經過一個 router 就減一)﹐如果封包 TTL 值被降為
的時候﹐就會被丟棄
這樣﹐當封包在傳遞過程中由於某些原因而未能抵達目的地的時候﹐就可以避免其一直充斥在網路上面
有只叫做 traceroute 的程式﹐就是一個上佳的 TTL 利用實作﹐我們會在後面的章節裡面討論
Protocol
協定(PROT)
這裡指的是該封包所使用的網路協定類型﹐例如﹕ICMP 或 TCP/UDP 等等
要注意的是﹕這裡使用的協定是網路層的協定﹐這和上層的程式協定(如﹕FTP﹑HTTP 等)是不同的
您可以從 Linux 的 /etc/protocol 這個檔案中找到這些協定和其代號﹔其內容如下﹕
ip
IP # internet protocol
pseudo protocol number
icmp
ICMP # internet control message protocol
igmp
IGMP # Internet Group Management
ggp
GGP # gateway
gateway protocol
ipencap
IP
ENCAP # IP encapsulated in IP (officially ``IP
)
st
ST # ST datagram mode
tcp
TCP # transmission control protocol
egp
EGP # exterior gateway protocol
pup
PUP # PARC universal packet protocol
udp
UDP # user datagram protocol
hmp
HMP # host monitoring protocol
xns
idp
XNS
IDP # Xerox NS IDP
rdp
RDP #
reliable datagram
protocol
iso
tp
ISO
TP
# ISO Transport Protocol class
xtp
XTP # Xpress Tranfer Protocol
ddp
DDP # Datagram Delivery Protocol
idpr
cmtp
IDPR
CMTP # IDPR Control Message Transport
rspf
RSPF #Radio Shortest Path First
vmtp
VMTP # Versatile Message Transport
ospf
OSPFIGP # Open Shortest Path First IGP
ipip
IPIP # Yet Another IP encapsulation
encap
ENCAP # Yet Another IP encapsulation
Header Checksum
標頭檢驗值(HC)
這個數值主要用來檢錯用的﹐用以確保封包被正確無誤的接收到
當封包開始進行傳送後﹐接收端主機會利用這個檢驗值會來檢驗余下的封包﹐如果一切看來無誤﹐就會發出確認信息﹐表示接收正常
Source IP Address
來源位址(SA)
相信這個不用多解釋了﹐就是發送端的 IP 位址是也﹐長度為
bit
Destination IP Address
目的地位址(SA)
也就是接收端的 IP 位址﹐長度為
bit
Options & Padding
這兩個選項甚少使用﹐只有某些特殊的封包需要特定的控制﹐才會利用到
這裡也不作細表啦
前面所介紹的 IP 封包格式﹐請花點時間研究一下﹐因為在日後的網路生涯中﹐許多概念都要求設計者非常了解 IP 和 TCP 封包(標頭)的結構﹐例如﹕防火牆設定和 socket 程式設計
IP 位址
當我們知道 IP 封包結構之後﹐接著我們就要接觸一個在 TCP/IP 網路管理中最重要的一個概念﹕ 子網切割( subnetting )
子網路這個名詞我們前面不斷的碰到過﹐或許同學們心裡都很納悶它究竟是什麼東東?不過﹐在真正了解子網路的定義之前﹐我們必須要先了解的一個概念是 IP 位址
IP 位址雖然只有
組用小點 (
) 分開的數字(IP v
)﹐然而它卻是整個 TCP/IP 協定的基石
如果我們在討論 TCP/IP 網路的時候﹐不知道 IP 位址的各個數字代表什麼意思﹐那就什麼都免談了
那我們如何解讀出 IP 位址所隱含的深刻意思呢﹖首先
我們要具備一定的數學和邏輯基礎﹐下面兩個概念是一定要知道的﹕十進位和二進位的換算﹐以及基本邏輯運算
這裡不打算討論十進位和二進位的換算了﹐如果您忘記了﹐請回學校問問數學老師吧
然而﹐邏輯運算也不打算詳細討論了﹐下面只把在學習 IP 子網計算所需的幾個運算﹐作一簡單歸納而已﹕
如果不知道它們的工作原理﹐那麼以後我們在討論 IP 位址和子網的時候﹐您就只能靠死記一途了
不過
一旦你知道了其原理﹐那麼您在任何的 IP 網路中都不至於迷失﹐所謂
萬變不離其宗
是也
我們在前面講述網路存取層的時候﹐層介紹過 ifconfig 命令來查找界面實體位址
事實上
在命令的輸出結果裡面﹐還包含了一個非常重要的資訊﹕inet addr 和 Mask﹕
eth
Link encap:Ethernet HWaddr
:A
:
C:
:EA:
inet addr:
Bcast:
Mask:
UP BROADCAST RUNNING MULTICAST MTU:
Metric:
RX packets:
errors:
dropped:
overruns:
frame:
TX packets:
errors:
dropped:
overruns:
carrier:
collisions:
txqueuelen:
Interrupt:
Base address:
x
eth
Link encap:Ethernet HWaddr
:
:C
:
:
C:
A inet addr:
Bcast:
Mask:
From:http://tw.wingwit.com/Article/Common/201311/4675.html