Skype e Windows Update

O popular serviço de comunicação Skype ficou completamente indisponível no dia 16 deste mês, impedindo os seus usuários de fazer ou receber chamadas. O serviço voltou ao seu funcionamento normal somente dois dias depois, e em uma nota no seu blog oficial a Skype disse que o incidente foi causado por um problema no seu algoritmo de alocação de recursos de rede, que não soube tratar um grande número de reboots nos computadores dos seus usuários devido aos patches mensais da Microsoft.

Muita gente não acreditou nessa explicação. Eu não trabalho para o Skype e não tenho todas as informações comigo, mas julgando pelo que foi divulgado eu não vejo motivo para duvidar que o que aconteceu foi exatamente o que o Skype relatou. Para explicar porque eu acho que essa explicação é a verdadeira, eu organizei este post no formato de perguntas e respostas que se seguem abaixo:

(Antes de começar, uma nota importante: Eu não tenho nenhuma inside information sobre este caso, e todas as respostas foram baseadas em informações públicas disponíveis na rede. Boa parte da explicação sobre como o problema ocorreu é especulação minha com base na (pequena) documentação fornecida pelo Skype).

Como é que o reboot das máquinas dos usuários pode derrubar um serviço? Como isso afetaria os servidores?

Resposta curta: Porque as máquinas dos usuários são os servidores do Skype!

Resposta longa: Precisamos entender primeiro como funciona o Skype. Ao contrário de serviços como o MSN Live Messenger, onde todo o diretório com a localização de usuários está armazenado em servidores centrais, o Skype utiliza o modelo peer-to-peer (P2P) para distribuir essa base de dados pelos computadores dos seus usuários. No caso do Skype os computadores que armazenam estas informações são chamados "supernodes", que são computadores normais de usuários, eventualmente escolhidos automaticamente com base na banda disponível, localização e fácil acessibilidade. Ou seja, ao usar o Skype, você pode estar não só fazendo e recebendo chamadas como também funcionando como servidor para outros usuários do Skype.

Os supernodes  funcionam também eles mesmos como uma rede P2P, estabelecendo ligações e replicando o diretório de usuários. Você pode enxergar o Skype como sendo uma rede P2P multi-camadas: existe uma rede P2P na qual os clientes fazem chamadas diretamente entre si, que usa um diretório de usuários mantido por uma outra rede P2P que troca informações entre si. Essa segunda rede, a dos supernodes, tem um número muito menor de participantes, que são escolhidos entre a massa de usuários.

O fato de não depender de um servidor central torna uma rede P2P extremamente resiliente, mas cria o problema de gerenciar a entrada e saída de nós da rede. A qualquer momento o dono de um supernode pode resolver desligar o Skype (ou reiniciar a computador!), deixando os seus clientes e os outros supernodes inesperadamente a ver navios. Para tratar isso o Skype possui algoritmos para recompor automaticamente a rede, promovendo novos supernodes, reestabelecendo ligações e replicando as informações entre eles.

Mas nós não estamos falando de algoritmos triviais aqui. Encontrar uma forma de fazer isso otimizando os recursos de rede é um tipo de problema que a matemática classifica como não-polinomial - ou seja, não existe um algoritmo que permita um computador (ou "máquina de Turing determinística"na linguagem matemática) encontrar a melhor resposta, a chamada resposta "ótima". A alternativa que resta é encontrar problemas polinomiais cujas respostas se aproximam das respostas ótimas do problema não-polinomial, dentro de determinadas condições definidas, e usar algoritmos para resolver estes problemas. As respostas não serão "ótimas" mas boas o suficiente para a rede ficar estável, mas fora das condições para qual o algoritmo foi concebido as respostas podem ser "péssimas".

Cima, você está enrolando...

Calma, estou chegando lá!

O que provavelmente aconteceu é que, após os patches de agosto serem distribuídos pela Microsoft, vários supernodes foram reinicializados em um espaço relativamente curto de tempo. Sob estas condições o algoritmo não conseguiu recompor a rede P2P dos supernodes e os clientes perderam o acesso ao serviço. E pior, como nenhum cliente conseguia se conectar, o sistema não conseguia escolher novos supernodes!  É uma situação onde o sistema não consegue se recuperar sozinho e a rede tem que ser remontada externamente.

Mas a Microsoft não divulga patches todo mês? Porque isso não aconteceu antes?

Boa pergunta. Esse mês não foi em nada diferente dos outros meses, que na maioria dos casos também tiveram patches que exigiam a reinicialização do sistema.

É dificil responder sem conhecer o algoritmo. Talvez este mês uma coincidência na hora da reinicializaçao de alguns supernodes mais importantes tenha colocado a rede em uma situação onde ela não consegue mais se recompor. Quando se trata de problemas não-polinomiais sempre existem casos (não-triviais e difíceis de prever) para qual o algoritmo dará uma resposta extremamente ruim.

Um grupo de hackers russo divulgou na mesma semana um exploit de um ataque de negação de serviço para o Skype. Não é muita coincidência?

É apenas coincidência. Este exploit ataca justamente os supernodes, que ficam em redes espalhadas pelo mundo fora da rede do Skype. Se um ataque tivesse ocorrido nós teríamos evidência abundante disso, e não temos.

Nem todos os computadores do mundo aplicam patches ao mesmo tempo. O Windows sugere por default o horário de 3 da manha para a instalação, e existem fusos horários distintos no mundo. Nem todos se reinicializam ao mesmo tempo.

Lembre-se que o problema é causado pela reinicialização dos supernodes, não de computadores normais dos usuários. Como os supernodes são escolhidos com base na banda disponível e conectividade, é provável que eles estejam mais concentrados em lugares específicos do mundo.

O número de supernodes também é bem pequeno em relação ao número normal de clientes, e não é preciso que tantos computadores assim sejam reinicializados para afetar a rede. Eu suspeito que uma das mudanças no algoritmo que o Skype fará para impedir que essa situação ocorra de novo foi a de aumentar a relação supernodes/clientes comuns. Mas isso é especulação minha.

A culpa é então da Microsoft ou do Skype?

O Skype assumiu integralmente a culpa pelo problema. A empresa contactou a Microsoft assim que o incidente começou, e o nosso time de resposta a incidentes trabalhou em conjunto com o Skype para identificar se alguma das atualizações poderiam estar causando o problema. Com o tempo ficou claro que o problema estava em uma situação sem precedente enfrentada pelo algoritmo de alocação de recursos de rede do próprio Skype. Essa situação sem precedente foi causado pela atualização dos sistemas pela Microsoft, mas é algo que o Skype deveria ter sido capaz de tratar.

Para terminar, a Microsoft tem o poder de reiniciar o meu PC?

Não!

O mecanismo de auto-atualização do Windows sequer vem configurado com um comportamento default, e apesar do sistema sugerir que as atualizações sejam instaladas automaticamente às 3 da manhã para maior conveniência, isto é uma decisão do usuário. O Windows permite ser configurado para que o usuário tenha que concordar antes de iniciar o download e a instalação das atualizações, e também para que nunca faça uma reinicialização de forma automática. Além disso, se um usuário estiver usando o sistema interativamente (i.e. a console não esteja bloqueada), o Windows vai sempre pedir a permissão do usuário antes de fazer a reinicialização.