como a pilha tcp distingue fechar e desliga
Como sabíamos que:
/////////////////////////////////////////////////// ////////
close () terminará ambas as direções em uma conexão tcp
shutdown () pode bloquear a comunicação em uma ou ambas as direções
/////////////////////////////////////////////////// ////////
aqui, o que me intrigou é como o tcp stack pode diferenciá-lo
Eu escrevi um programa de exemplo:
primeiro uso:
....
connect(192.168.1.100) //there is a server process running in 192.168.1.100
....
close(socketfd);
sleep(1000);
então eu uso o wireshark para despejar os pacotes:
01 -->syn
02 <--syn,ack
03 -->ack
04 -->fin,ack
05 <--ack
netstat -an | grep 192.168.1.100
Eu corro por cerca de 5 minutos, ele imprime:
"tcp 0 0 ... FIN_WAIT2" primeiro, depois de cerca de 2 minutos não há saída, parece que a conexão foi destruída.
, então eu uso:
....
connect(192.168.1.100)
....
shutdown(socketfd,SHUT_WR);
sleep(1000);
use o wireshark para despejar os pacotes:
01 -> syn
02 <- syn, ack
03 -> ack
04 -> fin, ack
05 <- ack
...
netstat -an | grep 192.168.1.100
execute por cerca de 10 minutos, sempre imprime: "tcp 0 0 ... FIN_WAIT2"
de saída do wireshark, parece que não há diferenças para fechamento e desligamento,
mas da saída do netstat, seu comportamento é diferent
Então, por que o comportamento é diferente?