как стек tcp различает закрытие и выключение?
Как мы знаем, что:
////////////////////////////////////////////////// ///////
close () завершит оба направления на TCP-соединении
shutdown () может заблокировать связь в одном или обоих направлениях
////////////////////////////////////////////////// ///////
что меня озадачило то, как стек tcp может отличить их друг от друга?
Я написал пример программы:
во-первых, я использую:
....
connect(192.168.1.100) //there is a server process running in 192.168.1.100
....
close(socketfd);
sleep(1000);
Затем я использую Wireshark для дампа пакетов:
01 -->syn
02 <--syn,ack
03 -->ack
04 -->fin,ack
05 <--ack
netstat -an | grep 192.168.1.100
Я запустил его около 5 минут, он печатает:
Сначала "tcp 0 0 ... FIN_WAIT2", затем примерно через 2 минуты не выводится сообщение, кажется, что соединение было разорвано.
затем я использую:
....
connect(192.168.1.100)
....
shutdown(socketfd,SHUT_WR);
sleep(1000);
используйте wireshark для вывода пакетов:
01 -> син
02 <- син, акк
03 -> подтверждение
04 -> плавник
05 <- ack
...
netstat -an | grep 192.168.1.100
запустить его в течение 10 минут, он всегда выдает: "tcp 0 0 ... FIN_WAIT2"
из вывода wireshark, кажется, нет никаких различий для закрытия и выключения,
но из вывода netstat его поведение отличается.
так почему поведение отличается?