Como a conexão SSH sobrevive a uma reinicialização da rede?

63

Em um shell SSH do Linux, digite /etc/init.d/network restartpara reiniciar o serviço de rede.

Espero que minha conexão SSH morra desde que o serviço de rede esteja inoperante. Mas isso não acontece. Muito legal. Mas como o Linux consegue isso? Como mantém minha conexão SSH ativa durante a reinicialização do serviço?

Serge Wautier
fonte

Respostas:

69

Faz isso sem fazer nada de especial. A rede reinicia em menos tempo do que a conexão TCP leva para atingir o tempo limite; portanto, a conexão TCP sobrevive à "interrupção" da mesma maneira que sobreviveria a qualquer interrupção temporária da rede.

O único motivo pelo qual o Windows não faz a mesma coisa é porque o Windows redefine especificamente as conexões TCP quando uma interface de rede fica inativa. Isso é, pelo menos sem dúvida, uma coisa bastante complicada de se fazer, porque o TCP foi projetado especificamente para sobreviver a quedas de rede transitórias.

David Schwartz
fonte
11
David, isso significa que a pilha TCP / IP não é reiniciada, certo? Porque, se fosse, o servidor teria perdido o controle do soquete SSH e o processo filho sshd (obrigado Nils) seria encerrado. O que traz a próxima pergunta: qual serviço gerencia os soquetes? TIA.
Serge Wautier
@ David Schwartz - que parâmetros posso usar para alterar o tempo limite? Como descubro o valor atual do tempo limite? E está configurado no servidor ou no cliente?
Martin Vegter 11/11/16
@MartinVegter Você realmente não deseja alterar os parâmetros de tempo da conexão TCP, pois eles precisam coordenar os dois lados e mexer com eles pode afetar a capacidade do TCP de lidar com a perda de pacotes. É melhor projetar o sistema como um todo para tolerar a perda de conexão TCP sem problemas, recuperando a conexão.
David Schwartz
11

O SSHD bifurca um processo filho na conexão. Esse processo filho não será interrompido se o SSHD ou toda a rede for reiniciada. Esta é a razão pela qual você pode atualizar o ssh e / ou sua configuração, fazer um service sshd restarte ainda manter-se conectado à sua antiga sessão ssh com as configurações antigas. Além disso, o ssh se recupera bem de pequenas interrupções na rede.

Nils
fonte
2
O SSH nem sabe sobre 'pequenas falhas de rede', pelo motivo exposto por David Schwartz. Não é uma propriedade do SSH especificamente.
user207421
Não tenho certeza se também não há um pouco de programação envolvida no lado ssh. Basicamente, todos os serviços TCP devem ser tolerantes a falhas - muitos não. É necessário haver um mecanismo adicional de nova tentativa envolvido no aplicativo - então o serviço também pode sobreviver a interrupções "médias".
Nils
3
Conforme explicado pela EJP, sua resposta é verdadeira, mas irrelevante.
Gilles 'SO- stop be evil'
3
Esta resposta foi útil para mim, porque acrescentou uma visão sobre o que sshdfaz para evitar que ocorram service sshd restart. Se você atualizar sshd( atualização de segurança etc), os processos filhos ainda estarão em execução no código original (pré-atualização), mas continuarão fornecendo serviço, em vez de serem interrompidos. Eu acho que a disponibilidade do soquete de escuta para o sshdprocesso principal é interrompida muito brevemente, no entanto, quando o primeiro processo filho termina e a interface de rede momentaneamente indica a porta como fechada.
allquixotic
11
@ Nils Eu sei que você escreveu isso. Mas isso faz o leitor comum pensar que o garfo é relevante. Mas o mesmo acontece com os programas que não se bifurcam. Sua resposta é algo como: "Como o aço é mais forte que o ferro, as maçãs são vermelhas"
Daniel Alder