圖
三、乙太網路的 mac 訊框
在這個 mac 當中,最重要的就是那個 6 bytes 的目的與來源位址了! 事實上,在所有的乙太網路卡當中都有乙個獨一無二的網路卡卡號, 那就是上頭的『目的與來源位址』,這個位址是硬體位址( hardware address ), 共有 6 bytes ,分別由 00:00:00:00:00:00 到 ff:ff:ff:ff:ff:ff, 這 6 bytes 當中,前 3bytes 為廠商的程式碼,後 3bytes 則是該廠商自行設定的裝置碼了。 在 linux 當中,你可以使用 ifconfig 這個指令來查閱你的網路卡卡號喔! 不過,由於 mac 主要是與網路卡卡號有關,所以我們也常常將 mac 作為網路卡卡號的代稱。
特別注意,在這個 mac 的傳送中,他僅在區域網路內生效, 如果跨過不同的網域 (這個後面 ip 的部分時會介紹),那麼來源與目的的位址就會跟著改變了。 這是因為變成不同網路卡之間的交流了嘛!所以卡號當然不同了!
如下所示:
圖四、在不同主機間持續傳送相同資料的 mac 訊框變化
例 如上面的圖示,我的資料要由電腦 a 通過 b 後才送達 c ,而 b 電腦有兩塊網路卡, 其中 mac-2 與 a 電腦的 mac-1 互通,至於 mac-3 則與 c 電腦的 mac-4 互通。 但是 mac-1 不能與 mac-3 與 mac-4 互通,為啥?因為 mac-1 這塊網路卡並沒有與 mac-3 及 mac-4 使用同樣的 switch/hub 相接嘛!所以,資料的流通會變成:
先由 mac-1 傳送到 mac-2 ,此時來源是 mac-1 而目的地是 mac-2;
b 電腦接收後,察看該訊框,發現目標其實是 c 電腦,而為了與 c 電腦溝通, 所以他會將訊框內的來源 mac 改為 mac-3 ,而目的改為 mac-4 ,如此就可以直接傳送到 c 電腦了。
也就是說,只要透過 b (就是路由器) 才將封包送到另乙個網域 (ip 部分會講) 去的時候, 那麼訊框內的硬體位址就會被改變,然後才能夠在同乙個網域裡面直接進行 frame 的流通啊!
mac包大小:舊為1900bytes,大為9000bytes
ip 封包的表頭
現在我們知道 ip 這個資料封包 (packet) 是需要放置在 mac 訊框裡面的,所以當然不能比 mac 所能容許的最大資料量還大!但是 ip 封包其實可以到 65535 bytes 那麼大的吶! 那麼 ip 封包除了資料之外,他的表頭資料 (head) 是長怎樣呢? 在
圖三的 mac 訊框表頭
裡面最重要的莫過於那個網路卡硬體位址, 那麼在 ip 表頭裡面當然就以來源與目標的 ip 位址為最重要囉! 除此之外, ip 表頭裡面還含有哪些重要資料呢?如底下所示:(下圖第一行為每個欄位的
bit數)
4 bits
4 bits
8 bits
3 bits
13 bits
version
ihltype of service
total length
identification
flags
fragmentation offset
time to live
protocol
header checksum
source address
destination address
options
padding
data
圖八、ip 封包的表頭資料
在上面的圖示中有個地方要注意,那就是『
每一行所占用的位元數為 32 bits
』, 也就是說, ip 封包的表頭資料是 32 bits 的倍數喔!那各個表頭的內容分別介紹如下:
你 只要知道 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 封包的表頭是長這個樣子的:
4 bits
6 bits
6 bits
8 bits
8 bits
source port
destination port
sequence number
acknowledge number
data
offset
reserved
code
window
ckecksum
urgent pointer
options
padding
data
圖十二、tcp 封包的表頭資料
上圖就是乙個 tcp 封包的表頭資料,各個專案以 source port, destination port 及 code 算是比較重要的專案,底下我們就分別來談一談各個表頭資料的內容吧!
其中比較常見到的應該是 ack/syn/fin 等,這三個控制碼是務必要記下來的, 這樣未來在談到防火牆的時候,您才會比較清楚為啥每個 tcp 封包都有所謂的『狀態』條件! 那就是因為連線方向的不同所致啊!底下我們會進一步討論喔!
window (滑動視窗)
主要是用來控制封包的流量的,可以告知對方目前本身有的緩衝器容量(receive buffer) 還可以接收封包。當 window=0 時,代表緩衝器已經額滿,所以應該要暫停傳輸資料。 window 的單位是 byte。
checksum(確認檢查碼)
當 資料要由傳送端送出前,會進行乙個檢驗的動作,並將該動作的檢驗值標註在這個欄位上; 而接收者收到這個封包之後,會再次的對封包進行驗證,並且比對原傳送的 checksum 值是否相符,如果相符就接受,若不符就會假設該封包已經損毀,進而要求對方重新傳送此封包!
urgent pointer(緊急資料)
這個欄位是在 code 欄位內的 urg = 1 時才會產生作用。可以告知緊急資料所在的位置。
options(任意資料)
目前此字段僅應用於表示接收端可以接收的最大資料區段容量,若此字段不使用, 表示可以使用任意資料區段的大小。這個欄位較少使用。
padding(補足字段)
如同 ip 封包需要有固定的 32bits 表頭一樣, options 由於欄位為非固定, 所以也需要 padding 欄位來加以補齊才行。同樣也是 32 bits 的整數。
ip包格式說明
版本號 version 長度4位元。標識目前採用的ip協議的版本號。一般的值為0100 ipv4 0110 ipv6 ip包頭長度 header length 長度4位元。這個欄位的作用是為了描述ip包頭的長度,因為在ip包頭中有變長的可選部分。該部分佔4個bit位,單位為32bit 4個位元組 即...
IP包首部格式
ipv4首部一般是20位元組長。在乙太網幀中,ipv4包首部緊跟著乙太網幀首部,同時乙太網幀首部中的協議型別值設定為080016。ipv4提供不同,大部分是很少用的選項,使得ipv4包首部最長可擴充套件到60位元組 總是4個位元組4個位元組的擴充套件 0 481216 1924 31版本 首部長度 ...
IP包首部格式
ipv4首部一般是20位元組長。在乙太網幀中,ipv4包首部緊跟著乙太網幀首部,同時乙太網幀首部中的協議型別值設定為080016。ipv4提供不同,大部分是很少用的選項,使得ipv4包首部最長可擴充套件到60位元組 總是4個位元組4個位元組的擴充套件 04 8121619 2431 版本首部長度 服...