一、數據鏈路層對數據幀的長度都有一個限制,也就是鏈路層所能承受的最大數據長度,這個值 稱爲最大傳輸單元,即MTU。以以太網爲例,這個值一般是1500字節。 二、對於IP數據包來說,也有一個長度,在IP包頭中,以16位來描述IP包的長度,也就是說, 一個IP包,最長多是65535字節。 三、結合以上兩個概念,第一個重要的結論就出來了,若是IP包的大小,起過了MTU值,那麼就須要 分片,也就是把一個IP包分爲多個,這個概念很是容易理解,一個載重5T的卡車,要拉10T的貨,它 固然就得分幾回來拉了。 四、IP分片是不少資料常講的內容,可是我卻是以爲分不分片其實不重要,重要的是另外一個東西。一個 數據包穿過一個大的網絡,它其間會穿過多個網絡,每一個網絡的MTU值是不一樣的。咱們能夠設想,若是 接受/發送端都是以太網,它們的MTU都是1500,咱們假設發送的時候,數據包會以1500來封裝,然而, 不幸的是,傳輸中有一段X.25網,它的MTU是576,這會發生什麼呢?我想,這個纔是咱們所關心的。 固然,結論是顯而易見的,這個數據包會被再次分片,咱開始用火車拉,到了半路,不通火車,只通汽車, 那一車貨會被分爲不少車……僅此而已,更重要的是,這種狀況下,若是IP包被設置了「不容許分片標誌」,那 會發生些什麼呢?對,數據包將被丟棄,然事收到一份ICMP不可達差錯,告訴你,須要分片! 這個網絡中最小的MTU值,被稱爲路徑MTU,咱們應該有一種有效的手段,來發現這個值,最笨的方法或許是先 用traceroute查看全部節點,而後一個個ping…… 五、到了傳輸層,也會有一個最大值的限制,固然,對於只管發,其它都無論的UDP來講,再也不咱們討論之列。這裏 說的是TCP協議。說到大小,或許會讓人想到TCP著名的滑動窗口的窗口大小,它跟收發兩端的緩存有關,這裏討論 的是傳輸的最大數據包大小,因此,它也不在討論之列。 TCP的選項字段中,有一個最大報文段長度(MSS),表示了TCP傳往另外一端的最大數據的長度,當一個鏈接立時,鏈接 的雙方都要通告各自的MSS,也就是說,它說是與TCP的SYN標誌在一塊兒的。固然,對於傳輸來說,老是但願MSS越大越好, 如今超載這麼嚴重,誰家不但願多拉點貨……可是,MSS老是有個限制的,也就是MTU-IP頭長度-TCP頭長度,對於以太網來說 它一般是1500-20-20=1460,雖然老是但願它能很大(如1460),可是大多數BSD實現,它都是512的倍數,如1024…… 六、回到分片上來,例如,在Win2000下執行以下命令: ping 192.168.0.1 -l 1473 按剛纔的說法,1473+20(ip頭)+8(icmp頭)=1501,則好大於1500,它會被分片,可是,咱們關心的是: 這個數據包會被怎麼樣分法? 能夠猜測,第一個包是 以太頭+IP頭+ICMP頭+1472的數據; 那第二個分片包呢? 它能夠是: 以太頭+IP頭+ICMP頭+1個字節的數據 或者是: 以太頭+IP頭+1個字節的數據 也就是省去ICMP頭的封裝,固然,IP頭是不能夠省的,不然怎麼傳輸了…… 事實上,TCP/IP協議採用的是後一種封裝方式,這樣,一次能夠節約8個字節的空間。IP包頭中,用了三個標誌來描述一個分片包: 一、分片標誌:若是一個包被分片了,被置於1,最後一個分片除外;——這樣,對於接收端來說,能夠根據這個標誌位作爲重組的重 要依據之一; 二、分片偏移標誌:光有一個標誌位說明「本身是否是分片包」是不夠的,偏移標誌位說明了本身這個分片拉於原始數據報的什麼位置, 很明顯,這兩個標誌一結合,就很容易重組分片包了。 三、不容許分片標誌:若是數據包強行設置了這個標誌,那麼在應該分片的時候,…… err,剛纔已經說過了