Qual é a diferença entre conexão e tempo limite de leitura para sockets?

3 perguntas:

  1. Qual é a diferença entre conexão e tempo limite de leitura para sockets?

  2. O que o tempo limite de conexão definido como “infinito” significa? Em que situação pode permanecer em um loop infinitivo? e o que pode desencadear que o laço infinito morre?

  3. O que significa o tempo limite de leitura definido como “infinito”? Em que situação pode permanecer em um loop infinitivo? e o que pode desencadear que o laço infinito morre?

1) Qual é a diferença entre conexão e tempo limite de leitura para sockets?

O tempo limite da conexão é o tempo limite na conexão inicial; isto é, completando o handshake da conexão TCP. O tempo limite de leitura é o tempo limite em espera para ler os dados 1 . Especificamente, se o servidor não enviar um byte segundos após o último byte, um erro de tempo limite de leitura será gerado.

2) O que o tempo limite de conexão definido como “infinito” significa? Em que situação pode permanecer em um loop infinitivo? e o que pode desencadear que o laço infinito morre?

Isso significa que a tentativa de conexão pode potencialmente bloquear para sempre. Não há loop infinito, mas a tentativa de conexão pode ser desbloqueada por outro thread fechando o soquete. (Uma chamada Thread.interrupt() também pode fazer o truque … não tenho certeza.)

3) O que significa o tempo limite de leitura definido como “infinito”? Em que situação pode permanecer em um loop infinito? O que pode desencadear que o loop infinito termine?

Isso significa que uma chamada para read no stream de soquete pode bloquear para sempre. Mais uma vez, não há loop infinito, mas a read pode ser desbloqueada por uma chamada Thread.interrupt() , fechando o socket, e (claro) a outra extremidade enviando dados ou fechando a conexão.


1 – Não é … como um comentarista pensou … o tempo limite em quanto tempo um socket pode ser aberto ou ocioso.

Esses são valores de tempo limite impostos pela JVM para estabelecimento da conexão TCP e aguardando a leitura de dados do soquete.

Se o valor estiver definido como infinito, você não esperará para sempre. Significa simplesmente que a JVM não tem tempo limite e o sistema operacional será responsável por todos os tempos limite. No entanto, os tempos limite no sistema operacional podem ser muito longos. Em algumas redes lentas, vi tempos limite de até 6 minutos.

Mesmo se você definir o valor de tempo limite para o soquete, ele poderá não funcionar se o tempo limite ocorrer no código nativo. Podemos reproduzir o problema no Linux, conectando a um host bloqueado pelo firewall ou desconectando o cabo no switch.

A única abordagem segura para lidar com o tempo limite do TCP é executar o código de conexão em um thread diferente e interromper o thread quando ele demorar muito.

Intereting Posts