1:為什么需要分片
每個數據鏈路層協議都有自己的幀格式,在這個格式中有一個字段是"數據字段最大長度"(MTU,最大傳輸單元),當數據報被封裝成幀時,數據報的總長度必須小於這個最大長度.
它是由網絡使用的硬件和軟件帶阿里的限制確定的.
IPv4數據報的最大長度2^16(65535)字節,如果MTU>=2^16,那么什么也不用做,直接把IPv4的數據報塞到幀的數據段中就行了,但是對於MTU<2^16的數據鏈路層協議,那就應該把
數據報分成很多份,這個步驟就是分片.
2.怎么分片
當數據報被分片時
1:每一個數據報文都有自己的首部,大部分的字段是重復的
2:選項可以復制也可以不復制.只有數據報中的數據是分片的
3:檢驗和必須重新計算,因為檢驗和只包含頭部,然而頭部最少有三個字段(標識,標志,分片偏移量)改變了
4:如果分片后的數據遇到更小的MTU,需要再次分片
使用IPv4協議中 標識,標志,分片偏移來進行數據報分片.
標識:頭部中16位的字段,標志了從源主機發出的一個數據報,當數據報離開源主機后,此標識與源IP地址的組合必須唯一確定這個數據報.
進行分片時,這個字段必須復制到所有的分片中,這樣目的主機收到所有被分片的報文后,才知道把那些分片組裝起來
標志:頭部中3位的字段,
1:第一保留未用
2:第二位稱為不分片位,如果是1,這個數據報不能進行分片,如果不分片過不了網絡,只能丟棄,然后發送一個ICMP差錯報文回去.如果是0,那就可以分片
3:第三位是還有分片位,若這個值是1,則表示這個數據報不是最后的分片,如果是0,表示是最后一個分片
分片偏移:頭部中13位的字段
1:這個字段表示的是分片在整個數據報中的相對位置,看后面的計算過程
2:8字節為度量,為什么?而這個字段只有13位,它不能表示超過8191個字節,如果以8字節為度量單位,那么可以表示65528字節,
超過IPv4中數據段的最大值(2^16-1-20)=65515
3:第一個分片的字節數量必須能夠被8除盡
具體分片過程
IPv4數據報首部格式
| Ip協議版本4位 |
首部長度4位 |
服務類型8位 |
總長度16位 |
| 標識16位
|
標志3位
|
分片偏移量13位
|
|
| 生存時間8位 |
協議8位 |
頭部檢驗和16位
|
|
| 源IP地址 32位
|
|||
| 目的IP地址 32位
|
|||
| 選項+填充
|
|||
未分片的數據報:首部長度是20,數據長度是5000
|
|
|
|
5020 |
||
| 123 |
|
0 |
0 |
0 |
|
|
|
|
|
|||
|
|
|||||
|
|
|||||
假設我們一個分片大小是2000
第一個分片如下
|
|
|
|
2000+20=2020 |
||
| 123 |
|
0 |
1 |
0 (0/8=0) |
|
|
|
|
|
|||
|
|
|||||
|
|
|||||
| 0-1999字節(為了便於觀看加上的內容) |
|||||
第二個分片
|
|
|
|
2000+20=2020 |
||
| 123 |
|
0 |
1 |
250 (2000/8=250) |
|
|
|
|
|
|||
|
|
|||||
|
|
|||||
| 2000-3999字節 |
|||||
第三個分片
|
|
|
|
1000+20=1020 |
||
| 123 |
|
0 |
0 |
500 (4000/8=500) |
|
|
|
|
|
|||
|
|
|||||
|
|
|||||
| 4000-4999字節 |
|||||
