現在我們知道 IP 這個資料封包 (packet) 是需要放置在 MAC 訊框裡面的,所以當然不能比 MAC 所能容許的最大資料量還大!但是 IP 封包其實可以到 65535 bytes 那麼大的吶! 那麼 IP 封包除了資料之外,他的表頭資料 (head) 是長怎樣呢? 在
圖三的 MAC 訊框表頭裡面最重要的莫過於那個網路卡硬體位址, 那麼在 IP 表頭裡面當然就以來源與目標的 IP 位址為最重要囉! 除此之外, IP 表頭裡面還含有哪些重要資料呢?如底下所示:(下圖第一行為每個欄位的
bit 數)
Type of Service(服務類型) 這個項目的內容為『PPPDTRUU』,表示這個 IP 封包的服務類型,主要分為: PPP:表示此 IP 封包的優先度; D:若為 0 表示一般延遲(delay),若為 1 表示為低延遲; T:若為 0 表示為一般傳輸量 (throughput),若為 1 表示為高傳輸量; R:若為 0 表示為一般可靠度(reliability),若為 1 表示高可靠度。 UU:保留尚未被使用。 我們前面談到 gigabit 乙太網路時曾提到 Jumbo frame 對吧!可以提高 MTU, 由於 gigabit 乙太網路的種種相關規格可以讓這個 IP 封包加速且降低延遲, 某些特殊的標誌就是在這裡說明的。
Total Length(總長度) 指這個 IP 封包的總容量,包括表頭與內容 (Data) 部分。最大可達 65535 bytes。
Identification(辨別碼) 我們前面提到 IP 袋子必須要放在 MAC 袋子當中。不過,如果 IP 袋子太大的話, 就得先要將 IP 再重組成較小的袋子然後再放到 MAC 當中。而當 IP 被重組時, 每個來自同一筆資料的小 IP 就得要有個識別碼以告知接收端這些小 IP 其實是來自同一個封包才行。 也就是說,假如 IP 封包其實是 65536 那麼大 (前一個 Total Length 有規定), 那麼這個 IP 就得要再被分成更小的 IP 分段後才能塞進 MAC 訊框中。那麼每個小 IP 分段是否來自同一個 IP 資料,呵呵!這裡就是那個識別碼啦!
Fragment Offset(分段偏移) 表示目前這個 IP 分段在原始的 IP 封包中所佔的位置。 就有點像是序號啦,有這個序號才能將所有的小 IP 分段組合成為原本的 IP 封包大小嘛! 透過 Total Length, Identification, Flags 以及這個 Fragment Offset 就能夠將小 IP 分段在收受端組合起來囉!
Time To Live(TTL, 存活時間) 表示這個 IP 封包的存活時間,範圍為 0-255。當這個 IP 封包通過一個路由器時, TTL 就會減一,當 TTL 為 0 時,這個封包將會被直接丟棄。說實在的,要讓 IP 封包通過 255 個路由器,還挺難的~ ^_^
Protocol Number(協定代碼) 由於網路上面的封包協定太多了,每個協定都是裝在 IP 當中的, 所以 IP 當然就得在表頭上面告知收受端,這個 IP 內含有的資料是什麼協定才行。 一般常見的網路協定如下所示:
你只要知道 IP 表頭裡面還含有: TTL, Protocol, 來源 IP 與目標 IP 也就夠了! 而這個 IP 表頭的來源與目標 IP ,以及那個判斷通過多少路由器的 TTL ,就能瞭解到這個 IP 將被如何傳送到目的端吶。下一節我們將介紹一下那麼 IP 封包是如何被傳送到目的地?
TCP 協定
在前幾個小節內談到的 IP 與路由的相關說明中,我們知道 IP 與路由僅能將資料封包傳送到正確的目標而已, 但是這個目的地是否真的能夠收下來這個封包?那可就不一定了。要確認該資料能否正確的被目的端所接收, 就必須要在資料封包上面多加一些參數來判斷才行。
在前面的 OSI 七層協定當中,在網路層的 IP 之上則是傳送層,而傳送層的資料打包成什麼? 最常見的就是 TCP 封包了。這個 TCP 封包資料必須要能夠放到 IP 的資料袋當中才行喔! 所以,我們可以將 MAC, IP 與 TCP 的封包資料這樣看:
圖十一、各封包之間的相關性
所以說,IP 除了表頭之外的 Data 內容其實就是 TCP 封包的表頭與內容;而 MAC 的 Data 內容, 就是一個完整的 IP 封包資料!這也是我們上頭提到的,最終還是得以 MAC 能夠支援的最大容許容量, 才能夠決定 IP 與 TCP 封包是否需要再進行分段的工作。那麼既然 MAC 與 IP 都有表頭資料, 想當然爾,TCP 也有表頭資料來記錄該封包的相關資訊囉??沒錯啦~ TCP 封包的表頭是長這個樣子的:
Source Port & Destination Port ( 來源埠口 & 目標埠口 ) 什麼是埠口(port)?我們知道 IP 封包的傳送主要是藉由 IP 位址連接兩端, 但是到底這個連線的通道是連接到哪裡去呢?沒錯!就是連接到 port 上頭啦! 舉例來說,鳥站 (http://linux.vbird.org) 有開放 WWW 伺服器, 這表示鳥站的主機必須要啟動一個可以讓 client 端連接的端口,這個端口就是 port , 中文翻譯成為埠口。同樣的,用戶端想要連接到鳥哥的鳥站時,就必須要在 client 主機上面啟動一個 port ,這樣這兩個主機才能夠利用這條『通道』來傳遞封包資料喔! 這個目標與來源 port 的紀錄,可以說是 TCP 封包上最重要的參數了! 下個小單元我們還會繼續介紹。
Sequence Number ( 封包序號 ) 由於 TCP 封包必須要帶入 IP 封包當中,所以如果 TCP 資料太大時(大於 IP 封包的容許程度), 就得要進行分段。這個 Sequence Number 就是記錄每個封包的序號, 可以讓收受端重新將 TCP 的資料組合起來。
Acknowledge Number ( 回應序號 ) 為了確認主機端確實有收到我們 client 端所送出的封包資料,我們 client 端當然希望能夠收到主機方面的回應,那就是這個 Acknowledge Number 的用途了。 當 client 端收到這個確認碼時,就能夠確定之前傳遞的封包已經被正確的收下了。