Linux'ta minimum TCP MSS


9

Linux'taki TCP MSS en az 88 olmalıdır (include / net / tcp.h):

/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS             88U

Sorum şu: "60 + 60 + 8" i nereden buldular ve neden? 20 + 20 IP üstbilgisi + TCP üstbilgisinden geliyor.

DÜZENLEME: Başlıklara daha yakından baktıktan sonra formül beni şöyle arar:

(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)

Soru hala duruyor: neden ? Linux çekirdeği neden bu formülü kullanıyor, dolayısıyla 20 baytlık TCP segmentlerini (zorunlu bir şekilde akışını) yasaklıyor? Burada iperf düşünün.

EDIT2: İşte benim kullanım durumum. Soket / bağlantıda düşük bir MSS zorlayarak , yığın tarafından gönderilen tüm paketlerin küçük bir boyutu olacaktır. Paket / saniye testi için iperf ile çalışırken düşük bir MSS ayarlamak istiyorum. MSS için bu alt sınır nedeniyle telde 128 bayttan (142 bayt Ethernet çerçeveleri) daha küçük IP paketleri alamıyorum! Ethernet çerçeve boyutuna RFC 2544'e göre 64 bayt kadar yaklaşmak istiyorum. Teorik olarak bu mümkün olmalı: 18 + 20 + 20 <64.


Bu, 20 baytlık TCP segmentlerini nasıl yasaklar?
David Schwartz

MSS, Maksimum Segment Boyutu anlamına gelir, belirli bir bağlantıdaki segment boyutu için üst sınırdır (alt değil). TCP_MIN_MSS bu sınır için alt sınırı belirtir. Bu nedenle, 88 bayttan daha az olan segmentleri hiçbir şekilde yasaklamaz, sadece herhangi bir bağlantı için MSS'nin> = 88 bayt olması gerektiğini belirtir.
gelraen

Elbette! Yeterince açık olmadığım için üzgünüm. Lütfen en son düzenlemeye bakın.
Mircea Gherzan

Ödülün süresinin dolmasına neden izin verdin? David'in cevabı en azından benim memnuniyetimle ilgili olan şeyleri temizler. Cevabı ve benimki arasındaki fark, farklı minimelerden bahsetmemiz. Değer için üçüncü bir minimum, 41 veya 20 + 20 + 1 bayt TCP verisi var. Bu nedenle, minimum paket boyutu sorma nedeninize bağlıdır. Çekirdeğin kullandığı durumlarda 68'in doğru cevap olacağını düşünüyorum TCP_MIN_MSS.
Warren Young

Hala cevaptan memnun değilim. Çekirdeğin bir uygulamaya arbirary küçük bir MSS empoze etmeme nedenini hala göremiyorum. 41 baytlık (TCP yüklü sabit bir akış) IP paketlerine sahip olmak isterdim, ancak yapamam TCP_MIN_MSS. Neden 1 olamaz? Hangi RFC kırılır? Hangi teorik / pratik soruna neden olur? Bunun "teknik özelliklerin dışında" olduğundan emin misiniz? "Farklı minima" mı? Burada yalnızca bir minimum ilgi vardır: çekirdek tarafından izin verilen en küçük MSS.
Mircea Gherzan

Yanıtlar:


5

Her biri 60 bayt olan maksimum boyutlu TCP ve IP başlıklarını desteklemek için bir uygulama gerekir.

Bir uygulama, 576 baytlık datagramları desteklemelidir; bu, maksimum üstbilgilerle bile datagramda 8 bayttan fazla veri anlamına gelir. 8 bayttan fazla veri içeren datagramlar göndermek için IP parçalanması, datagramın parçalarını temsil eden paketlerden en az birine en az 8 bayt veri koymalıdır. Bu nedenle, bir uygulama bir pakette en az 8 bayt veriyi desteklemelidir.

Bunu bir araya getiren bir uygulama, 60 + 60 + 8 bayt paketlerini desteklemelidir.

TCP akışının parçası olan paketler gönderdiğimizde, 20 baytlık IP üstbilgisi (artı seçenekleri) ve 20 baytlık TCP üstbilgisi (artı seçenekleri) vardır. Bu, veriler ve seçenekler için minimum (60 + 60 + 8) - (20 + 20) bayt kalmasına neden olur. Bu nedenle, bir uygulamanın TCP MSS'sini güvenli bir şekilde üstlenebileceğimiz maksimum değer budur.


1
MSS başlığı içermiyor (sadece yük) ve 60iki kez ortaya çıkıyor
Michael Mrozek

Bir uygulama, maksimum boyutlu bir başlık içeren bir paketi destekleyebilmelidir, ancak maksimum boyutlu bir başlık göndermiyoruz. Bu nedenle maksimum ile gerçekten gönderdiğimiz arasındaki fark veriler için mevcuttur ve MSS'ye eklenmesi gerekir.
David Schwartz

Tamam, yani 8 baytı açıkladınız. "TCP / IP" başlığı ile ne demek istediğinizi bilmiyorum. IP üstbilgisi ve TCP üstbilgisi biliyorum. Ve Michael'ın işaret ettiği gibi, 60 iki kez ortaya çıkıyor. Ve RFC sadece "etkili MSS" yi tartışır, minimal değil.
Mircea Gherzan

60, IP başlığı için bir kez ve TCP başlığı için bir kez olmak üzere iki kez görünür.
David Schwartz

68 sadece parçalanma ile ilgilidir. "60 + 60 + 8" parçalanmış olabilir, o zaman neden parçalanmayı önemsiyorsunuz? "68 + 20" bile parçalanabilir. Ve neden diğer taraf "kabul etmeli" "60 + 60 + 8"? "Parçalanma" olmadan "kabul et?" Alt satır: neden "20 + 20" + 10 bayt veri göndermeme izin verilmiyor?
Mircea Gherzan

3

Bu numaranın nereden geldiğini bilmiyorum, ama bunun spesifikasyonların dışında olduğunu söyleyebilirim. IP ağları için desteklenen en az MTU 576 bayttır, 512 veri baytı artı IP + TCP üstbilgileri ve TCP seçenekleri için 64 bayta kadar. Bu değer, tipik durumda oldukça düşük ek yük vermek için seçilmiştir.

Çekirdek kodu bitlerini okuduğum, gösterdiğiniz değerin keyfi olmadığını gösteriyor. Ham sabiti 64'ü yerine kullanmak için daha eski bir uygulama vardı TCP_MIN_MSS. Bu nedenle, çekirdek geliştiricilerin karşılaştığı garip bir IP-IP ağı olduğunu varsayıyorum, bu da onların nasıl gördüğünüze değer katabileceklerine karar vermelerini sağladı.

Ancak standart olmayan ağ türünün ne olduğunu söyleyemem.


576, datagramlar için MTU'dur . Bu durumda, TCP paketleri DF bitini ayarladığından datagram sınırları değil, önemli olan paket sınırlarıdır.
David Schwartz

IP datagramları ve TCP paketleri için tanımlanan minimum MTU da IP datagramlarıdır.
gelraen

Doğru, ancak bu TCP sınırlaması datagramlar için değil, paketler içindir, çünkü TCP datagramları asla (normalde) parçalanmaz. 576 bayt datagram kuralının önemli olduğu tek nokta, uygulamanın bir pakette en az 8 bayt veriyi desteklemesi gerektiği anlamına gelir (dolayısıyla formülde 8). Aksi takdirde, 576 baytlık bir datagramın parçalanması imkansızdır.
David Schwartz
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.