MTU, UDP'de 65535'tir, ancak ethernet 1500 bayttan büyük çerçeve boyutuna izin vermez


11

Çerçeve boyutu 1500 bayttan az olan 100 Mbps'lik hızlı bir ethernet kullanıyorum (ders kitabımdaki yük için 1472 bayt). Böylece, 65507 bayt mesaj boyutu olan bir UDP paketi gönderip alabildim, bu da paket boyutunun 65507 + 20 (IP Başlığı) + 8 (UDP Başlığı) = 65535 olduğu anlamına geliyordu.

Çerçevenin yük boyutu en fazla 1472 bayt ise (ders kitabımdaki gibi), IP'nin paket boyutu burada 65535'ten daha büyük olabilir mi?

Olarak gönderen kodunu kullandım

char buffer[100000];
for (int i = 1; i < 100000; i++)
{
    int len = send (socket_id, buffer, i);
    printf("%d\n", len);
}

Alıcı kodu

while (len = recv (socket_id, buffer, 100000))
{
     printf("%d\n". len);
}

Bunun gözlemlenen send returns -1ile i > 65507ve recvbaskı ya da bir paket alır maximum of length 65507.

Yanıtlar:


11

UDP datagramlarının MTU boyutu ile çok az ilgisi vardır, bunları istediğiniz 64K'ya kadar istediğiniz kadar büyük yapabilirsiniz. Büyük datagramdan daha büyük boyutlu jumbo çerçeveler kullandığınız sürece bunlardan birini tüm pakette gönderebilirsiniz.

Ancak jumbo çerçeveler, çerçevenin geçeceği tüm ekipman tarafından desteklenmelidir ve bu bir problemdir. Pratik amaçlar için Ethernet çerçeveleri en yaygın taşıma boyutudur, bunlar için MTU yaklaşık 1500 bayttır, 1500'ü ileriye doğru söyleyeceğim, ancak her zaman değil. Temel MTU'dan daha büyük bir UDP datagramı oluşturduğunuzda (belirtildiği gibi çoğunlukla ethernettir), sessizce 1500 baytlık bir çerçeveye bölünecektir. Bu trafiği tcpdump yaparsanız, MTU sınırında bir parça numarası ile birlikte daha fazla parça bayrağı ayarlanmış olan bir dizi paket görürsünüz. İlk paketin parça numarası 0 ve daha fazla parça ayarlanır ve son paket sıfır olmayan parça numarasına sahip olur ve daha fazla parça ayarlanmaz.

Peki neden bakım? Uygulama detayı gerçekten önemlidir. Parçalanma, ağdaki performansa artık büyük bir sorun değil, bilinmesi gereken bir konuya zarar verebilir. Eğer kullanılan büyük bir datagram boyutu varsa, herhangi bir parça kaybolursa, tüm datagramların yeniden gönderilmesi gerekecektir. Eşit derecede yüksek hacimlerde ve bugün bunlar mükemmel şekilde ulaşılabilir hacimlerdir, daha sonra yeniden montajda çerçevelerin yanlış birleştirilmesi mümkündür. Yük dengeleyicilerin paketleri yaydığı kurumsal güvenlik duvarı yapılandırmalarında geçiş yapmak için parçalanmış UDP paketlerinin alınmasında sorunlar da olabilir, bir parça bir güvenlik duvarında ve diğeri farklı bir duvardaysa, trafik eksik olarak düşecektir.

Bu yüzden, MTU boyutu parçalanmasından daha büyük UDP datagramları oluşturmayın ve aralarında iletişim kurulan altyapının yakın (aynı alt ağ kapatma) olduğunu belirtmeniz gerekiyorsa, bu noktada jumbo çerçeveler muhtemelen iyi bir seçenek olacaktır.


'Daha fazla parça bayrağı' hakkında iyi bilgi. Bu, UDP başlığında mı yoksa IP başlığında mı?
John Jesus

Not: Veriler parçalanacaksa bazı işletim sistemleri UDP'yi AKTARMAZ. IE Linux doc,By default, Linux UDP does path MTU (Maximum Transmission Unit) discovery. This means the kernel will keep track of the MTU to a specific target IP address and return EMSGSIZE when a UDP packet write exceeds it.
Rahly

