PMTUD tam olarak ne zaman yapılır? (Yol MTU keşfi)


21

Dan ittiğini tartışmalarda diğer sorular üzerine bu sitede , ben sağlam bir anlayışa sahip olmadığını farkettim zaman Yol MTU Keşfi (PMTUD) gerçekleştirilir.

Bildiğim şey öyle - 'nden Server bir yolda en düşük MTU bulun). Nasıl yapıldığını
biliyorum - "Parçalanma" biti kümesi ile giderek daha büyük paketler gönderin ve "ICMP Parçalamak Gerekiyor" hatası almadan paketin ne kadar büyük olabileceğini görün.

Benim sorum özellikle o zaman , bir ev sahibi ne zaman PMTUD yapacak?

Özel durumlar arıyorum. "Bir ana bilgisayar MTU yolunu keşfetmek istediğinde" gibi genel bir şey değil. Yapan bir ana bilgisayarın paket yakalamasını sağlayabiliyorsanız veya böyle bir paket yakalaması oluşturmak için talimatlar sağlayabiliyorsanız bonus puanlar.

Ayrıca, özellikle IPv4'ü kastediyorum. IPv6'da geçici yönlendiricilerin parçalanmadan sorumlu olmadığını biliyorum ve PMTUD'nin çok daha yaygın olduğunu hayal edebiliyorum. Ama şimdilik IPv4'teki PMTUD örneklerini arıyorum. (PMTUD ile bir araya getirebileceğiniz tek paket yakalama IPv6'da olsa da, yine de görmek isterim)


PMTUD desteklenen en düşük MTU'dan en yüksek seviyeye mi? Veya PMTUD yapan cihaz önce en büyük MTU'yu dener ve daha sonra paket geçene kadar büyük bir artışla aşağı iner ve daha sonra küçük artışlarla yukarı doğru ilerler mi, daha sonra nihai bir belirleme yapılana kadar ileri geri hareket eder mi?
cpt_fink

@cpt_fink, birkaç strateji var. ICMP Fragmentasyon Gerekli mesajının modern uygulamaları ICMP yükünde, parçalanmanın gerekli olduğu bağlantının MTU'sunu içerir. Bu, başlangıç ​​sahibi MTU'nun yolunun ne olduğunu hemen bildiği için bunu kolaylaştırır. Eski uygulamalar doğru MTU'yu 'aramak' için çeşitli stratejiler kullanmalıdır. Bu stratejiler Bölüm 5'teki RFC1191'de ana hatlarıyla verilmiştir. Otomatik olarak varsayılan değerlerden IP Minimum'a (576) kadar, daha verimli arama yapmak için 'ortak' MTU'ların bir tablosunu kullanmaya kadar değişir (bkz. RFC1191 Bölüm 7.1).
Eddie

2
Bu ilginç bir soru. PMTUD üzerinde biraz kazma yapıyordum ve bunu buldum. Eski olmasına rağmen cevaplamaya karar verdim çünkü aynı soruya sahiptim ve birkaç saatlik araştırmadan sonra oldukça iyi bir cevap bulabilirdim (sanırım). Mümkünse yarın bir paket yakalama ile cevabımı güncellemeye ve desteklemeye çalışacağım.
Filipe Gonçalves

Yanıtlar:


15

Cevap basit: ne zaman ev sahibi isterse. Gerçekten mi. Bu kadar basit.

Aşağıdaki açıklama IPv4'e özel bir ortam olduğunu varsayar, çünkü IPv6 yönlendiricilerdeki parçalanmayı ortadan kaldırır (ana bilgisayarı her zaman parçalanma ve MTU keşfi ile uğraşmaya zorlar).

Bir ana bilgisayar Yol MTU Bulma işlemi gerçekleştirdiğinde (veya hatta gerçekleştirdiğinde) kesin bir kural yoktur. PMTUD'un ortaya çıkmasının nedeni, parçalanmanın çeşitli nedenlerle zararlı olarak kabul edilmesidir . Paket parçalanmasından kaçınmak için PMTUD kavramı geçici bir çözüm olarak hayata geçirildi. Tabii ki, güzel bir işletim sistemi gerekir parçalanma en aza indirmek için PMTUD kullanın.

Doğal olarak, PMTUD'nin ne zaman kullanıldığının kesin semantiği gönderenin işletim sistemine, özellikle de soket uygulamasına bağlıdır. Yalnızca belirli Linux durumu için konuşabiliyorum, ancak diğer UNIX varyantları muhtemelen çok farklı değil.

Linux'ta PMTUD IP_MTU_DISCOVERsoket seçeneği tarafından kontrol edilir . Geçerli durumunu getsockopt(2), seviyesini IPPROTO_IPve IP_MTU_DISCOVERseçeneği belirterek alabilirsiniz . Bu seçenek SOCK_STREAMyalnızca soketler için geçerlidir (bir SOCK_STREAMsoket iki yönlü, bağlantı yönelimli, güvenilir bir sokettir; pratikte diğer protokoller mümkün olmasına rağmen bir TCP soketi) ve ayarlandığında, Linux PMTUD'yi tam olarak RFC'de tanımlandığı gibi gerçekleştirir 1191.

Uygulamada PMTUD'nin sürekli bir süreç olduğunu unutmayın; paketler DF bit seti ile gönderilir - 3 yollu el sıkışma paketleri dahil - bunu bir bağlantı özelliği olarak düşünebilirsiniz (bir uygulama bir noktada belirli bir parçalanma derecesini kabul etmeye ve DF ile paket göndermeyi durdurmaya istekli olsa da) bit kümesi). Bu nedenle, PMTUD bu bağlantıdaki her şeyin DF ile gönderilmesinin bir sonucudur.

Ayarlamazsanız ne olur IP_MTU_DISCOVER?

Varsayılan bir değer vardır. Varsayılan IP_MTU_DISCOVERolarak SOCK_STREAMsoketlerde etkindir . Bu, okunarak okunabilir veya değiştirilebilir /proc/sys/net/ipv4/ip_no_pmtu_disc. Sıfır değeri IP_MTU_DISCOVER, yeni yuvalarda varsayılan olarak etkin olduğu anlamına gelir ; sıfırdan farklı bir şey, bunun tersi anlamına gelir.

Bağlantısız soketler ne olacak?

Bu zordur çünkü bağlantısız, güvenilir olmayan soketler kayıp segmentleri yeniden iletmez. Verileri MTU boyutlu parçalar halinde paketlemek kullanıcının sorumluluğundadır. Ayrıca, kullanıcının çok büyük bir Mesaj hatası olması durumunda gerekli yeniden iletim yapması beklenir . Bu nedenle, aslında kullanıcı kodu PMTUD'yi yeniden uygulamalıdır. Bununla birlikte, meydan okumaya hazırsanız, IP_PMTUDISC_DObayrağı geçirerek DF bitini zorlayabilirsiniz setsockopt(2).

Alt çizgi

  • Ev sahibi PMTUD'nin ne zaman (ve if) kullanılacağına karar verir
  • PMTUD kullandığında, bu bir bağlantı özniteliği gibidir, sürekli olarak gerçekleşir (ancak herhangi bir noktada uygulama bunu durdurmaktan serbesttir)
  • Farklı işletim sistemleri farklı yaklaşımlar kullanır, ancak genellikle güvenilir, bağlantı yönelimli prizler varsayılan olarak PMTUD gerçekleştirir, ancak güvenilir olmayan, bağlantısız prizler

4

Genellikle, yol ana iletim birimi keşfi (PMTUD), bir ana bilgisayar çok büyük olduğu için bir paketin düştüğünü düşündüğünde gerçekleşir.

Bu, paketin bırakıldığını açıkça gösteren ICMP parçalanması (tip 3, kod 4) yanıtı şeklinde olabilir. Tipik uygulamada, tüm IPv4 paketleri "parçalanma" (DF) bayrağı ayarlanmış olarak ayarlanır, bu nedenle MTU'yu aşan herhangi bir paket böyle bir yanıtı ortaya çıkarır. IPv6, parçalanmayı desteklemez.

Bazı yönlendiriciler veya ana bilgisayar güvenlik duvarları, saf bir yönetici ICMP'nin bir güvenlik riski olduğuna inandığı için tüm ICMP'leri sık sık düşürür . Veya, bazı bağlantı toplama şemaları ICMP dağıtımını bozabilir . MTU'yu keşfetmek için ICMP'ye dayanmayan alternatif bir mekanizma aşıldı RFC4821'de önerilmektedir .

tracepathMTU'yu araştırmak için en sevdiğim Linux aracı. LAN'da 9001 MTU'lu bir ana bilgisayardan 10.33.32.157'ye ulaşmak için bir IPsec VPN'den geçmesi gereken bir örnek:

$ tracepath -n 10.33.32.157
 1?: [LOCALHOST]                                         pmtu 9001
 1:  10.1.22.1                                             0.122ms pmtu 1500
 1:  169.254.3.1                                           1.343ms pmtu 1422
 1:  10.255.254.61                                        23.790ms 
 2:  no reply
^C [this host won't return an ICMP port unreachable, so tracepath won't terminate]

ICMP hataları şunlarla gözlemlenebilir tcpdump:

$ sudo tcpdump -p -ni eth0 'icmp and icmp[0] == 3 and icmp[1] == 4'
14:46:57.313690 IP 10.1.22.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1500), length 36
14:46:57.315080 IP 169.254.3.1 > 10.1.22.194: ICMP 10.33.32.157 unreachable - need to frag (mtu 1422), length 556

