Patrząc w Wireshark, często widzę, że strumienie TCP kończą się pakietem RST, ACK zamiast pakietu RST. Czy ktoś wie, dlaczego tak jest?
Przykład tego, co widzę:
SYN SYN, ACK ... dane ... RST, ACK
Wireshark nie odbiera pakietu RST przed pakietem RST, ACK.
Odpowiedzi:
RST / ACK nie jest potwierdzeniem RST, tak samo jak SYN / ACK nie jest dokładnie potwierdzeniem SYN. Ustanowienie protokołu TCP jest w rzeczywistości procesem czterokierunkowym: host inicjujący wysyła SYN do hosta odbierającego, który wysyła ACK dla tego SYN. Host odbierający wysyła SYN do hosta inicjującego, który odsyła ACK z powrotem. Ustanawia to komunikację stanową.
Aby uczynić to bardziej wydajnym, host odbierający może potwierdzić SYN i wysłać własny SYN w tym samym pakiecie, tworząc trójstronny proces, do którego jesteśmy przyzwyczajeni.
W przypadku RST / ACK, urządzenie potwierdza potwierdzenie wszelkich danych wysłanych w poprzednich pakietach w sekwencji za pomocą ACK, a następnie powiadamia nadawcę, że połączenie zostało zamknięte za pomocą RST. Urządzenie po prostu łączy dwa pakiety w jeden, podobnie jak SYN / ACK. Polecenie RST / ACK zwykle nie jest normalną odpowiedzią na zamknięcie sesji TCP, ale niekoniecznie wskazuje na problem.
źródło
RST ACK
odpowiedzi na fałszywy adres źródłowy.Po ustanowieniu połączenia wszystkie pakiety muszą mieć ustawione ACK i pasować do numeru sekwencyjnego odebranych pakietów, aby zapewnić niezawodny transport / bezpieczeństwo. RST bez ACK nie będą akceptowane. Gdy jedna strona wysyła RST, gniazdo jest natychmiast zamykane, a strona odbierająca również zamyka gniazdo natychmiast po otrzymaniu prawidłowego RST. Nie musi być i nie można tego potwierdzić.
po uzgadnianiu protokołu TCP
A ---> B Syn = x, Ack = y, len = z, Flaga ACK
B ---> A Syn = y, Ack = x + z, len = o, Flaga ACK
A ---> B Syn = x + z, Ack = y + o, len = p, flaga ACK
B ---> A Syn = y + o, ACK = x + z + p, len = q, RST, ACK Flag
B zamyka gniazdo po wysłaniu ostatniego pakietu, a A zamyka gniazdo po otrzymaniu.
(nie biorąc pod uwagę okna TCP tutaj, lub może być więcej pakietów z jednego końca przed potwierdzeniem)
Flaga ACK, numer potwierdzenia i procedura potwierdzenia są powiązane, ale nie to samo.
Zgodnie z RFC793
Numer potwierdzenia: 32 bity
Zresetuj przetwarzanie
We wszystkich stanach oprócz SYN-SENT wszystkie segmenty resetujące (RST) są sprawdzane przez sprawdzenie ich pól SEQ. Reset jest ważny, jeśli jego kolejny numer znajduje się w oknie. W stanie SYN-SENT (RST odebrany w odpowiedzi na początkową SYN), RST jest akceptowalny, jeśli pole ACK potwierdza SYN.
Odbiornik RST najpierw go sprawdza, a następnie zmienia stan. Jeśli odbiornik był w stanie LISTEN, ignoruje go. Jeśli odbiornik był w stanie SYN-RECEIVED i wcześniej był w stanie LISTEN, wówczas odbiornik powraca do stanu LISTEN, w przeciwnym razie odbiornik przerywa połączenie i przechodzi w stan ZAMKNIĘTY. Jeśli odbiornik był w jakimkolwiek innym stanie, przerywa połączenie i doradza użytkownikowi i przechodzi w stan ZAMKNIĘTY.
źródło