как стек 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 его поведение отличается.

так почему поведение отличается?

Ответы на вопрос(1)

Ваш ответ на вопрос