MTU keşifleri önbelleğe alınır. Linux'ta bu gözlemlenebilir ve temizlenebilir ip( Linux 3.6'dan bu yana değişikliklere dikkat edin ):

$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0  src 10.1.22.194 
    cache  expires 591sec mtu 1422
$ sudo ip route flush cache
$ ip route get 10.33.32.157
10.33.32.157 via 10.1.22.1 dev eth0  src 10.1.22.194 
    cache

TCP için, bağlantı kurulumunun bir parçası olarak MTU'nun aşılması önlenebilir. Her bir uç tarafından gönderilen SYN'ye maksimum segment boyutu (MSS) dahildir. TCP üstbilgisi ( seçenekler hariç 20 bayt ) ve IP üstbilgisi (20 bayt) ortalama MSS ve MTU, 40 baytlık bir farkla ilişkilidir.

Aşağıda, büyük bir dosyayı aktarırken bu iki ana bilgisayar arasında bir bağlantı kurulumu örneği verilmiştir scp:

$ sudo tcpdump -p -ni eth0 'host 10.33.32.157 and tcp[13]&2 == 2'
IP 10.1.22.194.45853 > 10.33.32.157.22: Flags [S], seq 634040018, win 26883, options [mss 8961,sackOK,TS val 10952240 ecr 0,nop,wscale 7], length 0
IP 10.33.32.157.22 > 10.1.22.194.45853: Flags [S.], seq 1371736848, ack 634040019, win 26847, options [mss 1379,sackOK,TS val 10824267 ecr 10952240,nop,wscale 7], length 0

İlk pakette, yerel ana bilgisayar 8961 MSS önerir. Bu, yapılandırılmış 9001 MTU, daha az 40 bayttır. Döndürülen SYN / ACK, 1379'luk bir MTU'yu ima eden 1379'luk bir MSS'ye sahiptir. Bu ağda uzak ana bilgisayarın da 8961 gönderdiğini biliyorum, ancak değer bir yönlendirici tarafından değiştirildi, çünkü yol bir internet yolu içerdiğini biliyor ( MTU 1500) bir IPsec tünelinden bir ek yük. Bu yönlendirici ayrıca gönderilen 8961 MSS'yi diğer ana bilgisayarda 1419 olarak görünecek şekilde değiştirdi. Buna MSS kelepçesi denir .

Yani bir anlamda PMTUD her zaman oluyor. Pratikte, MSS sıkıştırması mevcutsa ve TCP üzerinden tüm trafik meydana geliyorsa veya yönlendiricilerin hiçbirinin uç noktalarda yapılandırılandan daha küçük bir MTU'su yoksa, asla gerçekleşmeyebilir. MSS kelepçesi olmasa bile, önbellek sona erdiğinde nadiren gerçekleşebilir.


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.