Mantenha os soquetes conectados ao TCP / IP vivos pela Internet - quando? quão? e quanto?

ATUALIZAR: Pule para a resposta se quiser salvar o longo preâmbulo.

As conexões TCP / IP KeepAlives são especificadas para serem pelo menos uma vez a cada duas horas:http://tools.ietf.org/html/rfc1122#page-101. O problema é que isso foi escrito em 1989 e está preocupado com o custo do envio do pacote KeepAlive extra! No entanto, ainda é o tempo padrão que a maioria dos sistemas operacionais, de acordo com as especificações, envia o KeepAlives para um soquete conectado após um período de inatividade! É claro que hoje em dia a maioria das conexões atinge o tempo limite antes disso, se inativa, e se conectada a um par pela Internet, as conexões morrem sem o seu conhecimento antes disso (apesar de definir o tempo limite mais alto do que isso - suspeito que as tabelas de roteadores no meio não se incomodem vivo - eu sempre me perguntei para onde vai a última mensagem vazada ...ATUALIZAR: A razão para isso são os 'roteadores' que podem estar no seu terminal ou os hosts remotos são 'stateful' e reconhecem a conexão e interrompem a conexão após algum período de inatividade - os roteadores pelos quais você passa pela Internet não podem descartar sua conexão - eles não se importam - o pacote é apenas enviar para onde deve ir). Então, eu vi duas soluções comuns para manter as conexões vivas pela Internet:

1) Desrespeito (EDITAR: como foi apontado para mim, isso não está desconsiderando as especificações, está apenas alterando o padrão). As especificações e alteram o intervalo KeepAlive de todo o sistema para menos de 2 horas ou 2) implementam seu próprio sistema 'KeepAlive' pesquisando periodicamente os pares.

De qualquer jeito; qual é um período adequado (de inatividade para enviar seu KeepAlive)? Eu já vi tudo, desde 1 segundo até o padrão 2 horas. Parece que o número está esgotado ... Se eu tiver um aplicativo cliente conectando-se de qualquer lugar do mundo, qual é o período seguro e razoável (eu quero uma única conexão persistente)? Conectando-se a um par muitos saltos no outro lado do mundo na Internet, a conexão morre em 301 segundos (embora você só saiba disso quando tenta enviar algo), portanto, definir o período para 300 segundos parece ser o número mágico - Eu recebo o KeepAlive 1 segundo antes da morte - esse intervalo nunca me falhou .. mas é seguro?

EDITAR: Essa conexão em particular está sendo implementada no C # 3.0, portanto, codifique essa bem-vinda.

questionAnswers(2)

yourAnswerToTheQuestion