Ontem, ao depurar em um cluster hadoop, notei algo estranho
# netstat -taupen | grep 54310
tcp 0 0 10.0.12.209:54310 10.0.12.209:54310 TIME_WAIT
Você pode notar que o ip:porta de origem é igual ao ip:porta de destino. Como isso é possível. Alguém pode me explicar como as coisas estão funcionando na camada tcp para que essa conexão funcione?
É possível porque havia dois processos (presumivelmente de um fork). O lado esquerdo é um cliente (que chamou o bind(2) para definir seu IP e porta de origem, o que normalmente não é feito) e o lado direito é o servidor.
Este é um método para obter IPC (comunicação entre processos).
A maneira mais comum de estabelecer uma conexão TCP é usando um handshake de 3 vias que consiste em:
Mas essa não é a única maneira de estabelecer uma conexão TCP. Para estabelecer uma conexão TCP cada lado tem que enviar um SYN que o outro lado tem que ACK, mas não é necessário que uma parte combine SYN e ACK em um único pacote. Um handshake de 4 vias é igualmente possível no qual cada terminal envia um SYN e, em seguida, cada terminal envia um ACK.
Um caso de uso para este handshake de 4 vias é estabelecer uma conexão entre um par de hosts que estão ambos atrás de um firewall. Isso pode ser útil se você estiver executando aplicativos ponto a ponto em uma rede protegida por um firewall. Cada terminal enviará um SYN e o retransmitirá até que uma resposta seja recebida. Isso significa que o firewall em cada extremidade da conexão verá o ponto de extremidade local enviando pacotes SYN e, uma vez que tenha visto esse pacote de saída, permitirá que os pacotes SYN e ACK da outra extremidade passem. (Embora este método funcione com TCP e UDP na prática, raramente é usado com TCP.)
O que tudo isso significa para o seu cenário é que, se um aplicativo criar um soquete TCP e vinculá-lo a um endereço IP local e número de porta e, em seguida, tentar se conectar ao mesmo endereço IP e número de porta, a camada TCP primeiro gerará um SYN pacote que é entregue a si mesmo e, em seguida, responde a ele com um ACK que também é entregue a si mesmo.
O resultado é que é possível que um soquete TCP seja conectado a si mesmo e à camada TCP, isso parece um handshake de 4 vias.
Não sei se existe algum propósito útil para esse soquete TCP conectado a si mesmo, mas é isso que produziria uma conexão como a do seu caso.