Mali zahtjevi rade, velika preuzimanja se zakoče, i neko predloži MSS clamping. Taj predlog je dovoljno često tačan da ga vrijedi probati u ispravnom redu, i dovoljno često netačan da izgubite popodne ako ga primijenite naslijepo. Tri provjere ispod razdvajaju stvarni problem veličine TCP-a od problema s UDP-om, od pokvarenog otkrivanja path-MTU i od clampa koji nikad ne vidi rukovanje koje bi trebalo prepisati.

Počnite od oblika kvara

Kvar veličine ima potpis: veza se uspostavi, autentifikacija i mali odgovori uspiju, a zatim se prijenos zaglavi na neodređeno vrijeme kada mu zatreba segment pune veličine. Stranice koje učitaju tekst ali nikad ne dovrše sliku isti su kvar u manjem obimu. Ako se ništa uopšte ne povezuje, problem je ranije na putu i clamping neće pomoći. Clamp ne može popraviti rukovanje koje nikad nije stiglo.

Potpis postoji zato što se veličina segmenta dogovara upravo u rukovanju. Svaka strana oglašava maksimalnu veličinu segmenta kao TCP opciju, a pošiljaoci poštuju oglas druge strane. Ako put ne može nositi tako velik segment, kvar se pojavi kasnije, kada pošiljalac konačno pokuša jedan.

Držite transport na oku dok čitate taj simptom. Clamping je prepisivanje TCP opcije, pa zvučni ili video poziv koji se zaglavi pod istim tunelom nije MSS problem i neće se popraviti njime. Zapišite transport prije nego što dirnete TCP opciju.

Odredite cijenu puta, pa je uporedite s tunelom

Dva broja su važna i često se miješaju. path-MTU je najveći paket koji put prenosi bez fragmentacije, a oglašeni MSS za IPv4 je ta vrijednost minus 40 bajtova IP i TCP zaglavlja, ili minus 60 za IPv6. Tunelska enkapsulacija troši dio budžeta prije nego što unutrašnji paket uopšte počne.

ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20

Ping s do-not-fragment bitom kaže vam preživi li paket te veličine korisnog tereta; mijenjajte veličinu dok ne padne i empirijski ste našli granicu puta. Izlaz tracepatha izvještava MTU otkriven duž rute, što je brže kada radi i manje pouzdano kada međusklop filtrira probe.

Sada oduzmite trošak tunela. Vanjsko IP zaglavlje, UDP zaglavlje i zaglavlje specifično za tunel izlaze iz istih 1500 bajtova, pa je upotrebljivi unutrašnji MTU na tipičnoj Ethernet podlozi niži nego što fizička veza sugerira. Ako je izračunati unutrašnji MTU niži od onoga što oglašavaju vaši partneri, našli ste stvarnog kandidata za clamp, a ne nagađanje. Ako je izračunata vrijednost već viša od partnerovog oglasa, zaustavite se ovdje i tražite drugdje.

Postavite clamp tamo gdje prolazi rukovanje

Clamp radi tako što prepisuje MSS opciju u SYN i SYN-ACK paketima dok prelaze pristupnik. Ako pravilo stoji na interfejsu koji nijedan smjer nikad ne prelazi, pregovaranje završi nepromijenjeno i simptom ostaje, zato postavljanje odlučuje o ishodu više nego vrijednost.

SymptomWhat it points toNext check
Handshake completes, large transfer stallsSegment size larger than the path can carryPath MTU against the tunnel's effective MTU
Nothing connects, small or largeRouting, firewall or keying failureNot MSS; look at the tunnel state
Only UDP applications stallDatagram size or a dropped ICMP errorPlatform-specific UDP handling, not clamping
Fixed after reconnect, returns laterClamp applied to one direction or one interfaceRule placement and the handshake path

Smjer je druga polovina. Clampanje jednog smjera popravlja polovicu tokova i ostavlja ostatak da pada na način koji izgleda isprekidano, zato ga primijenite na oba smjera proslijeđenog saobraćaja. Klasičan Linux oblik za tunelski interfejs je mangle pravilo koje hvata SYN pakete:

iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Obratite pažnju šta --clamp-mss-to-pmtu zapravo radi: izvodi vrijednost iz MTU-a rute, što nije uvijek stvarni budžet korisnog tereta tunela. Na tunelu zasnovanom na ruti, gdje se unutrašnja ruta i vanjski put razlikuju, eksplicitna vrijednost izračunata u prethodnoj provjeri predvidivija je od automatske.

Provjerite novom vezom i držite povratnu informaciju živom

Uspostavljena veza zadržava MSS o kojem je pregovarala, pa testiranje u istoj sesiji ništa ne dokazuje. Otvorite novu vezu nakon promjene i čitajte dogovorenu vrijednost direktno, umjesto da je izvodite iz prijenosa koji slučajno završi.

ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS

Prva naredba izvještava MSS socketa zajedno sa stanjem zagušenja, što je najbrža potvrda da je clamp djelovao. Druga potvrđuje da je pravilo za koje mislite da ste dodali pravilo koje postoji, u tabeli u koju je postavljeno.

Zatim zaštitite mehanizam koji niste popravili. Otkrivanje path-MTU zavisi od toga da ICMP fragmentation-needed poruke stignu do pošiljaoca, pa će firewall koji ih odbacuje nastaviti kvariti velike prijenose čak i uz ispravan clamp. Dozvolite te poruke za put tunela ili prihvatite da clamping kompenzuje politiku koju ste odabrali.

Na kraju, oduprite se iskušenju da clamp tretirate kao dugme za podešavanje. On ograničava veličinu segmenta, što košta propusnost na putevima kojima nikad nije trebao. Primijenjen nakon tri provjere, to je ciljana popravka; primijenjen prvi, to je promjena koja skriva izvorni kvar i dodaje drugu varijablu svakom kasnijem testu. Tu razmjenu vrijedi napraviti namjerno, a ne po defaultu.

Zapišite path-MTU koji ste izmjerili, trošak tunela koji ste oduzeli, pravilo koje ste dodali i MSS koji ste nakon toga vidjeli. Četiri broja čine sljedeći incident pretragom umjesto istragom.

Povezani članci