Мали захтеви раде, велика преузимања се заглаве, и неко предложи MSS ограничавање. Тај предлог је довољно често тачан да вреди пробати га у исправном редоследу, и довољно често нетачан да изгубите поподне ако га примените насумице. Три провере испод раздвајају стварни проблем величине TCP од проблема са UDP, од поквареног откривања path-MTU и од ограничавања које никада не види руковање које би требало да препише.

Почните од облика квара

Квар величине има потпис: веза се успостави, аутентификација и мали одговори успеју, а затим се пренос заглављује на неодређено време када му затреба сегмент пуне величине. Странице које учитају текст али никада не доврше слику исти су квар у мањем обиму. Ако се ништа уопште не повезује, проблем је раније на путу и ограничавање неће помоћи. Ограничавање не може поправити руковање које никада није стигло.

Потпис постоји зато што се величина сегмента договара управо у руковању. Свака страна оглашава максималну величину сегмента као TCP опцију, а пошиљаоци поштују оглас друге стране. Ако пут не може да носи тако велики сегмент, квар се појави касније, када пошиљалац коначно покуша један.

Држите транспорт на оку док читате тај симптом. Ограничавање је преписивање TCP опције, па звучни или видео позив који се заглављује под истим тунелом није MSS проблем и неће се поправити њиме. Запишите транспорт пре него што дирнете TCP опцију.

Оцените пут, па га упоредите са тунелом

Два броја су важна и често се мешају. path-MTU је највећи пакет који пут преноси без фрагментације, а оглашени MSS за IPv4 је та вредност минус 40 бајтова IP и TCP заглавља, или минус 60 за IPv6. Тунелска инкапсулација троши део буџета пре него што унутрашњи пакет уопште почне.

ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20

Ping са do-not-fragment битом каже вам да ли пакет те величине корисног терета преживи; мењајте величину док не пропадне и емпиријски сте пронашли границу пута. Излаз tracepath извештава MTU откривен дуж руте, што је брже када ради и мање поуздано када међускок филтрира пробе.

Сада одузмите трошак тунела. Спољно IP заглавље, UDP заглавље и заглавље специфично за тунел излазе из истих 1500 бајтова, па је употребљиви унутрашњи MTU на типичној Ethernet подлози нижи него што физичка веза сугерише. Ако је израчунати унутрашњи MTU нижи од онога што оглашавају ваши партнери, пронашли сте правог кандидата за ограничавање, а не претпоставку. Ако је израчуната вредност већ изнад огласа партнера, зауставите се овде и тражите другде.

Поставите ограничавање тамо где пролази руковање

Ограничавање ради тако што преписује MSS опцију у SYN и SYN-ACK пакетима док прелазе пролаз. Ако правило стоји на интерфејсу који ниједан смер никада не прелази, преговори се завршавају непромењено и симптом остаје, зато постављање одлучује о исходу више него вредност.

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

Смер је друга половина. Ограничавање једног смера поправља половину токова и оставља остатак да пада на начин који изгледа повремено, зато га примените на оба смера прослеђеног саобраћаја. Класичан Linux облик за тунелски интерфејс је mangle правило које хвата SYN пакете:

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

Обратите пажњу шта --clamp-mss-to-pmtu заиста ради: изводи вредност из MTU руте, што није увек прави буџет корисног терета тунела. На тунелу заснованом на рути, где се унутрашња рута и спољни пут разликују, експлицитна вредност израчуната у претходној провери предвидљивија је од аутоматске.

Проверите новом везом и држите повратну информацију живом

Успостављена веза задржава MSS око којег се преговарало, па тестирање у истој сесији ништа не доказује. Отворите нову везу после промене и читајте договорену вредност директно, уместо да је изводите из преноса који случајно заврши.

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

Прва наредба извештава MSS сокета заједно са стањем загушења, што је најбрза потврда да је ограничавање деловало. Друга потврђује да је правило за које мислите да сте га додали правило које постоји, у табели у коју је постављено.

Затим заштитите механизам који нисте поправили. Откривање path-MTU зависи од тога да ICMP fragmentation-needed поруке стигну до пошиљаоца, па ће заштитни зид који их одбацује наставити да квари велике преносе чак и са исправним ограничавањем. Дозволите те поруке за пут тунела, или прихватите да ограничавање компензује политику коју сте изабрали.

На крају, одуприте се искушењу да ограничавање третирате као дугме за подешавање. Оно ограничава величину сегмента, што кошта пропусност на путевима којима никада није било потребно. Примењено после три провере, то је циљана поправка; примењено прво, то је промена која скрива изворни квар и додаје другу променљиву сваком каснијем тесту. Ту размену вреди направити свесно, а не подразумевано.

Запишите измерени path-MTU, одузети трошак тунела, додато правило и MSS који сте после видели. Четири броја чине следећи инцидент претрагом уместо истрагом.

Повезани чланци