2

IP katmanı paketinizi gönderen uçta parçalayacak ve daha sonra UDP'ye geçirmeden önce alıcı uçta yeniden birleştirecektir. UDP katmanından, paketin parçalanmış olduğunu gerçekten söyleyemezsiniz. Wireshark gibi bir paket yakalama aracı kullanıyorsanız , bilgisayarınızın MTU ile sınırlı IP paketleri aldığını görebilmeniz gerekir.


1

TCP / IP yığınının paketleri gerektiği gibi parçalamasına izin vermenin tek tek paketleri göndermekten çok daha düşük bir yük olduğu ortaya çıkıyor.


1
TCP / IP'nin kendini parçaladığı ve yeniden birleştirdiği anlamına mı geliyor? Cevabınız evet ise, neden kodunuzun alıcı sonunda yeniden birleştirilmesi gerektiğini her zaman söylerler. Şimdilik parçalanma gözlemlemedim, ancak bunu söyleyen birçok forum gördüm ve hatta kabul eden insanlar gördüm.

OSI modeline meydan okuyanlar için, cevabınıza biraz daha ayrıntı ekleyebilir misiniz?
Robert Harvey

Biraz cagey oluyordum çünkü bunun ödev olup olmadığını söyleyemem. Bu bir ödünleşmedir: UDP hiçbir teslimat garantisi vermediğinden, herhangi bir paket parçası düşürülürse paketin tamamı kaybolur. UDP üzerinde güvenilir bir ulaşım istiyorsanız, tüm bunları kendiniz halletmeniz gerekir; ancak akış protokolleri (veya akış benzeri yolu kullanan UDP üzerinden NFS) yapıyorsanız (ya da söylüyorsanız), bu paketleri bırakmanız veya gerekirse uzun bir gecikmeden sonra daha büyük paketi yeniden iletmeniz daha düşük bir yüktür. İhtiyaçlarınızı protokol özellikleri ve protokol yükü ile dengelemeniz gerekir.
geekosaur

1

UDP, MTU hakkında hiçbir şey bilmiyor. UDP paketlerinin boyutu 8 ila 65535 bayt arasında olabilir. UDP'nin altındaki protokol katmanları belirli bir boyutta bir paket gönderebilir veya çok büyükse bu paketi bir hata ile göndermeyi reddeder.

UDP'nin altındaki katman genellikle IP'dir, IPv4 veya IPv6. Ve IP paketinin 20 (IPv4) / 40 (IPv6) ila 65535 bayt arasında herhangi bir boyutu olabilir, bu UDP ile aynı maksimum değerdir. Ancak IP, parçalanma adı verilen bir mekanizmayı destekler . Bir IP paketinin boyutu aşağıdaki katmanın taşıyabileceğinden daha büyükse, IP tek bir paketi parça adı verilen birden fazla pakete bölebilir. Her parça aslında kendine ait bir IP paketidir (kendi IP başlığına sahiptir) ve ayrıca kendi başına hedefe gönderilir; bu durumda, alınan verileri bir sonraki üst katmana (örn. UDP) geçirmeden önce tüm parçaları toplamak ve paketin tamamını yeniden oluşturmak hedefin görevidir.

Ethernet protokolü, yalnızca 46 ile 1500 bayt arasında bir yük kapasitesi olan çerçeveleri taşıyabilir (istisnalar vardır, ancak bu yanıtın kapsamı dışındadır). Yük verisi 46 bayttan azsa, tam 46 bayt olacak şekilde doldurulur. Yük verisi 1500 baytı aşarsa, arabirim bunu kabul etmeyi reddeder. Bu durumda, paketin parçalanmasına karar vermek IP katmanına kalmıştır, böylece hiçbir parça 1500 bayttan daha büyük değildir veya parçalanma bu özel bağlantı için devre dışı bırakılmış veya yasaklanmışsa bir sonraki daha yüksek katmana hata bildirir.

