Ce înseamnă LAST_ACK, ca valoare de stat în netstat? (Administrarea sistemului, Tcp)

Nick Bolton a intrebat.

În cazul în care un server Windows are câteva mii de porturi deschise în LAST_ACK stat (așa cum arată netstat), ce ar putea însemna acest lucru? Se datorează faptului că un punct final așteaptă ca celălalt să răspundă?

4 răspunsuri
pehrs

Starea last_ack (dacă îmi amintesc corect stiva TCP) este starea în care ai primit mesajul FIN pentru a închide conexiunea de la vecinul tău, dar mai trebuie să dai flush și să închizi conexiunea. Trimiți tu însuți ultimul FIN și aștepți un ACK.

În mod obișnuit, suspendarea în last_ack înseamnă că aplicația dvs. păstrează un socket deschis chiar și atunci când celălalt capăt a terminat de trimis date. Acest lucru se poate întâmpla din mai multe motive. Ar putea exista un firewall sau un alt dispozitiv de echilibrare a încărcăturii care pierde ultimul ACK de la client și vă lasă blocat în starea last_ack. Dacă conexiunile nu se termină după câteva minute (10 sau cam așa ceva), probabil că aveți o eroare.

Aruncați o privire la diagrama de stare la http://tangentsoft.net/wskfaq/articles/debugging-tcp.html

Comentarii

  • Nu este corectă. Descrieți CLOSE_WAIT. –  > Por user207421.
user207421

LAST_ACK înseamnă că terminalul dvs. a primit un FIN de la omolog, a trimis un ACK, a trimis un FIN și așteaptă ACK-ul final de la omolog. În acest moment, aplicația nu mai poate face nimic: socket-ul este închis. Este posibil ca aplicația chiar să fi ieșit. Din acest moment, depinde de TCP să retrimită FIN-ul până când primește ACK-ul final sau până când se termină în acest mod. Nu puteți face prea multe ca administrator, cu excepția investigării rețelei.

Imo

LAST_ACK este ultima stare chiar înainte de închiderea conexiunii TCP.

Comentarii

  • Mulțumesc, ce poate cauza ca un port să se blocheze în această stare? –  > Por Nick Bolton.
  • Este un server web IIS (sau un alt serviciu) pe care observați acest lucru sau, propria aplicație? –  > Por Imo.
  • Aplicația implementează clientul XML-RPC „Cook Computing” (din Asp.Net, rulat prin IIS) și vorbește cu un server Java XML-RPC. –  > Por Nick Bolton.
  • Este vorba de etapele finale ale conversației TCP cu clientul. Software-ul dumneavoastră caută să închidă() sesiunea TCP și trimite un LAST_ACK către client. Clientul ar trebui apoi să trimită înapoi o confirmare că LAST_ACK a fost primit. Sunt de acord cu pehrs în ceea ce privește faptul că este posibil ca clientul (poate firewall-ul) să nu fi confirmat sau pachetul să se fi pierdut… acestea sunt cele mai probabile două cazuri. –  > Por Imo.
  • Nu „trimite un LAST_ACK către client”. Trimite un FIN și așteaptă în prezent un ACK, după ce a primit deja un FIN și a trimis un ACK. Aceasta este ultima stare după închiderea conexiunii. –  > Por user207421.
John Clements

Cred că @lmo are dreptate când spune că este „ultima stare chiar înainte de închiderea conexiunii TCP”, dar, în plus, pe baza lecturii mele din pagina wikipedia, merită menționat faptul că aceasta nu face parte din mecanismul de „închidere activă”, care (după părerea mea) reprezintă sfârșitul celor mai bine comportate conexiuni, ci mai degrabă din secvența „închidere pasivă”, care este probabil asociată cu Bad Stuff Happening.

(FWIW, eu sunt limbi, nu rețele. M-aș bucura să primesc clarificări de la o persoană specializată în rețele).

Comentarii

  • Nu are dreptate când spune acest lucru și nu există nimic rău în legătură cu o închidere pasivă. Înseamnă doar că omologul s-a închis înaintea dumneavoastră. –  > Por user207421.

Tags: