Por que demora alguns minutos para limpar uma porta TCP de escuta depois que um programa morre?

27

Se eu matar um programa que esteja escutando em uma porta TCP, levará alguns minutos até que a porta seja recuperada pelo sistema e utilizável novamente. Eu já vi várias perguntas e respostas mencionando esse fenômeno, mas sem uma explicação. Por que isso acontece, por que o sistema não recupera a porta imediatamente? Isso também acontece em outros sistemas, como Windows ou Mac?

Petr Pudlák
fonte

Respostas:

25

A idéia por trás disso é garantir que você não receba pacotes direcionados para o programa anterior escutando nessa porta. Esse TIME_WAITestado é definido no RFC793 como duas vezes a vida útil máxima do segmento.

Não conheço outros sistemas operacionais, mas presumo que todos eles tenham algum tipo de comportamento semelhante.

Uma solução alternativa para esse problema é definir SO_REUSEADDRno soquete que deve ignorar o TIME_WAITestado.

Ulrich Dangel
fonte
3
Verificando meu confiável diagrama de estados TCP, posso ver que o TIME_WAIT é o último estado de um soquete e geralmente persiste para 2MSL - que é o dobro da vida útil máxima do segmento. A especificação (RFC793) afirma isso como 2 minutos, dando 4 minutos no total. Isso permite tempo suficiente para que quaisquer solicitações e respostas ainda "em vôo" sejam processadas e apareçam no programa certo - ou sejam descartadas se o soquete estiver em TIME_WAIT.
Faelkle 18/03/2013
Posso confirmar que isso também acontece no Windows.
Thomas Bratt