TCP MSS w Linuksie musi mieć co najmniej 88 (zawierać / net / tcp.h):
/* Minimal accepted MSS. It is (60+60+8) - (20+20). */
#define TCP_MIN_MSS 88U
Moje pytanie brzmi: skąd pomysł na „60 + 60 + 8” i dlaczego? Rozumiem, że 20 + 20 pochodzi z nagłówka IP + nagłówka TCP.
EDYCJA: Po bliższym przyjrzeniu się nagłówkom formuła wygląda tak:
(MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR)
Pozostaje pytanie: dlaczego ? Dlaczego jądro Linuksa używa tej formuły, tym samym zabraniając (wymuszonemu przepływowi) segmentów TCP, powiedzmy, 20 bajtów? Pomyśl tutaj.
EDIT2: Oto mój przypadek użycia. Wymuszając niski poziom MSS na gnieździe / połączeniu, wszystkie pakiety wysyłane przez stos będą miały niewielki rozmiar. Chcę ustawić niski MSS podczas pracy z iperf do testowania pakietów / sekund. Nie mogę uzyskać pakietów IP mniejszych niż 128 bajtów (ramki Ethernet o długości 142 bajtów) z powodu tego dolnego limitu dla MSS! Chciałbym zbliżyć się do ramki Ethernet o wielkości 64 bajtów zgodnie z RFC 2544. Teoretycznie powinno to być możliwe: 18 + 20 + 20 <64.
źródło
TCP_MIN_MSS
.TCP_MIN_MSS
. Dlaczego nie może być 1? Jaki RFC by to zepsuł? Jaki problem teoretyczny / praktyczny spowodowałby? Czy na pewno jest to „poza specyfikacją”? „Różne minima”? Jest tu tylko jedno minimum zainteresowania: najmniejszy MSS dozwolony przez jądro.Odpowiedzi:
Implementacja jest wymagana do obsługi nagłówków TCP i IP o maksymalnych rozmiarach, z których każdy ma 60 bajtów.
Implementacja musi obsługiwać datagramy 576 bajtów, co nawet przy maksymalnej liczbie nagłówków oznacza więcej niż 8 bajtów danych w datagramie. Aby wysłać datagramy zawierające więcej niż 8 bajtów danych, fragmentacja IP musi umieścić co najmniej 8 bajtów danych w co najmniej jednym pakiecie reprezentującym fragmenty datagramu. Dlatego implementacja musi obsługiwać co najmniej 8 bajtów danych w pakiecie.
Podsumowując, implementacja musi obsługiwać pakiety 60 + 60 + 8 bajtów.
Kiedy wysyłamy pakiety, które są częścią strumienia TCP, mają 20-bajtowy nagłówek IP (plus opcje) i 20-bajtowy nagłówek TCP (plus opcje). To pozostawia minimum (60 + 60 + 8) - (20 + 20) bajtów dla danych i opcji. Dlatego jest to maksimum, które możemy bezpiecznie założyć implementacji TCP MSS.
źródło
60
pokazuje się dwa razyNie wiem, skąd pochodzi ta liczba, ale mogę powiedzieć, że jest poza specyfikacją. Minimalna MTU obsługiwana dla sieci IP wynosi 576 bajtów, czyli 512 bajtów danych plus do 64 bajtów dla nagłówków IP + TCP i opcji TCP. Wartość tę wybrano, aby zapewnić przyzwoicie niskie koszty ogólne w typowym przypadku.
Moje czytanie fragmentów kodu jądra sugeruje, że pokazywana wartość nie jest arbitralna. Była starsza praktyka, aby po prostu użyć surowej stałej 64 zamiast
TCP_MIN_MSS
. Dlatego zakładam, że istnieje dziwna sieć IP over Foo, z którą natknęli się programiści jądra, która skłoniła ich do podjęcia decyzji, że mogą podnieść wartość do tego, co widzisz.Tego nietypowego typu sieci nie mogę jednak powiedzieć.
źródło