İnternetteki en büyük Güvenli UDP Paket Boyutu nedir


203

UDP paket boyutları hakkında birkaç makale okudum ama doğru olana bir sonuca varamadım.

Bazı hizmetler en büyük UDP paketini 512 bayta (dns gibi) kısıtlar

İnternetteki minimum MTU 576 ve IPv4 üstbilgisinin boyutu 20 bayt ve UDP üstbilgisi 8 bayt göz önüne alındığında . Bu, kullanıcı verileri için 548 bayt kullanılabilir bırakır

Paket parçalanmadan 548 boyuta kadar paketleri kullanabilir miyim? Veya DNS yaratıcılarının bildiği bir şey var mı ve bu yüzden onu 512 bayt ile sınırladılar.

Güvenli bir şekilde 548 bayttan daha yüksek olabilir miyim?



10
Bu çok farklı bir soru. Parçalanma olmayacak internet üzerinden gönderebileceğim en büyük paketin ne olduğunu soruyorum (diğer ağlar hakkında herhangi bir bilgi sahibi olmadan veya sondalama yapmadan). Aslında, bağlantıyı araştırmaktan endişe etmeden her şeyde çalışacak maksimum güvenli boyut.
KM

2
Parçalanma olasılığını ortadan kaldıramazsınız, ancak bu işleri daha az güvenli hale getirmez. Bir parça düşürülürse, paketin tamamı düşürülmüş gibi aynıdır, bu yine de UDP ile olur. Bir paket, yönlendiricilerin desteklemesi gereken minimum boyutu aştıysa ve dolayısıyla teslim edilebileceği garanti edilmediğinde (teslim edileceği garantili) güvensiz olacaktır. 512 baytlık rakam burada
devreye

Yanıtlar:


130

