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?

questionAnswers(2)

yourAnswerToTheQuestion