IPv4協議中的UDP分片問題

2021-09-02 07:22:01 字數 2500 閱讀 1748

目錄

ipv4協議

分片可能引起的問題

參考文章

先看乙個流傳得比較多的圖,這裡直入主題,只說與分片相關的字段。

標識(identification):佔16位。ip軟體在儲存器中維持乙個計數器,每產生乙個 資料報,計數器就加1,並將此值賦給標識字段。

標誌(flag):佔3位,但目前只有兩位有意義。最低位記為mf (more fragment)。mf = 1即表示後面「還有分片」 的資料報。mf = 0表示這已是若千資料報片中的最後乙個。標誌字段中間的一位記為df (don』t fragment),意思是「不能分片」。只有當df = 0時才允許分片。

片偏移 :佔13位。片偏移指出:較長的分組在分片後,某片在原分組中的相對 位置。也就是說,相對於使用者資料字段的起點,該片從何處開始。片偏移以8個位元組為偏移 單位。這就是說,每個分片的長度一定是8位元組(64位)的整數倍。

總長度:總長度指資料報的長度,單位為位元組。總長度欄位為16位,因此資料報的最大長度為2^16 - 1 = 65535位元組。然而實際上傳送這樣長的資料報在現實中 是極少遇到的。

udp單個資料報的長度由於總長度的原因,不會超過65535位元組。而由於mtu的原因,udp資料報超過某一長度(為mtu的值,通常為1500位元組)後,會分片傳輸。 

舉個例子,主機a向主機b傳送乙個長度為8000位元組的udp資料報,假設mtu為1500,那麼資料報將會如何分片傳送呢?

假設mtu是1500,實際上每個資料報要包括20位元組固定大小的ip頭開銷,且第乙個分片需要包括udp協議頭(8位元組),其它分片只需要偽首部即可。所以實際的資料分片載荷為首包1472位元組,中間6包1480位元組,尾包608位元組。

接收端根據包標識+片偏移組包,源位址與標識相同的認為是同乙個資料報,使用片偏移排序,最後使用第乙個包的udp頭校驗和檢驗資料正確性,如果通過校驗,則分片組包成功,資料報通知到應用層。如果分片包超過一段時間未完整組包,或是校驗不通過,則資料丟棄。

由於包標識欄位是自增的,所以這個驗證是不會有問題,乍一看,感覺簡直完美。

而實際上,標識字段只有16位,最多只能表示65536個不同的udp資料報。假設分片組包超時的時間為t秒,那麼t秒內,如果傳送的udp資料報超過了65536會出現什麼問題呢?

當然,正常情況下是不會有問題的,我們假設一種異常的情況,乙個udp包被分成了兩個分片,在包標識為n的時候,分片1沒有被接收端接收到,分片2接收到並保留在接收端的記憶體中,等待超時時間t秒內,又接收到不一樣的資料,而標識為n的分片1,這時記憶體中第一次接收到的分片2就與第二次接收到的分片1組包。由於資料本身不一致,udp校驗和不通過,該包丟棄。接下來第二次的分片2又停留在記憶體中,等待已經被丟棄並永遠不會到來的正確的分片1,超時時間又從0開始計時。假設資料傳送端一直以相同的速率傳送資料,那麼第二次分片2等待到的只會是第三次的分片1,然後丟棄。第三次的分片2等待到第四次的分片1,丟棄。。。。。。如此便是乙個惡性迴圈。標識為n的資料報永遠都是乙個結果:被丟棄。

有人會覺得這不是乙個問題,你把超時時間t設定小一點不就萬事大吉了嗎?然而很不幸,windows 2000之後的核心都是對t值是硬編碼,t=60秒,不可改變。

所以如果不是特殊需求的話,最好不要讓udp資料報的長度超過mtu的值。如果不得不這樣做的話,還有另外一種方法,可以在特定環境下曲線解決這個問題。這裡就不詳細說明了。

還有另一種情況, 當別有用心的客戶端每次傳送乙個不完整的分片到指定windows伺服器,伺服器一直等待超時,那麼伺服器記憶體能否撐滿呢?(以下僅為理論上的推測,未進行相關的測試。)

假設乙個資料報是1514位元組(mtu1500位元組+14位元組資料鏈路頭)。乙個傳送端理論上至少可在60秒內傳送65535個不同標識的不完整資料報(或多個同乙個標識的不完整分片。65535*((最大udp資料長度)%(mtu)個),所以最多能傳送4266459570位元組≈4gb的資料,這些資料是常駐記憶體的。理想情況下,只需要16個不同的客戶端,就能對乙個開放了udp埠的且記憶體64gb以下的windows 2000以上版本的伺服器進行拒絕服務攻擊。

當然,這只是理想情況。實際呢,伺服器可能設定了不允許udp分片,或者udp快取本身很小、網路丟包、頻寬限制、防火牆等因素也可能導致了攻擊不可行。

[經過2018-12-31實際測試win7 x64系統,使用大量分片並不會導致目標系統的記憶體暴漲或宕機,而對網路占用和cpu的增長是存在的。所以此類攻擊在新版系統中的影響是有限的]

ip協議頭詳解

ip分片組包超時

歡迎提問

IPv4協議中的成員描述

在網路協議棧中,ip層的資料結構如下 struct iphdr if defined little endian bitfield u8ihl 4,version 4 elif defined big endian bitfield u8version 4,ihl 4 else error plea...

網路測試 IPV4協議族

ipv4協議族是tcp ip協議族中最為核心的協議族。ipv4協議族主要包括位址解析協議arp address resolution protocol 逆位址解析協議rarp reverse address resolution protocol 網際網路控制報文協議icmp internet co...

連續arq協議的利用率 IPv4協議

這裡所說的ip位址是ipv4位址,ip位址由32位正整數來表示。他在計算機內部被以二進位制方式處理,因此最多有2 32個ip位址,即 43億個總ipv4位址。32位的ip位址被分為4組,每組8位。每組以 來進行分割。然後在將每組數轉換為相應的十進位制數字。例如 192.168.0.231,我們稱之為...