Skirtukas vis dar rodo prietaisų skydelį iš laikų prieš tuneliui numirštant. Būsenos skaičiai sustingsta, mažas sukiklis tebe sukasi, o adreso juostoje vis dar yra programa, kurią atidarėte prieš valandą. Po nutrūkimo nieko nelietėte, tačiau puslapis galbūt vis dar bando pasiekti savo serverį pagal savo paties grafiką. Štai ką žmonės praleidžia: puslapis, kuris tik matomas, ir puslapis, kuris vis dar siunčia užklausas, iš išorės atrodo vienodai, ir tik vienas iš jų atsiranda tinklo žurnale.

Darbas, kurį puslapis pradeda be jūsų

Keturi mechanizmai palaiko įkeltą dokumentą užimtą. Pasikartojantis laikmatis gali kas kelias sekundes iš naujo paleisti būsenos kvietimą. Fetch gali suveikti, kai skirtukas vėl tampa matomas po to, kai į jį grįžtate. Tiesioginis kanalas, pastatytas ant WebSocket arba serverio siunčiamų įvykių, gali bandyti prisijungti iš naujo pagal savo atsitraukimo grafiką. Svetainės užregistruotas service worker gali pabusti eilėje esančiai sinchronizacijai net tada, kai priešais jus nėra jokio skirtuko.

Nė vienam iš jų nereikia spustelėjimo, ir nė vienas neįkelia dokumento iš naujo. Adreso juosta, slinkties padėtis ir atvaizduotos reikšmės visos lieka ten, kur buvo. Keičiasi tik tinklo pusė: kiekvienas naujas bandymas yra šviežias sprendimas, priimtas tą akimirką, kai jis prasideda.

Šis skirtumas svarbus, nes matomas puslapis saugomas vietoje. Jau nupiešti pikseliai nieko nesako apie tai, ar kita užklausa pavyko. Sustingusi diagrama su sukikliu yra įprasta puslapio, kurio užklausos dabar nepavyksta, išvaizda. Ekrano skaitymas pasako, ką serveris pasakė prieš kelias minutes, o ne ką naršyklė daro dabar.

Kodėl ankstesnis puslapio įkėlimas neišlaiko maršruto

Niekas puslapio įkėlime nesusieja dokumento su tuneliu. Maršrutizavimas sprendžiamas kiekvienam paketui, siuntimo metu, iš lentelės, kuri egzistuoja, kai paketas išvyksta. Kai tunelio sąsaja išnyksta, ta paieška nebeatitinka tunelio maršruto. Ji arba nukrenta į fizinį adapterį, arba nieko neranda, priklausomai nuo to, ką klientas paliko.

Pasikartojantys atgaliniai kvietimai yra įprastos suplanuotos užduotys. HTML standarto laikmačių skyrius aprašo, kaip jie įtraukiami į eilę, ir intervalą traktuoja kaip minimalų vėlavimą, o ne tikslaus ritmo pažadą, todėl fono skirtukas gali apklausti daug rečiau, nei prašo jo kodas. Mažiau bandymų nėra tas pats kaip jokių bandymų, o skirtuko grąžinimas į priekį yra įprasta jų protrūkio akimirka.

Kur nusileidžia gedimo politika

Kliento blokas vertinamas tada, kai bandoma prisijungti, o ne tada, kai puslapis buvo gautas. Jei įprasta prieiga vis dar leidžiama, pakartotinis bandymas gali išeiti per fizinę jungtį atvirai. Jei politika sulaiko tą srautą, kol tunelis grįš, bandymas nepavyksta prisijungimo momentu, ir puslapis rodo klaidą, kurią jis gali pakartoti po kelių sekundžių.

Du duomenys nulemia, kurį iš jų gausite. Pirmasis yra taikymo apimtis, kurią klientas palaiko: viso įrenginio blokas, tunelio adapteriu apribotas blokas arba taisyklių rinkinys su išimtimis. Antrasis yra tai, ar paskirties vieta patenka į išimtį, kurią anksčiau pridėjote vietiniam spausdintuvui, užgrobtam portalui ar srautinio perdavimo paslaugai.

Programos lygio šifravimas nieko to nekeičia. HTTPS apsaugo baitus tarp naršyklės ir serverio; jis nieko nesako apie tai, kuri sąsaja juos neša. Puslapis gali būti puikiai užšifruotas ir vis tiek išeiti netinkamu keliu, ir būtent tai leidžia siauras blokas.

Kontroliuojamas patikrinimas su vienkartiniu puslapiu

Naudokite jūsų kontroliuojamą prieglobos serverį ir puslapį, kuris nieko nedaro, tik jį iškviečia, kad žaidime nebūtų realių duomenų. Iš terminalo paimkite kelio pavyzdį prieš nutrūkimą ir po jo:

curl -sS --max-time 5 -o /dev/null -w '%{http_code} %{remote_ip}\n' https://probe.example.net/ping

Paleiskite jį su įjungtu tuneliu, tada išjunkite tunelį ir paleiskite dar kartą. Atsakymas iš viešo adreso, kai tunelis išjungtas, pasako, kad tiesioginis kelias atviras. Laiko limitas arba atmestas ryšys pasako, kad politika laiko. Pakartokite dar kartą po to, kai klientas vėl prisijungs, kad matytumėte tunelio kelią grįžtant, o ne manytumėte, jog taip įvyko.

Naršyklėje tinklo skydelis atskiria du klausimus. Filtruokite pagal Fetch/XHR, tada skaitykite iniciatoriaus stulpelį: įrašas, kurį pradėjo laikmatis ar scenarijus, be užregistruotos navigacijos prieš jį, yra fono bandymas, o ne perkrovimas. Palyginkite jo pradžios laiką su momentu, kai tunelis nutrūko. Jei įrašas vis dar laukia, kai tunelio nebėra, užklausa laukia kelio, kurio nebėra.

Serverio pusės įrodymai stipresni už viską, ką rodo naršyklė. Užklausų žurnalas su laiko žyma ir šaltinio adresu įrodo, kad paketas atvyko. Naršyklės įrašai gali turėti slapukų, žetonų ir pilnų URL, todėl palikite tik tuos laukus, kurių reikia jūsų klausimui, o likusius užtušuokite prieš ką nors įklijuodami.

Ką daryti su atsakymu

Jei fono bandymai ir toliau pavyksta, kai tunelis išjungtas, blokas yra siauresnis, nei manėte, ir tą spragą verta uždaryti prieš patikint klientui jautrų darbą. Jei jie nepavyksta, politika atlieka savo darbą, o sustingęs puslapis yra tik kosmetinis. Bet kuriuo atveju vieno skirtuko uždarymas nėra viso įrenginio kontrolė: kiti skirtukai, kitos naršyklės ir kitos programos kiekviena planuoja savo darbą.

Verti dėmesio tolesni žingsniai: išvardykite, kokias išimtis ir kodėl pridėjote, patvirtinkite, ar klientas blokuoja tik tunelio apimties srautą, ar visą srautą, ir stebėkite vieną fono užklausą nuo pradžios iki pabaigos su atviru serverio žurnalu. Tie trys atsakymai apima didžiąją dalį to, ką ataskaita „VPN nutrūko, o kažkas vis dar prijungtas“ iš tikrųjų turi.

Susiję straipsniai