若說起歷史,TCP/IP 也算得上是個冷戰時代的產物,它是應美國國防部的戰爭考量而提出開發的。TCP/IP 當初是用來配合 ARPANET (Advanced Research Projects Agency Network) 來處理不同硬體之間的連接問題的,比如 Sun 系統和 Mainframe、Mainframe 和個人電腦之間的連接。 事實上,TCP/IP 所指的是一整套龐大的通訊協定家族,其中以 Transmission Control Protocol(TCP) 及 Internet Protocol (IP) 這兩套協定最具代表性。IP 協定工作於網路層(以後會繼續和大家探討 OSI 的網路層級),它提供了一套標準讓不同的網路有規則可循。當然,前提是您想使用 IP 從一個網路將封包路由到另一個網路。IP 在設計上可用來在 LAN-LAN 及 PC-PC 之間進行傳輸的。 您可以把 IP 看成是游戲規則,而 TCP 則用來詮釋這些規則的。雖然 TCP/IP 原先是專門為幾所大學和機構的使用而設計的,但現在 TCP/IP 已經成為最流行的通訊協定了,我們使用的 Internet 就是用 TCP/IP 來傳送封包的了。下面就讓我們看看 TCP/IP 是怎樣工作的: 假如您的公司在好些地方都有分公司,各自都有著自己的本地網路(LAN),在總公司跑的是 PC 網路,但分公司大部份都是用麥金塔電腦。當 Mac 有數據要傳送給 PC 的時候將會如何呢? 首先,TCP 會在這兩個平臺建立起一個可以提供全雙工檢錯(對雙向的數據都進行錯誤檢測)的連接。 接著,IP 制定好 Mac 和 PC 之間的溝通規則,TCP 與上層協定制定用以連接的埠( port )。到這裡為止,Mac 端已經準備好數據了,如果數據太大,就將之分拆成幾份較小的封包,並且在封包上面加上一個新的 header (內含轉送位址),確保封包會被正確傳送。TCP/IP 還會加上標籤說明數據的種類及其長度。 再下來,IP 協定將負責將封包傳送給 PC。 最後,在 PC 上面的 TCP 將封包解碼並翻譯成 PC 能夠懂的格式,也就是它自己所使用的網路協定。
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) |
||||
|
|||||
在上圖中,括號之內的數字就是各部件的長度 (bit),如果您夠細心,就會計算得出每一行的總長度都是 32bit。事實上,真正的封包是有連續的位元依序排列在一起的,之所以分行,完全是因為排版的關係。下面,我們分別對各部件名稱解釋一下
版本 (VER)。表示的是 IP 規格版本,目前的 IP 規格多為版本 4 (version 4),所以這裡的數值通常為 0x4 (注意:封包使用的數字通常都是十六進位的)。
標頭長度 (IHL)。我們從 IP 封包規格中看到前面的 6 行為 header ,如果 Options 和 Padding沒有設定的話,也就只有5 行的長度﹔我們知道每行有 32bit ,也就是 4byt e﹔那麼, 5 列就是 20byte 了。20 這個數值換成 16 進位就成了 0x14,所以,當封包標頭長度為最短的時候,這裡數值會被換算為 0x14 。
服務類型 (TOS)。這裡指的是 IP 封包在傳送過程中要求的服務類型,其中一共由 8 個 bit 組成,每組 bit 組合分別代表不同的意思:
封包總長 (TL)。通常以 byte 做單位來表示該封包的總長度,此數值包括標頭和數據的總和。
識別碼 (ID)。每一個IP封包都有一個 16bit 的唯一識別碼。我們從 OSI 和 TCP/IP 的網路層級知識裡面知道:當程式產生的數據要通過網路傳送時,都會在傳送層被拆散成封包形式發送,當封包要進行重組的時候,這個 ID 就是依據了。
旗標 (FL)。這是當封包在傳輸過程中進行最佳組合時使用的 3 個 bit 的識別記號。
分割定位 (FO)。當一個大封包在經過一些傳輸單位(MTU)較小的路徑時,會被被切割成碎片(fragment) 再進行傳送(這個切割和傳送層的打包有所不同,它是由網路層決定的)。由於網路情況或其它因素影響,其抵達順序並不會和當初切割順序一至的。所以當封包進行切割的時候,會為各片段做好定位記錄,所以在重組的時候,就能夠依號入座了。 如果封包沒有被切割,那麼 FO 的值為“0”。
存活時間 (TTL)。這個 TTL 的概念,在許多網路協定中都會碰到。當一個封包被賦予 TTL 值(以秒或跳站數目(hop)為單位),之後就會進行倒數計時。在 IP 協定中,TTL 是以 hop 為單位,每經過一個 router 就減一),如果封包 TTL 值被降為 0 的時候,就會被丟棄。這樣,當封包在傳遞過程中由於某些原因而未能抵達目的地的時候,就可以避免其一直充斥在網路上面。有隻叫做 traceroute 的程式,就是一個上佳的 TTL 利用實作,我們會在後面的章節裡面討論。
協定(PROT)。這裡指的是該封包所使用的網路協定類型,例如:ICMP 或 TCP/UDP 等等。
標頭檢驗值(HC)。這個數值主要用來檢錯用的,用以確保封包被正確無誤的接收到。當封包開始進行傳送後,接收端主機會利用這個檢驗值會來檢驗餘下的封包,如果一切看來無誤,就會發出確認信息,表示接收正常。
來源位址(SA)。相信這個不用多解釋了,就是發送端的 IP 位址是也,長度為 32 bit。
目的地位址(SA)。也就是接收端的 IP 位址,長度為 32 bit。
這兩個選項甚少使用,只有某些特殊的封包需要特定的控制,才會利用到。