目錄
前言:
IP分片
分片vs不分片
如何分片
分片舉例
三個字段
前言:
前文IP協議·上和IP協議·下我們已經把IP協議的報頭的大多數字段介紹了,唯獨有三個字段現在還有介紹,即16位標識,8位協議,13位片偏移,今天,我們將通過IP分片的介紹,隆重介紹這三個字段,那么廢話不多說,直接進入主題吧!
IP分片
我們熟知報文在向下交付的時候,分別是經過應用層,傳輸層,網絡層,再到數據鏈路層,那么在報文交付的過程我們是否考慮過報文的字節數是否會超過限制?
實際上,在報文交付的時候,我們拿以太網舉例,在數據鏈路層存在MTU,即數據鏈路層定義的最大幀負載,說簡單一點就是最大傳輸單元。
即從傳輸層下來的數據不能超過MTU,而MTU在以太網中代表的是1500字節,在不同的網絡中有不同的配置。那么傳輸層的報文經過網絡層,封裝的時候發現的數據一旦超過了MTU,就會進行分片。
分片vs不分片
我們知道,報文超過了MTU就會在網絡層分片,那么分片就代表了報文會從1個報文變成多個報文,所以分片vs不分片的話題,也就變成了1個報文vs多個報文的話題了。
對于這個話題來說,非常的直觀,因為網絡世界中存在一個老生常談的話題——丟包問題。如果分的片中,有一片丟失了,那么整個報文就丟失了,此時就會重傳,會給網絡帶來額外的負擔,所以分片并不是網絡轉發的主流,并且因為分片了,那么還要組裝,有了組裝,我們還得擔心是否會有分片丟失,如果分片丟失,還需要重傳,即便沒有丟失,也需要判斷是否發生了丟包的情況。這也就是為什么不想分片的原因。
那么如何做到不分片也很簡單,只要發送的數據不超過對應網絡的MTU就可以了,但是架不住有的情況下只能分片,所以本文的側重點主要還是在如何分片上。
如何分片
分片舉例
假設現在有一個3000字節的報文,我們一想,MTU不是1500字節嗎?所以3000直接除以1500唄,就分兩個片就行了唄。
實際上這個操作是非常錯誤的,因為報文在網絡世界中往往要有一個標識,比如IP報頭等。如果我們直接一分為2,前1500字節好說,有對應的IP報頭嘛,但是后面的1500字節可就遭罪了,就只有有效載荷,報頭呢?啥也沒有,那誰接收了該報文不迷糊啊。
所以分片的時候,實際上是這樣的(只考慮IP的20字節報頭):
原始為3000字節的數據,分為了三片,每片都有自己的報頭和有效載荷。這是正確分法。
三個字段
到這里,我們可以開始了解這三個字段了,分別是16位標識,3位標志,13位片偏移。
對于16位標識來說,是對不同分片的一個分類,畢竟我們要有一個認識就是:OS內存在大量的報文,有的是已經分片了的,有的是沒有分片的,那么對于已經分片的報文,我們后面組裝的時候知道哪些分片是一類的,哪些不是,這樣才能從分片的報文組裝為一個完整的報文。
所以16為標識的作用是:標識從同一個報文分下來的分片報文。
對于之后組裝的時候,我們要清楚一個點就是,如何進行組裝?稀里糊涂的組裝?逮到誰就是誰嗎?那肯定不行,所以我們需要一個字段來表示該分片是原始報文的哪個位置。
在IP報頭中標識位置的字段就是13位片偏移,通過該字段有效的標記分片在原始報文的偏移量是多少,比如上面的偏移量分別是0,1480,2960。因為第一片的還有20字節的報頭,所以偏移量應該是1480。
那么有意思的來了,我們知道片偏移量是13位,但是IP有一個字段是16位總長度(總字節數),也就代表了數據的最大可以到2^16次方,而片偏移量只有13位,所以偏移量最大只能表示2^13字節,那么沒有表示出來的字節數怎么處理?
實際上,在分片的時候,實際偏移的字節數是偏移量右移8位得到的,也就是說這個偏移量一定是能夠被8整除的。那么如果不能被8整除怎么辦?這問題在網絡層嚴格規定了,只有最后一片報文的字節數可以不被8整數,前面的報文都是要能被8整除的。那么在組裝的時候,可以通過偏移量左移得到對應的真實的片偏移量。
所以13位片偏移的作用是:表示該分片在原始有效載荷的偏移量。
三位標記字段就比較簡單了,有的報文可以分片有的不能,所以三位標志字段中第一位是保留字段,現在不使用,第二個是置為1代表的是禁止分片,這個時候報文長度如果超過了MTU,IP就會丟棄該報文。第三位表示更多分片的意思,除了最后一個分片設置為0,其他的都是1,為0的時候類似于一個結束標志,就像C語言的字符串使用斜杠0結尾一樣。
所以3位標志的作用是:表示該報文是否分片,并且如果分片,最后的分片標志位為0.????????
那么在組裝的時候,我們一定是要知道分片在原始有效載荷的位置,所以片偏移量有效幫我們解決了這個問題,因為按照順序來說,依次的片偏移量是升序排列的。
那么我們如何區分報文的是分片了的,如果分片了,它是第一個或者是其他位置的?
對于沒有分片的:更多分片為0 && 片偏移量為0。
對于分片了的,第一片的更多分片為1 && 片偏移量為0,其他片的更多分片為1 && 片偏移量>0,最后一片的更多分片為0?&& 片偏移量不為0
這樣就完美區分了分片和不分片,那么分片我們清楚了,組裝不就也清楚了嗎?
那么真正的分片如下:
以上就是IP分片的全部內容。
感謝閱讀!