Parçalanmadan genellikle kaçınılmalıdır.

  • gönderen tarafında kaynak israfıdır.
  • alıcı tarafında kaynakları israf eder.
  • aynı miktarda yük verisi için protokol yükünü artırır.
  • tek bir parça kaybolursa, tüm paket kaybolur.
  • tek bir parça bozuksa, paketin tamamı bozulur.
  • yeniden gönderme durumunda tüm parçaların yeniden gönderilmesi gerekir.

TCP bu yüzden çerçeve boyutunu akıllıca benimser, böylece paketler onları parçalamak için asla IP'ye ihtiyaç duymaz. Bu, IP'yi parça paketlerine yasaklayarak yapılabilir ve IP bir paketin gönderilemeyecek kadar büyük olduğunu bildirirse, TCP çerçeve boyutunu azaltır ve artık hata bildirilmedikçe yeniden dener.

Bununla birlikte, UDP için bu uygulamanın kendisinin görevi olacaktır, çünkü UDP "aptal" bir protokol olduğundan, kendi yönetim mantığı yoktur, bu da onu çok esnek, hızlı ve basit hale getirir.

Her zaman taşınabilir olmak için güvenebileceğiniz tek UDP boyutu 576 eksi 8 bayt UDP üstbilgisi ve eksi 20 (v4) / 40 (v6) bayt IP üstbilgisidir, çünkü IP standardı her IP ana bilgisayarının IP paketlerini alabilmesini gerektirir toplam boyutu 576 bayt. En az bu boyutta paketleri kabul edemezse protokol uygulamanız standartlara uygun olmaz. Bununla birlikte, standardın parçalanma olmadan 576 demediğini, bu nedenle 576 bayt IP paketinin bile iki ana bilgisayar arasında parçalanabileceğini unutmayın.

Parçalanma olmadan taşınabileceğiniz tek paket boyutu IPv4 için 24 bayt ve bir parça için en küçük IP üstbilgileri 20/48 bayt (v4 / v6) olduğundan ve bir parçanın en az 4/8 olması gerekir. bayt (v4 / v6) yük verileri. Bu nedenle, IP katmanının altındaki, en azından bu boyutlardaki paketleri taşıyamayan bir taşıma sistemi, IP trafiğini taşımak için kullanılamaz.

Ve herhangi bir IPv6 üstbilgisinde yalnızca 40 bayt olduğunu yorumlamadan önce: Bu doğrudur, ancak IPv4 üstbilgisinin aksine, standart bir IPv6 üstbilgisinde parçalanma için üstbilgi alanı yoktur. Bir paketin parçalanması gerekiyorsa, IPv6 taban başlığının altına bir parçalanma uzantı başlığı eklenmeli ve bu uzantı başlığı 8 bayt uzunluğunda olmalıdır. Ayrıca IPv4'ten farklı olarak, IPv6'daki parçalanma ofsetleri 4 baytlık birimde değil, 8 bayt olarak sayılır, bu nedenle bir parça sadece IPv6 durumunda 8 baytın katı olan bir yük taşıyabilir.


0

Sorunuza yanıt vermek için, "Çerçevenin yük boyutu en fazla 1472 baytsa (ders kitabımdaki gibi), IP'nin paket boyutu, burada 65535'ten daha büyük olabilir mi?"

Bunun nedeni UFO adı verilen bir boşaltma özelliğidir (UDP Parçalanma Boşaltma). Lütfen bu bağlantıya bakın .

Boşaltma özelliklerini sırasıyla ethtool -k ethX ve ethtool -K ethX ile doğrulayabilir ve değiştirebilirsiniz.


0

Giden kareleri izliyorsanız, ağ bağdaştırıcınızın segmentasyon boşaltma işlemini desteklemesi ve etkin olması mümkündür. Segmentasyon boşaltma etkinken, ağ kartının kendisi paketi / çerçeveyi ağ yığını yerine uygun boyuta göre bölümlere ayırır. Bu, bilgisayardaki CPU'yu diğer görevleri yerine getirerek performansı artırır. Linux'ta "ethtool -k [device]" boşaltma bayraklarını gösterecektir.

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.