Tipik bir IPv4 üstbilgisinin 20 bayt ve UDP üstbilgisinin 8 bayt olduğu doğrudur . Bununla birlikte, IP üstbilgisinin boyutunu 60 bayta kadar artırabilecek IP seçenekleri dahil etmek mümkündür. Buna ek olarak, bazen ara düğümlerin , paketi hedefe yönlendirmek için IPsec (VPN'ler ve benzerleri için kullanılır) gibi başka bir protokolün içindeki datagramları kapsüllemek gerekir. Bu nedenle, MTU'yu kendi ağ yolunuzda bilmiyorsanız, beklemeyebileceğiniz diğer başlık bilgileri için makul bir marj bırakmak en iyisidir. 512 baytlık bir UDP yükünün genellikle bunu yaptığı kabul edilir, ancak bu bile maksimum boyutta bir IP başlığı için yeterli alan bırakmaz.


36
Açık olmak gerekirse: Parçalanmadan kaçınmak için küçük bir boyuta sahip olmak, paketin "Güvenli" teslim edilmesini sağlamaz, yine de köpeğin ağ kablosunu yemesi gibi teslimatı güvenilmez kılan sonsuz miktarda olasılık vardır. Bahsedilen; daha az parçaya sahip olmak teslimatı "daha güvenli" hale getirir çünkü birden fazla ve bunlardan herhangi biri hiç yapmadıysa - tüm paket (datagram) UDP tarafından düşürülür.
markmnl

3
Bir soru için, posterlerin 'güvenli' tanımını kullandığını varsayalım, bazı standart kitaplarda hiç görmedikleri bir tanım değil.
Astara

Gerçek dünya yönlendiricilerinin UDP paketlerini parçalamak yerine düşürdüğü biliniyor mu?
user253751

60

Bir UDP paketinin maksimum boyutu için teorik sınır (Windows'ta) 65507 bayttır. Bu burada belgelenmiştir :

Aşağıdaki formülle belirlenen doğru maksimum UDP ileti boyutu 65507'dir: 0xffff - (sizeof (IP Başlığı) + sizeof (UDP Başlığı)) = 65535- (20 + 8) = 65507

Bununla birlikte, çoğu protokol çok daha küçük bir boyutla (genellikle 512 veya bazen 8192) sınırlanır. Güvenilir bir ağdaysanız, genellikle 548'den daha güvenli bir şekilde gidebilirsiniz - ancak İnternet üzerinden genel olarak yayın yapıyorsanız, gittiğinizde, paket iletim sorunları ve kaybı ile karşılaşma olasılığınız artar.


40
Microsoft bağlantısı normatif bir referans değildir. RFC'ler normatif referanstır; ve aktardıklarınız yalnızca IPv4 için geçerlidir.
Lorne Marquis

2
Sadece MS'in buna izin vermesi, her zaman iyi bir fikir olduğu anlamına gelmez, çünkü ara yönlendiriciler, vb.
rogerdpack

1
@EJP Bunu Microsoft bağlantısında açık bir şekilde açıklamıyorlar, ancak IPv4'ün gerekli bir sonucu gibi görünüyor: IPv4 toplam uzunluk alanı 16 bittir ve bu değer IP üstbilgisinin uzunluğunu ve UDP başlığı.
jtpereyda

@jtpereyda Bunların tamamen farkındayım. Demek istediğim, daha önce belirttiğim şey: mevcut oldukları yerde normatif referanslar vermelisiniz.
Lorne Marquis

Wifi kartımın (IEEE 802.3) sadece 1500 MTU yapabileceği ve jumbo çerçevelerin sadece 9k bayt olduğu göz önüne alındığında, maksimum UDP paket boyutunun 65.507 bayt olacağını düşünmüyorum.
Christian Stewart

54

Maksimum güvenli UDP yükü 508 bayttır. Bu, paket boyutu 576, eksi maksimum 60 bayt IP üstbilgisi ve 8 bayt UDP üstbilgisidir. Bu boyutta veya daha küçük olan herhangi bir UDP yükünün IP üzerinden teslim edileceği garanti edilir (ancak teslim edilmesi garanti edilmez). Daha büyük olan her şeyin, herhangi bir nedenle herhangi bir yönlendirici tarafından doğrudan düşürülmesine izin verilir. Maksimum yükün 1.212 bayt olduğu yalnızca IPv6'ya özgü bir yol hariç. Diğerlerinin de belirttiği gibi, bazı durumlarda ek protokol başlıkları eklenebilir. Bunun yerine yaklaşık 300-400 baytlık daha konservatif bir değer tercih edilebilir.

Herhangi bir UDP paketi parçalanmış olabilir. Ancak bu çok önemli değil, çünkü bir parçayı kaybetmek parçalanmamış bir paketi kaybetmekle aynı etkiye sahiptir: paketin tamamı bırakılır. UDP ile bu her iki şekilde de gerçekleşecek.

İlginç bir şekilde, maksimum teorik paket boyutu yaklaşık 30 MB'dir (1.500 ethernet MTU - 60 IP başlığı x 65.536 maksimum parça sayısı), ancak geçme olasılığı sınırsız olacaktır.

Kaynaklar: RFC 791, RFC 2460


2
Varsayılan olarak herhangi bir UDP paketi "_U_nreliable" olarak kabul edilir. Almak için beklediğiniz tek güvenli UDP paket boyutu 1, parçalanmamış paket olacaktır. "Güvenli" paketler istiyorsanız, TCP'nin üstünde bir paket protokolü kullanın.
Astara

28
@Astara Doğru, doğası gereği UDP güvenilmezdir. Ancak soru, belirli bir boyuttaki bir paketin teslim edileceği garanti edilip edilmeyeceği, teslim edileceği garanti edilemez. Belirli bir boyuttaki paketler herhangi bir nedenle herhangi bir yönlendirici tarafından bırakılabilir (ve bırakılabilir), oysa daha küçük olanları endüstri standartlarına göre tüm yönlendiriciler tarafından en iyi şekilde ele alınmalıdır . Bu durumda "güvenli", "arabam köprünün altına sığacak" ve "arabam trafikte sıkışacak" anlamına gelir.
Beejor

1
Bazı rastgele adamların söylediklerini tekrar etmeyi bırakıp gerçekleri kontrol etmeyi öneririm, çünkü UDP aslında oldukça güvenilirdir. BTW Gereksiz TCP yükü olmadan UDP'nin üstünde güvenli paketlerim var. openmymind.net/How-Unreliable-Is-UDP
Pablo Ariel

6
UDP nedeniyle "güvenilmez" değil miktarın bırakılan paket, ama paketleri nedeniyle olabilir (ve vardır) düştü. Belirli bir paket varışına, siparişine veya onayına "güvenemezsiniz". Veriler kırılgandır ve zamanın% 99'unu ve% 89'unu doğru yönde çalıştıran araba direksiyonunun güvenilir olduğunu söylemek gibidir. UDP pek çok şey için harika değil, sadece temelde kendi "TCP" sürümünüzü yazmanızı gerektiriyor. İşte dev dünyasında büyüleyici bir gerçek dünya davası (biraz modası geçmiş olsa da): gamasutra.com/view/feature/131781
Beejor

@Beejor Doğru yoldasınız, ancak "temelde kendi" TCP "sürümünüzü yazmanızı gerektirir" açık bir şekilde yanlıştır. UDP yayın için ve 'kritik olmayan' verilerin hızlı gönderilmesi için mükemmeldir. (Oyunlarla ilgili olarak) UDP kullanarak (LAN) sunucularını / hizmetlerini keşfedebilir ve oyuncu konumlarını hızlı bir şekilde göndermek için UDP'yi kullanabilirsiniz. Bir paket düşürülüyorsa; umursamıyorsunuz çünkü bir sonraki paketin diğer oyuncuların daha güncel bir konumu olacaktır. TCP "sıra dışı" paketlere sahip olabilir, ek yüke sahiptir ve bire-çok bağlantı yapmaz. Bazı durumlarda UDP daha uygulanabilir olabilir.
Paul

46

576, minimum maksimum yeniden montaj arabellek boyutudur , yani her uygulama en az bu boyutta paketleri yeniden birleştirebilmelidir . Ayrıntılar için IETF RFC 1122'ye bakın.


2
Yalnızca IPv6 taşımayan bir ağınız varsa. IPv6 taşıyorsa, IPv6 üstbilgilerinin maksimum paket boyutunu kullanın ve IPv6 üzerinden IPv4 yapmak için kapsülleme üstbilgilerini çıkarın. ;-)
Astara

@Astara IPv6'da, gönderen tarafından parçalanma yapılır, bu nedenle çok uyumlu olmayan ara yönlendiricilerde sorun yoktur. Alıcı, bellek kısıtlamalı gömülü bir boyut değilse, muhtemelen en az 64kB'a kadar olan paketleri yeniden birleştirebilir.
user253751

@ user253751 Parçalanabilen sadece uyumlu olmayan yönlendiriciler değil. Path MTU Discovery var, ama bu bile parçalanmayı tamamen ortadan kaldırmak için yeterli değil.
dstromberg

@dstromberg Hangi durumlarda IPv6 yönlendiricilerinin datagramları parçalamasına izin verilir?
user253751

@ user253751 Henüz çok fazla IPv6'm yok, ama işte bir örnek: jumbogramları da destekleyen başka bir IPv6 ağına jumbogram (> 65536 bayt) gönderen bir IPv6 ağı hayal edin. Ayrıca, Yol MTU Keşfinin bu jumbogramların parçalanma olmadan desteklenmesi gerektiğini söylediğini varsayalım. Ancak daha sonra bir yönlendirici güç çevrimi yapılır ve ağ yolunun bir kısmı, jumbogramlar için yapılandırılmamış ekipmanla değiştirilir.
dstromberg

14

Bu makalede, maksimum iletim birimi (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit . IP ana bilgisayarlarının bir IP paketi için 576 bayt işleyebilmesi gerektiğini belirtir. Bununla birlikte, minumum 68'dir. RFC 791: "Her internet modülü 68 oktet'lik bir datagramı daha fazla parçalanmadan iletebilmelidir. Bunun nedeni bir internet başlığının 60 oktete kadar olabilmesi ve minimum parçanın 8 oktet olması ."

Bu nedenle, 508 = 576 - 60 (IP başlığı) - 8 (udp başlığı) güvenli paket boyutu makul olur.

User607811 tarafından belirtildiği gibi, diğer ağ katmanları tarafından parçalanma yeniden birleştirilmelidir. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Yeniden Montaj IP katmanı, IP datagramlarının yeniden montajını GEREKİR. EMTU_R ("Etkili MTU almak") tarafından yeniden monte edilebilen en büyük datagram boyutunu belirleriz; buna bazen "yeniden montaj arabellek boyutu" denir. EMTU_R, 576 değerinden büyük veya ona eşit olmalıdır ZORUNLU


11

IPv4 minimum yeniden montaj arabellek boyutu 576, IPv6'da 1500 olarak bulunur. Başlık boyutlarını buradan çıkarın. Bkz . W. Richard Stevens'ın UNIX Ağ Programlaması :)


1
Minimum, elbette. Tespit ettiğiniz için teşekkürler. Yıllar boyunca kimsenin hatayı nasıl fark etmediği hakkında hiçbir fikrim yok.
Nikolai Fetissov

1
IPv6'nın en az 1500 yeniden birleştirme arabelleği olabilirken, IPv6 paketlerinin parçalanmasına izin verilmez ve minimum IPv6 MTU'nun 1280 olması gerekir. Bir uç cihazın asla parçalanmış bir IPv6 paketini yeniden bir araya getirmesi gerekmez.
Ron Maupin

1
@RonMaupin IPv6 paketleri uç noktalardan parçalanabilir. Aradaki yönlendiriciler tarafından değil.
Navin

3
@Navin, hayır, IPv6 paketleri parçalanmayacak, veriler IPv6 paketlerine paketlenmeden önce parçalanmalı, ancak paketlerin kendileri parçalanmamalıdır. Bir fark var. Parçalanma ile ilgilenecek alanları olan IPv4 paket başlıklarının aksine, IPv6 paket başlıklarının parçalanma ile ilgili hiçbir şeyi yoktur. IPv6 paket başlığı, IPv4 paket başlığından çok daha basittir.
Ron Maupin

7

IPV6'nın 1500 boyutuna sahip olduğu göz önüne alındığında, taşıyıcıların IPV4 ve IPV6 için ayrı yollar sağlamayacağını (her ikisi de farklı türlerde IP olduklarını) ve onları eski, yedekli, daha pahalıya mal olacak ipv4 ekipmanına zorlayacaklarını iddia ediyorum. ve daha az güvenilir. Hiç mantıklı değil. Ayrıca, bunu yapmak, bazı trafik için tercihli tedavi sağlamak olarak kolayca düşünülebilir - hayır, muhtemelen çok fazla umursamayacakları kurallara göre (yakalanmazlarsa).

Bu nedenle 1472 harici kullanım için güvenli olmalıdır (ancak bu, EDNS hakkında bilmeyen DNS gibi bir uygulamanın kabul edeceği anlamına gelmez) ve dahili ağlardan bahsediyorsanız, ağ düzeninizi daha iyi bilebilirsiniz, bu durumda jumbo paket boyutları 4096 - 4068 bayt için parçalanmamış paketler için ve 9014 bayt tamponlu intel kartları için ... bekleme ... 8086 bayt, maksimum ... tesadüf mü? kişneme

****GÜNCELLEME****

Çeşitli yanıtlar, 1 SW satıcısı tarafından izin verilen maksimum değerleri veya kapsülleme varsayarak çeşitli yanıtları verir. Kullanıcı mümkün olan en düşük değeri istemedi (güvenli bir UDP boyutu için "0" gibi), ancak en büyük güvenli paket boyutu.

Çeşitli katmanlar için kapsülleme değerleri birden çok kez dahil edilebilir. Bir akışı kapsülledikten sonra - diyelim ki bunun altında bir VPN katmanı ve bunun üzerinde kapsülleme katmanlarının tamamen kopyalanmasını yasaklayan hiçbir şey yoktur.

Soru maksimum güvenli değerlerle ilgili olduğundan, alınabilecek bir UDP paketi için maksimum güvenli değerden bahsettiklerini varsayıyorum. Hiçbir UDP paketi garanti edilmediğinden, bir UDP paketi alırsanız, en büyük güvenli boyut IPv4 üzerinden 1 paket veya 1472 bayt olacaktır.

Not - IPv6 kullanıyorsanız, IPv6'nın başlık boyutu IPv4'ün 20 bayt boyutuna göre 40 bayt olduğu için maksimum boyut 1452 bayt olacaktır (ve her iki durumda da UDP üstbilgisi için 8 bayta izin verilmelidir).


1
1472'yi nasıl hesaplıyorsunuz? ethernet'in MTU'su 1500'dür, bahsettiğiniz şey bu mu?
rogerdpack

4
@rogerdpack Sanırım IPv4 ve IPv6'nın birçok altyapıyı paylaşması muhtemel olduğu ve IPv6'nın nispeten popüler hale geldiği için IPv6 sınırlarını (yani 1500'ü) almanın güvenli olması gerektiği anlamına geliyor. Ancak bu akıl yürütmenin ne kadar geçerli olduğunu söyleyemem.
Thomas

2
1500, ağ "zincirindeki" IPv6 uyumlu bileşenlerle desteklenmelidir - eğer IPv6 destekleyici bir zincir üzerinden (tersi doğru olmasa da) geçebilen IPv4 kullanıyorsa, IPv4'ün başlık boyutu 20 bayt olduğundan ve UDP'nin başlık boyutu 8 bayttır, bu da maksimum güvenli boyut olarak 1500-20-8 = 1472 bırakacaktır (IPv6 parçalanmaya izin vermediğinden). Not - insanlar yeterli kapsülleme katmanları eklerse, birinin DATA için yeterince boş alanı olmayabilir. MAX için istendiğinden, birden fazla kapsülleme ek yükü kullanılmadığı varsayılacaktır.
Astara

" 1500, ağ zincirindeki IPv6 uyumlu bileşenler tarafından desteklenmelidir. " Hayır, minimum IPv6 MTU 1280'dir. Ethernet MTU 1500'dür.
Ron Maupin

@RonMaupin - orijinal Q, MTU değil, en büyük güvenli UDP paket boyutuydu. Bkz. RFC2460. De 1280 sekizli bir MTU söz olarak, bu ifade ettiği gibi: düğüm gerekir yeniden birleştirilen zaman 1500 oktet kadar olduğu, parçalanmış bir paket kabul edebilecektir. 1500'den büyük paketleri kullanmak isteğe bağlıdır.
Astara

6

512 en iyi bahistir. Başka bir yerde kullanılır ve güzel bir çift sayıdır (1024'ün yarısı).


6

Burada iyi cevaplar okudum; ancak, bazı küçük hatalar vardır. Bazıları UDP başlığındaki İleti Uzunluğu alanının en fazla 65535 (0xFFFF) olduğunu yanıtladı; bu teknik olarak doğrudur. Bazıları gerçek maksimumun (65535 - IPHL - UDPHL = 65507) olduğunu yanıtladı. Hata, UDP Başlığındaki İleti Uzunluğu alanının tüm yükü (5-7. Katmanlar) artı UDP Başlığının (8 Bayt) uzunluğunu içermesidir. Bunun anlamı, mesaj uzunluğu alanı 200 Bayt (0x00C8) ise, yükün aslında 192 Bayt (0x00C0) olmasıdır.

Zor ve hızlı olan şey, bir IP datagramının maksimum boyutunun 65535 Bayt olmasıdır. Bu sayı, L3 ve L4 başlıklarının toplamı ile Katman 5-7 yükünün toplamına ulaşır. IP Üstbilgisi + UDP Üstbilgisi + Katmanlar 5-7 = 65535 (Maks.).

Bir UDP datagamının maksimum boyutu için en doğru cevap 65515 Bayttır (0xFFEB), çünkü bir UDP datagramı UDP üstbilgisini içerir. UDP yükünün maksimum boyutu için en doğru cevap 65507 Bayttır, çünkü UDP Yükü UDP üstbilgisini içermez.


1
Soruya cevap vermedin. Sorgulayıcı, paket parçalanmasından kaçınmak için kullanabilecekleri en büyük boyutun ne olduğunu bilmek istiyordu.
Astara

1

UDP "güvenli" değil, bu yüzden soru harika değil - ancak -

  • Mac kullanıyorsanız varsayılan olarak gönderebileceğiniz maksimum boyut 9216 bayttır.
  • Linux (CentOS / RedHat) veya Windows 7 kullanıyorsanız, maks. 65507 bayttır.

9217 veya daha fazla (mac) veya 65508+ (linux / windows) gönderirseniz, soket gönderme işlevi bir hata ile döner.

Parçalanma ve MTU ve benzerlerini tartışan yukarıdaki cevaplar konu dışıdır - her şey daha düşük bir seviyede gerçekleşir, sizin için "görünmez" ve tipik bağlantılar üzerindeki "güvenliği" önemli ölçüde etkilemez.

Gerçek soruyu anlamlandırmak için - UDP kullanmayın - ham soketleri kullanın, böylece her şeyin daha iyi kontrolünü sağlayabilirsiniz; Bir oyun yazdığınız için, trafiğinize öncelik vermek için bayrakları araştırmanız gerekiyor, böylece aynı zamanda UDP sorunlarından da kurtulabilirsiniz.


0

Korkarım tepkilere maruz kaldığımdan korkuyorum ama yine de, yanılıyorsam veya bu soruyu gören ve bir cevapla ilgilenenler için netleştirmek için:

statüsü "resmi şartname" olan https://tools.ietf.org/html/rfc1122 konusundaki anlayışım ve bu nedenle bu soruda kullanılan ve ne başka bir RFC tarafından geçmeyen ne de errata olan terminolojinin referansı takip etme:

teorik olarak, yani. Yazılı spesifikasyonlara göre, https://tools.ietf.org/html/rfc1122#section-4 tarafından verilen gibi UDP'nin "paket boyutu" yoktur. Böylece cevap "belirsiz" olabilir

Pratikte, bu soruların büyük olasılıkla aradığı (ve mevcut teknoloji için güncellenebilecek olan), bu farklı olabilir ve bilmiyorum.

Ben üzülüyordum özür dilerim. https://tools.ietf.org/html/rfc1122#page-8 "İnternet Protokol Paketi" ve "Mimari Varsayımlar", duyduğum şeye dayanarak, üzerinde olduğum "varsayımı" katmanlar birbirinden ayrıdır . Yani. UDP'nin bulunduğu katman, IP'nin bulunduğu katmanla ilgilenmek zorunda değildir (ve IP katmanında Yeniden Montaj, EMTU_R, Parçalanma ve MMS_R ( https://tools.ietf.org/html/rfc1122#page- 56 ))


1
UDP başlığında 16 bitlik bir datagram uzunluk alanı vardır, yani en büyük teorik UDP datagramının 65.535 olduğu, ancak UDP'nin teorik toplam maksimum uzunluğu 65.535 ( ancak) teorik maksimum veri boyutunu belirlemek için IP ve UDP başlıklarını bu boyuttan çıkarmanız gerekir.
Ron Maupin

Bunu uzun zaman önce sordum, ancak teknik özelliklerde / veya teoride söylediklerinden ziyade pragmatik bir cevap (gerçek hayatta ne işe yarıyor) arıyordu. Ben parçalanma dışarı a-b paketleri oluşturmak istedim, gerçek zamanlı oyunlar ağ sorunu için oldu - Ben şimdi akıllı insanlar tarafından geliştirilen birçok çözüm olduğunu düşünüyorum :)
KM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.