參考 <The TCP/IP Guide> http://tcpipguide.com
文章目錄
-
- 尋址 (Addressing)
-
- IP 尋址的概念和問題
-
- IP 位址概述和基礎
- IP 位址記法和大小
- IP 基本位址結構
- 三種主要的 IP 尋址方案
- 原始的分類尋址 (Classful IP Addressing)
-
- 概述
- 類别确定算法
- 特殊含義的 IP 位址
- 分類尋址的問題
- 子網 (Subnet)
-
- 子網路遮罩 (Subnet Masks)
- 變長子網路遮罩 (IP Variable Length Subnet Masking, VLSM)
- 無類尋址 (Classless IP Addressing)
-
- 概述
- 無類尋址與分類尋址相同點
- IPv4 資料報 (Datagrams)
-
- IPv4 資料報的一般格式
-
- Version
- IHL (Internet Header Length)
- TOS (Type Of Service)
- TL (Total Length)
- Identification
- Flags
- Fragment Offset
- TTL (Time To Live)
- Protocol
- Header Checksum
- Source Address & Destination Address
- Options
- Padding
- Data
- 分片 (Fragmentation) 和重組 (Reassembly)
-
- 概述
-
- MTU (Maximum Transmission Unit) 和資料報碎片
- 多次分片
- 分片過程
-
- 有關報頭字段
-
- Total Length
- Identification
- More Flagments
- Fragment Offset
- Copied Flag
- DF Flag
- 重組過程
- IP 資料報的傳送和路由 (Routing)
-
- 直接傳送和間接傳送
- 路由
- 路由表 (Routing tables)
尋址 (Addressing)
IP 尋址的概念和問題
IP 位址概述和基礎
- IP 位址的功能:辨別 (Identification) 和路由 (Routing)
- 網絡接口辨別 (Network Interface Identification):IP 位址給裝置和網絡之間的接口提供唯一的辨別。這才能保證資料被傳遞到了正确的地方。
- 路由:當資料包的起源和終點不在同一個網絡,資料包就必須通過中間系統間接 (Indirectly) 地傳遞,這個過程叫路由 (Routing)。
-
裝置的 IP 位址數量
任何裝置若要在網絡層 (Network Layer) 傳輸資料就至少有一個 IP 位址,一個網絡接口一個 IP 位址。一般的主機通常有一個 IP 位址,而路由器 (Routers) 則有多個 IP 位址。一些特殊的主機,如多宿 (Multihomed) 主機也會有多個 IP 位址。
多宿:一個主機擁有超過一個 IP 網絡接口那麼它就是多宿的,一個多宿裝置可能有多個接口連着同一個網絡也可能連着不同的網絡。如果一個主機連着多個網絡,那麼它可以被配置成一個路由器 (Router)。
比網絡層低層的裝置如:中繼器 (Repeaters)、橋 (Bridges) 和交換機 (Switches) 是不需要 IP 位址,因為它們是基于資料鍊路層 (Data Link Layer) 位址進行通信的。
-
IP 位址的網絡特定性
當 IP 位址代表網絡接口并用于路由時,這個 IP 位址是它所連接配接的網絡特定的,如果裝置移動到了一個新的網絡,這個 IP 位址通常也需要改變,這個問題也催生了移動 IP (Mobile IP)。
IP 位址記法和大小
IP 位址僅是 32 位二進制數。一般分為四個位元組,每個位元組轉換成十進制數,用點分開來表示。
二進制 | 11100011 | 01010010 | 10011101 | 10110001 |
---|---|---|---|---|
十六進制 | E3 | 52 | 9D | B1 |
十進制 | 227 | 82 | 157 | 177 |
因為 IP 位址有 32-bit 長,是以總共有 2^32 即 4,294,967,296 個位址。
IP 基本位址結構
為了友善尋址,IP 位址被結構化成兩部分:網絡号 (Network ID) 和主機号 (Host ID)。
網絡号:從 IP 位址最左端起的部分 bits,辨別主機或其他網絡接口所在的網絡。也叫 Network prefix 或 prefix
主機号:除去網絡号後剩餘的 bits,辨別網絡上的主機。
将網絡号包含進 IP 位址中,對尋址起到很大的幫助,因為可以通過比對資料包的目的位址的網絡号和自身的網絡号是否相同判斷出目的位址在内網還是外網,進而快速确定路由。将 IP 位址分為網絡号和主機号,還産生了一些有特殊含義的位址,如主機号全為 1 的廣播位址。
網絡号和主機号的分割點不是固定的,而是取決于各種因素的,并且可以在 32-bit 位址的任何地方,包括十進制八位位元組的中間。
三種主要的 IP 尋址方案
- 分類尋址 (Classful Addressing):将 IP 位址分為 ABCDE 五類,三個主要類為 ABC 三類,差別在于網絡号和主機号的長度,網絡号和主機号的劃分線在八位位元組邊界,如 C 類位址前 24 bits 為網絡号,後 8 bits 為主機号。
- 子網分類尋址 (Subnetted Classful Addressing):在子網尋址系統中,通過從主機号中拿取前端部分 bits 作為子網号,用于識别子網,這将原本的兩層劃分系統(網絡号/主機号)被改為三層劃分系統(網絡号/子網号/主機号)。
- 無類尋址 (Classless Addressing):将原始的分類尋址抛開,網絡号和主機号可以在任意點劃分,不需要像分類尋之中那樣劃分在八位位元組邊界。這種方案更加靈活有彈性。
原始的分類尋址 (Classful IP Addressing)
概述
在分類尋址中,IP 位址被分為 ABCDE 五類位址
IP 位址類别 | 在 IP 位址中的占比 | 網絡号數 | 主機号數 | 用于 |
---|---|---|---|---|
A 類位址 | 1/2 | 8 | 24 | 為需要上千萬台主機連入網絡的大型組織提供單點傳播位址,最多提供 16,277,214 個位址 |
B 類位址 | 1/4 | 16 | 16 | 為需要上千台主機連入網絡的中型組織提供單點傳播位址,最多提供 65,534 個位址 |
C 類位址 | 1/8 | 24 | 8 | 為需要上百台主機連入網絡的小型組織提供單點傳播位址,最多提供 254 個位址 |
D 類位址 | 1/16 | - | - | 多點傳播位址 |
E 類位址 | 1/16 | - | - | 為實驗保留 |
其中 ABC 類占 7/8,用作單點傳播位址。
盡管分類尋址對如今的網絡來說缺點衆多,以至于我們用無類尋址 (Classless IP Addressing) 代替了它,但要知道這是在十幾年前開發出來的尋址系統,對于那時的網絡環境,那時的計算機性能,分類尋址也有着許多的優點:
- 合理的靈活性:三種等級“粒度”的位址,分别對應大、中、小三種大小的組織,提供了足夠的容量來處理當時對網絡增長的預期。
- 易于路由:因為位址的類别資訊包含在位址中,且隻有五種類型,這使路由器可以很輕松的知道位址的哪部分為網絡号,哪部分為位址号,而不需要如掩碼的附加資訊。
類别确定算法
TCP/IP 剛被創造的時候,計算機的性能比起現在要弱得多,路由器要快速地決定資料包的去處,就必須快速的确定位址的類别并獲得目的位址的網絡号,當時大家也想象不到網絡發展到今天會如此巨大,那時隻需要一套簡單高效的尋址機制即可,是以分類尋址就這麼被發明并使用相當一段時間,也随之誕生了類别确認算法。
算法流程
- 如果位址第一位為 0,則為 A 類位址;如果為 1 則進行下一步。(這也是為什麼 A 類位址占 IP 位址的一半)
- 如果位址第二位為 0,則為 B 類位址;如果為 1 則進行下一步。
- 如果位址第三位為 0,則為 C 類位址;如果為 1 則進行下一步。
- 如果位址第四位為 0,則為 D 類位址;如果為 1 則為 E 類位址。
特殊含義的 IP 位址
網絡号 | 主機号 | A 類位址例子 | B 類位址例子 | C 類位址例子 | 特殊含義 |
---|---|---|---|---|---|
網絡号 | 全為 0 | 77.0.0.0 | 154.3.0.0 | 227.82.157.0 | 指整個網絡。 |
全為 0 | 主機号 | 0.91.215.5 | 0.0.99.6 | 0.0.0.160 | 指目前網絡或預設網絡中的一個主機。 |
全為 0 | 全為 0 | 0.0.0.0 | 指自身,當裝置不知道自己的 IP 位址時使用,常用于裝置用主機配置協定(如 DHCP)确定自身位址。 | ||
網絡号 | 全為 1 | 77.255.255.255 | 154.3.255.255 | 227.82.157.255 | 指某網絡中的所有主機,即本地廣播位址。 |
全為 1 | 全為 1 | 255.255.255.255 | 指網絡中的所有主機,即全局廣播位址,廣播給所有直接連接配接的網絡中的主機。 |
保留位址、環回位址和私人位址:
分類位址 | 無類位址 | 描述 |
---|---|---|
A 類 0.x.x.x | 0/8 | 保留 |
A 類 10.x.x.x | 10/8 | A 類私人位址 |
A 類 127.x.x.x | 127/8 | 環回位址 |
B 類 128.0.x.x | 128.0/16 | 保留 |
B 類 169.254.x.x | 169.254/16 | B 類私人位址,用于自動私人位址配置設定,詳見 DHCP |
B 類 172.16.x.x ~ 172.31.x.x | 172.16/12 | B 類私人位址 |
B 類 191.255.x.x | 191.255/16 | 保留 |
C 類 192.0.0.x | 192.0.0/24 | 保留 |
C 類 192.168.0.x ~ 192.168.255.x | 192.168/16 | C 類私人位址 |
C 類 223.255.255.x | 223.255.255/24 | 保留 |
多點傳播位址:
起始位址 | 終止位址 | 描述 | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
224.0.0.0 | 224.0.0.255 | 保留衆所周知的多點傳播位址。
| ||||||||||||||||||||||
224.0.1.0 | 238.255.255.255 | 全球範圍的多點傳播位址 | ||||||||||||||||||||||
239.0.0.0 | 239.255.255.255 | 管理權限範圍(本地)的多點傳播位址 |
分類尋址的問題
分類尋址的主要問題是能供使用的單點傳播位址隻有 ABC 三類,而且三類網絡位址塊的位址數跨度太大。假如你的公司有 5000 台裝置需要接入網絡,C 類網絡位址數最大為 254,B 類網絡位址數最大為 65,534 。此時有兩種選擇,選擇一個 B 類位址,可是這将浪費全球 60,534 個位址,而且需要不必要的開銷;另一個選擇是選擇 20 個 C 類位址,這看似沒有什麼問題,但實際上,這導緻在外部網絡路由器的路由表上增加了不必要的路由資訊,理想狀況下,一個組織應隻占據一個或少許幾個路由表項。如果這樣規模的公司有很多,且都選擇了第一種解決方案,那麼全球将會有一大部分的 IP 位址是被浪費的;而如果都選擇了第二種方案,則路由表會變得非常的大,路由負擔将會大大加重,網絡速度也将大幅下降。
總結下來,分類尋址存在三大問題:
- 缺少内部位址靈活性:一個大的組織配置設定了一個大的位址塊後,因為分類尋址的位址為兩層結構:網絡号+主機号,是以組織内部的位址是沒有結構的,無法比對内部實際的實體網絡結構。
- 位址空間的低效使用:如上如果選用 B 類位址則造成 90% 位址的浪費。
- 路由表的爆炸增長:如上如果選用 20 個 C 類位址,則要為這個公司添加 20 個路由表表項,這使得路由表爆炸增長,路由器決定路由的速度減慢,将拖累網絡的傳輸速度。
于是人們用子網尋址解決了第一個問題,用無類尋址替代了分類尋址進而解決了第二第三個問題。
子網 (Subnet)
子網簡單的來說就是在原有的分類尋址上加的一個分層等級,使得 IP 位址變成了三層結構:一個網絡含有若幹個子網,一個子網含有若幹台主機。這一改變帶來的優勢:
- 網絡内部更貼近實體網絡結構:主機可以組成子網來反映顯示中的實體網絡結構。
- 靈活:子網數和每個子網的主機數都是可以自定義的。
- 對公共網絡不可見:子網僅在組織内部進行劃分,僅内部可見,對于外部網絡,這隻是一個網絡,内部進行的任何更改外部都是不可得知的。
- 路由表表項不會劇增:因為子網結構僅存在組織内部,對外隻需要一個或少許幾個路由表項,隻要内網的路由器知道到各子網的路由即可。
噢對了,子網号是通過從主機号劃分一部分得來的,将主機号前面的一部分劃作子網号,剩餘的部分作為主機号。
子網路遮罩 (Subnet Masks)
既然子網的數量和每個子網的主機數都是可以自定義的,也就是說子網号和主機号的長度是可以自定義的,那麼問題又來了,要怎麼讓路由器知道那部分是子網号,那部分是主機号呢?我們需要額外的資訊來告訴路由器,采取的方法是利用一個和 IP 位址等長 (32-bit) 的掩碼 (Masks)。與網絡号和子網号對應的位置為 1,主機号對應的位置為 0。這樣的話,隻要将子網路遮罩和 IP 位址進行 AND 操作就可以清除主機号,迅速獲得網絡号和子網号用于确定路由。為了友善表示,我們一般在位址後面加 “/n” 來表示網絡号和子網号的長度,n 為網絡号和子網号的長度。例:IP 位址 119.29.192.194 子網路遮罩為 255.255.248.0 那麼我們可以表示為 119.29.192.194/21。
劃分子網的一些基礎:
- 每增加一位子網号,子網的數量翻倍,每個子網的主機數大概減一半(因為每個子網要減兩個特殊位址,主機号全為 1 和全為 0)。
- 每減少一位子網号則反之。
例如我們有一個 B 類位址,B 類位址有 16 位主機号,如果我們需要搭建 10 個子網,因為 23=8,24=16,是以我們需要從 16 位主機号中取 4 位作為子網号,那麼我們還剩下 12 位主機号,也就是說每個子網最多有 2^12-2=4094 台主機。
變長子網路遮罩 (IP Variable Length Subnet Masking, VLSM)
hmmm,又出問題了,從上面的例子相信大家也會發現,子網号的長度是固定的,也就是說一個網絡被等分成若幹分,而現實中的應用,不會這麼湊巧。和上面一樣,如果我們需要 10 個子網,但需要其中一個很大,需要有 30,000 台主機,剩下的 9 個子網都隻需要 1000 台主機,那麼就出問題了,如果要 10 個子網,那麼每個子網就隻能最多有 4094 台主機。這個方案可以滿足 9 個小的子網,但卻因為需要一個大的子網而無法投入使用,那問題就大了,網管可能需要為了那一個大的子網再去申請一個 B 類位址,這樣就把剩下的位址給浪費了。我們需要一個可以将網絡根據需求劃分成不同大小子網的機制。
順應大家的需求,VLSM 就誕生了。簡單的說 VLSM 就是允許将子網内部再劃分子網的規則。
例如有一個 B 類位址 154.71.0.0,要滿足上面所說的要求:
取一位子網号分成兩個子網,分别為:154.71.0.0 和 154.71.128.0,每個子網最多可以有 32,766 台主機。
取子網 154.71.128.0,再取四位主機号作為子網号,将這個子網再劃分成 16 個子網,每個子網最多可以有 2046 台主機。
154.71.0.0/16 | |||||||||||||||||||||||||||||||||||||||||||||
|
這樣網管就可以盡可能地比對需求了。
無類尋址 (Classless IP Addressing)
概述
子網尋址有着兩個主要的優勢:比對現實實體網絡結構和對外部網絡不可見。但這裡的子網尋址是在分類尋址的基礎上的。是以還是沒有解決分類尋址的一些問題。分類尋址的主要問題是位址塊的“粒度”過低,隻有 ABC 三類位址,且三類位址的大小跨度很大,難以比對現實需求,進而造成位址空間的低效利用或路由表表項的增加。
為了解決分類尋址的主要問題,誕生了無類尋址 (Classless Inter-Domain Routing, CIDR)。
CIDR 的理論是不使用類對 IP 位址進行劃分位址塊,而是将全球網絡進行子網劃分,比對各個組織的需求。各個網絡聚合成一個超網 (supernet),這也是 CIDR 也稱為超網的原因,超網再聚合,最後聚合成全球網絡,使得全球網絡形成一個多層次的結構,像一棵樹。
CIDR 的優勢:
- 有效的利用位址空間:因為 CIDR 消除了位址類,是以可以配置設定任何二進制倍數大小的位址塊,是以像之前說的需要 5000 台裝置連入網絡的公司可以配置設定一個 8,190 大小的位址塊而不是一個 65,534 大小的位址塊,即每個組織都可以配置設定一個比對的網絡位址塊,大大減少了位址空間的浪費。
- 消除不同類位址的不平衡:因為 CIDR 消除了位址類,是以不存在某一類位址廣泛使用而其他的位址不被使用的情況。
- 高效的路由表項:因為 CIDR 中,網絡是一個多層次的結構,每個超網的内部網絡結構對外是不可見的,也就是說可以用一個路由表項去代替超網内的所有網絡的路由表項,大大減少了路由表的大小,提高了路由的速度,就像樹的查找速度比線性表更快。
分類尋址之是以存在是因為對于當時的網絡環境和計算機性能有着一個重要的優勢:簡單。路由器可以通過前四個 bits 快速的判斷出位址的類别,進而知道網絡号和主機号。而無類尋址的缺點便是複雜,路由器不能通過前幾個 bits 來确定網絡号和主機号,這要求路由器的配置要小心和正确。
你肯定覺得 CIDR 和 LVSM 沒什麼差別,是的,我也覺得沒什麼差別。
無類尋址與分類尋址相同點
下面是一些從分類尋址機制中保留下來的東西:
- 私人位址塊:分類尋址中的私人位址塊依舊保留,這些位址在網際網路中不被直接路由,但可以結合 NAT (Network Address Translation) 使得主機不用公共位址去連接配接網絡。
- 特殊含義位址:特殊含義位址和分類尋址中一樣,是以我們依舊每個網絡要減去兩個特殊位址。
- 環回位址:環回位址仍被保留,在 CIDR 中記作 127.0.0.0/8。
IPv4 資料報 (Datagrams)
IPv4 資料報的一般格式
Version
用于辨別生成該資料報的 IP 版本。對于 IPv4 這裡的值為 4。
IHL (Internet Header Length)
以 32 比特為一個機關指出 IP 頭的長度,包括選項和填補部分,當沒有選項時這個值為 5。
TOS (Type Of Service)
攜帶 IP 資料報的服務品質特征資訊,如優先傳遞,其含義後來被重新定義以供稱為差異化服務 (Differentiated Services, DS) 的技術使用。
子字段 | 長度 (bits) | 描述 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Precedence | 3 | 訓示資料報的優先級,下面有八個定義的值,從最低到最高
| ||||||||||||||||||
D | 1 | 如果需要低延遲傳輸則設為 1,否則為 0 | ||||||||||||||||||
T | 1 | 如果需要更高吞吐量傳輸則設為 1,否則為 0 | ||||||||||||||||||
R | 1 | 如果需要更可靠的傳輸則設為 1,否則為 0 | ||||||||||||||||||
Reserved | 2 | 保留 |
TL (Total Length)
以位元組 (byte) 為機關指出 IP 資料報的總長度。因為這個字段隻有 16 bits 是以 IP 資料報的最大長度為 65,535 Bytes,實際上大多數都遠小于這個上限。
Identification
這個字段的值對于屬于同一資料報的碎片是相同的,這樣接收方在重組時才能分辨哪些碎片是屬于一個資料報的。
Flags
用來管理碎片。
子字段名稱 | 長度 (bits) | 描述 |
---|---|---|
Reserved | 1 | 保留 |
DF | 1 | 值為 1 時表示該資料報不能被分片,因為分片操作對更高層的協定不可見,是以很多時候不會設定這個值。但也不是沒用,常用與測試最大 MTU |
MF | 1 | 值為 0 時表示該資料報為最後一塊碎片;值為 1 時表示後面還有若幹資料報碎片。 |
Fragment Offset
當資料報被分片時,這個字段指出目前碎片在原資料報中的偏移量或位置,以 8 Bytes 為一個機關,第一個碎片的偏移量為 0。
TTL (Time To Live)
指出資料報允許在網際網路中存活的時間,沒經過一個路由器,路由器就會将這個值減 1,當這個值為 0 時路由器将丢棄該資料報不再轉發。這其實是指出資料報的最多跳數而非時間。
Protocol
指出資料報中攜帶的更高層協定。
值(16 進制) | 值(10 進制) | 協定 |
---|---|---|
00 | 保留 | |
01 | 1 | ICMP |
02 | 2 | IGMP |
03 | 3 | GGP |
04 | 4 | IP-in-IP Encapsulation |
06 | 6 | TCP |
08 | 8 | EGP |
11 | 17 | UDP |
32 | 50 | Encapsulating Security Payload (ESP) Extension Header |
33 | 51 | Authentication Header (AH) Extension Header |
Header Checksum
僅計算報頭的校驗和,以提供對傳輸中的損壞的基本保護,不對資料進行校驗和。
Source Address & Destination Address
源位址和目标位址。
Options
每個 IP 選項都有自己的 子字段格式,下圖和表表示通用選項格式:
子字段名稱 | 長度 (Bytes) | 描述 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Option Type | 1 | 這 8 bits 被分成如下三個子子字段
| ||||||||||||
Option Length | 0 or 1 | 以 Byte 為機關指出變長選項的長度,包括這裡所說的三個子字段。 | ||||||||||||
Option Data | 0 or Variable | 為變長選項提供,包含選項要發送的資料。 |
Option Class | Option Number | Length (Bytes) | Option Name | Description |
---|---|---|---|---|
1 | End Of Options List | 隻含有一個 0 Byte 的選項,用來标記選項清單的結尾。 | ||
1 | 1 | No Operation | 虛拟選項,用于内部填充,用于一些需要 32-bit 對齊的選項。 | |
2 | 11 | Security | 為軍方提供的選項,用于訓示 IP 資料報的安全分類。 | |
3 | Variable | Loose Source Route | 包含一個 IP 位址清單,用來指定資料報必須準确、按順序使用所給 IP 位址清單的路由器到達終點,途中可以使用清單外的路由器做中間跳轉。 | |
7 | Variable | Record Route | 如果資料報含有這個選項,那麼處理這個資料報的路由器會将自己的 IP 位址添加到這個選項中,這樣接收方就可以提取位址清單檢視資料報采用的路由。 因為這個選項的長度是由發送該資料報的裝置設定的,它不會在路由途中增大,是以,如果在到達目的之前該選項已經填滿,那麼将隻記錄了部分路由。 | |
9 | Variable | Strict Source Route | 和 Loose Source Route 選項類似,但是不允許清單外的路由器做中間跳轉。 | |
2 | 4 | Variable | Timestamp | 和 Record Route 選項類似,不同的是處理該資料報的路由器往選項裡添加的是時間戳,這樣接收方就可以知道資料報在各個路由器之間傳輸所用的時間。途中同樣不能修改該選項的長度。 |
2 | 18 | 12 | Traceroute | 用于 traceroute 程式的增強。 |
Padding
如果有選項,使得報頭長度不為 32 bits 的倍數,就用 0 去填補,使得報頭長度始終為 32 bits 的倍數。
Data
要傳送的資料。
分片 (Fragmentation) 和重組 (Reassembly)
概述
MTU (Maximum Transmission Unit) 和資料報碎片
在提及将資料報分片前不得不提一下 MTU:實體層所能傳輸的最大資料報大小。當一個資料報從一個 MTU 較高的網絡傳向 MTU 較低的網絡時資料報就會被分片成一個個大小小于或等于要通過的網絡的 MTU 的碎片。就像石頭君在管道中旅行,他要進入一個口徑小的管道,可是他比管道大進不去,那他就要分裂成小石頭君然後才能進入小管道。
多次分片
資料報在傳輸過程中往往都要經過數個網絡,每個網絡的 MTU 或許都不同,如果資料報大小比網絡的 MTU 大時進行分片,如果比網絡的 MTU 小時不做操作,也就是說傳輸過程中資料報可能被多次分片,但不進行重組,重組操作由資料報的最終接收方執行。網際網路的最小 MTU 為 576 Bytes。
分片過程
以上面的分片執行個體為背景,将一個大小為 12,000 Bytes 的資料報分别通過 MTU 為 3,300 1,300 3,300 的網絡傳送到目的地,其中進行了兩次分片操作。
- 第一次分片:大小為 12,000 的資料報傳入 MTU 為 3,300 的網絡,每個碎片都有自己的 20 Bytes報頭,是以分片的結果是 3 個攜帶 3,280 Bytes 資料的資料報碎片和 1 個攜帶 2,140 Bytes 資料的資料報碎片。偏移量都比前一個碎片多 410,因為偏移量以 8 Bytes 為一機關,410 * 8 = 3280 Bytes 剛好是前一個碎片攜帶的資料大小。
- 第二次分片:第二次和第一次大體相同,要注意的是這次分片是對碎片進行分片,不是将原資料報分片。這也很顯而易見,因為資料報不在途中重組,每個碎片去往終點的路由也不同,是以路由器是不一定知道原資料報完整内容的,是以路由器隻能對碎片進行再分片,這樣分片最終得到的結果不是最優的,我們可以看到第二次分片後,多了很多小碎片,最優的分片應該是像第一次那樣的,隻有一個小碎片,其他碎片大小一樣且都是允許通過的最大值,如果想達到最優的分片效果,可以先測試路由最小 MTU 然後由發件者按照此 MTU 分片後再發送。
有關報頭字段
Total Length
分片後,這個字段指的是碎片的長度,而不是原資料報的長度。
Identification
為屬于同一個資料報的碎片指定相同的唯一辨別。
More Flagments
除了最後一個碎片此值為 0 其餘都為 1。
Fragment Offset
這個字段訓示了每個碎片的位置,幫助接收方進行重組。該字段有 13 bits,是以偏移量最大為 8,191,8191 * 8 = 65,528 Bytes,還記得資料報的最大值嗎:65,535 Bytes,這就是為什麼偏移量以 8 Bytes 為機關。
Copied Flag
如果報頭有需要在分片時複制給碎片的選項,需要将該字段的值設為 1。每個選項都含有這個字段。
DF Flag
Flags 字段中的 DF 子字段,如果設為 1 該資料報将不會被進行分片處理,如果路由器遇到了一個資料報太大不能進入下一個網絡,有設定了 DF Flag ,不能分片又傳不下去,路由器有将這個資料報丢棄,并傳回一個特定的 ICMP,這個特性常用于 MTU Path Discovery。
重組過程
分片操作可以由源和目的之間的路由器進行,但重組操作隻能由目的裝置進行。
- 碎片識别:接收者通過源和目标 IP 位址、報頭指定的協定和發件人設定的 identification 字段來區分不同原資料報的碎片。
- 初始化緩沖區:接收者初始化緩沖區,用于存放收到的碎片,并跟蹤這個緩沖區來得知哪部分已經填充以及何時填滿。
- 初始化計時器:接收者為重組操作設定一個計時器,當有些碎片已經丢失不再出現時,計時器保證接收者不會永遠的等下去,沒有結果的等待注定是悲劇收尾。如果計時器逾時而還有碎片未到達,将會發送一個逾時 ICMP。
- 碎片接收和處理:一個片段送達時,通過上面提到的碎片識别,放入對應的緩沖區,至于放入緩沖區的哪個位置,要根據 fragment offset 的值來決定。
這一過程就像你獲得一塊塊拼圖,拼圖的背面寫着它所屬哪幅圖(碎片識别),還有它在圖中的位置 (fragment offset),然後你會找個地方去放屬于這幅圖的碎片(初始化緩沖區),然後你會定個時間去完成拼圖然後去吃飯碎片不夠也不再等别人給你碎片(初始化計時器)。
IP 資料報的傳送和路由 (Routing)
直接傳送和間接傳送
- 直接傳送 (direct delivery):當資料報的發送者和接收者在同一個實體網絡下,資料報是直接從發送者發往接收者的。
- 間接傳送 (indirect delivery):當資料報的發送者和接收者在兩個不同的實體網絡下,傳送就是間接的。資料報要通過一個或多個中間裝置(路由器)來實作跨網絡傳送。我們通常把這個間接的傳送過程稱為路由 (routing)。
間接傳送中是包含直接傳送的,間接傳送中發送者發往路由器、路由器發往路由器和路由器發往接收者都屬于直接傳遞。
路由
路由的過程其實和顯示中送信的過程是很像的,假如我要從深圳福田寄一封信到日本東京都米花町5丁目39番地1号,我将信放進街道的信桶,郵差來信桶将信帶到福田區的郵政局,然後再帶到深圳市郵政局 -> 廣東省郵政局 -> 中國郵政局 ->日本郵政局 -> 東京都郵政局 -> 米花町郵政局…… 資料報路由也是這樣,先判斷目的 IP 位址是否在同一個網絡,如果是便直接傳送到目的地,如果不是就傳送給本地的路由器(本地郵局),由路由器判斷目的位址是否在它的子網上(如深圳市郵局判斷目的是不是在深圳市内)或在與之直接相連的網絡上,如果不在就傳給下一個路由器(廣東省郵局),如果在則傳給對應網絡的路由器(如日本郵局判斷目的在東京,東京屬于日本),就這樣一步步傳到目的位址所在的網絡。
這個過程用到了一個重要的概念:下一跳 (Next-Hop),發送者不需要知道去往全世界每個裝置的路由,路由器也不需要知道,隻要知道下一跳去哪就可以了。就像我要寄信去米花町,我不需要知道在哪怎麼去,我隻要知道怎麼去街道的郵桶就可以了,然後信就通過郵差和郵局一跳一跳的跳往目的地。
路由表 (Routing tables)
路由器接受資料報并将它傳送到下一跳,那麼問題來了,路由器怎麼知道下一跳是誰?每個路由器都維護着一組資訊,這組資訊提供了不同網絡所對應的路由器,這組資訊稱為路由表。路由表告訴路由器發往不同網絡的下一跳路由器是哪個。每當資料報傳送給路由器,路由器就在路由表中查找目的位址網絡号所對應的下一跳路由器,然後将資料報傳送給下一跳路由器。很顯然路由器不可能知道去往全球每一個網絡的路徑,路由表也不會包含所有網絡的下一跳,遇到路由表中所沒有的網絡時,路由器會傳送給路由表中的預設下一跳,這是由網管設定的。到這裡我們可以得知,下一跳不一定也通常不是目的網絡,下一跳是目的網絡的情況也就發生在最後一跳而已,雖然下一跳不一定是目的網絡,但可以離目的更近。路由表中不僅包含與路由器直接相連網絡的對應下一跳路由器,還包含路由器學習得知的一些遠一點(與其不直接先連)的網絡的下一跳路由器,當然這個下一跳并不是直接到達那個網絡,而是通過這一跳可以離目的更近。