;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

O que é DNS e por que tantos sites caíram por causa dele

Getty Images
Imagem: Getty Images

Lucas Carvalho

De Tilt, em São Paulo

04/10/2021 14h42Atualizada em 21/01/2022 16h39

A queda global dos aplicativos do Facebook, WhatsApp e Instagram nesta segunda-feira (4) ainda não tem uma explicação oficial por parte da empresa, mas especialistas ouvidos por Tilt concordam: provavelmente é culpa do DNS.

DNS significa Domain Name System, ou Sistema de Nomes de Domínios. É um protocolo que relaciona o endereço "nominal" de um site ou aplicativo (site do UOL, por exemplo) com o seu endereço real (número de IP, de Internet Protocol) nos bancos de dados da internet.

Funciona assim: quando você digita uol-br.atualizarondonia.com, servidores DNS entram em operação e "traduzem" o endereço que você digitou para o IP 200.221.2.45 (relativo ao UOL) e permitem o o. Quando ocorre uma falha em um desses servidores, o endereço IP fica fora de alcance.

Em julho deste ano, uma falha de DNS na empresa Akamai Technologies, por exemplo, levou uma queda global de sites e aplicativos de sistemas como Playstation, Airbnb e Delta Air Lines. No começo do ano, a plataforma de mensagens corporativas Slack e até o Gmail também caíram por falhas de DNS.

As falhas podem ser das mais diversas naturezas: uma mudança física nos servidores que tirou algum cabo do lugar, uma atualização em algum sistema na empresa que istra os servidores e que causou um erro imprevisto etc. Como muitas plataformas usam os mesmos servidores de DNS, qualquer pequena mudança em um deles pode causar um "efeito dominó" de quedas.

"Embora possa parecer uma falha imensa em todos esses serviços e aplicativos, o motivo é provavelmente um serviço DNS que todos eles usam para rotear suas páginas e serviços para nossos dispositivos", afirma Lotem Finkelsteen, chefe de inteligência de ameaças da empresa de segurança digital Check Point.

"Na maior parte dos casos, quando um site ou app fica inível, é por problema no DNS", diz Arthur Igreja, especialista em tecnologia. "É uma probabilidade histórica. Mas pode ser qualquer outra coisa. O Facebook tem um histórico de pouca transparência, costumam dar justificativas genéricas, sem detalhar o que de fato aconteceu."

Falha no BGP

Dane Knecht, vice-presidente da empresa de servidores Cloudflare, disse em seu perfil no Twitter que a queda global do Facebook teria a ver com DNS e que "as rotas BGP" da empresa "foram retiradas da internet".

BGP significa Border Gateway Protocol (Protocolo de Portão de Fronteira, em tradução literal). Trata-se do sistema que decide por qual rota os seus dados vão trafegar até chegar ao destino escolhido.

É como se fosse o Waze: quando você digita uol-br.atualizarondonia.com na barra de endereços do navegador e aperta Enter, ou quando abre o WhatsApp no celular, o BGP é o protocolo que avalia os possíveis caminhos que você pode tomar para chegar ao servidor desejado.

Se o BGP sai do ar, como parece ser o caso do Facebook nesta segunda, a plataforma fica "sem direção" e não consegue mais encontrar o caminho entre o usuário e o serviço que ele quer ar.

O que fazer?

Os provedores de o possuem DNS próprios, mas há também DNSs públicos como o OpenDNS e o DNS Advantage. A vantagem é que alguns deles possuem mais espaço de cache, o que deixa a navegação mais rápida.

Mas quando uma plataforma gigante como o Facebook sai do ar, não adianta mudar o DNS no seu computador. A falha provavelmente está relacionada à configuração da empresa (provedor) e não do usuário comum (cliente).

Nesses casos, não há o que fazer a não ser esperar que o Facebook ou seja qual for o site que saiu do ar encontre uma correção e volte a funcionar.