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.
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.