Ce înseamnă „resetarea conexiunii de către omolog”? (Programare, Prize, Tcp)

Franck Freiburger a intrebat.

Care este semnificația erorii „connection reset by peer” pe o conexiune TCP? Este o eroare fatală sau doar o notificare sau este legată de o defecțiune a rețelei?

2 răspunsuri
ire_and_curses

Este fatală. Serverul de la distanță v-a trimis un pachet RST, care indică o întrerupere imediată a conexiunii, în loc de handshake-ul obișnuit. Acest lucru ocolește tranziția normală a stării de semiînchidere. Îmi place această descriere:

„Resetarea conexiunii de către omolog” este echivalentul TCP/IP al trântirii telefonului înapoi în cârlig. Este mai politicos decât să nu răspunzi, lăsându-l pe unul suspendat. Dar nu este FIN-ACK, așa cum se așteaptă de la un interlocutor TCP/IP cu adevărat politicos.

Comentarii

    57

  • De ce este etichetat „resetarea conexiunii prin peer„? Sună ca și cum ar trebui să fie „resetarea conexiunii de către gazdă”, sau „resetarea conexiunii de către server” –  > Por Robert.
  • 31

  • @Robert Pentru că de acolo a venit resetarea. Colegul a trimis un pachet RST. –  > Por user207421.
  • 128

  • … Robert, îngrijorarea ta nu are niciun sens pentru mine. Peer este doar strict mai general decât atât. Într-un model tipic de client-server, serverul poate la fel de bine să primească această notificare de la „client”. Mașina care solicită inițial conexiunea are la fel de multă putere pentru a trimite această notificare. La nivel TCP, totul arată identic odată ce conexiunea este în curs de desfășurare. Cele două mașini, atunci când comunică, sunt pur și simplu „peer”. –  > Por codetaku.
  • Acest pachet ar fi putut fi trimis de un alt dispozitiv din mijloc, cum ar fi un router? –  > Por Arnold Roa.
  • Nu se poate numi „resetarea conexiunii de către server”, deoarece poate fi trimisă de client sau de server. Nu poate fi ‘ocolit’. Dacă un client primește această eroare înseamnă că conexiunea TCP nu mai este deschisă în server, de exemplu, de când serverul s-a prăbușit și a fost repornit. –  > Por Johannes Overmann.
mark4o

Aceasta înseamnă că a fost primit un RST TCP și conexiunea este acum închisă. Acest lucru se întâmplă atunci când un pachet este trimis de la capătul dumneavoastră al conexiunii, dar celălalt capăt nu recunoaște conexiunea; acesta va trimite înapoi un pachet cu bitul RST setat pentru a închide forțat conexiunea.

Acest lucru se poate întâmpla dacă cealaltă parte se blochează și apoi revine sau dacă apelează close() pe soclu în timp ce există date de la dumneavoastră în tranzit și este o indicație pentru dumneavoastră că este posibil ca unele dintre datele pe care le-ați trimis anterior să nu fi fost primite.

Depinde de dumneavoastră dacă aceasta este o eroare; dacă informațiile pe care le trimiteați erau doar în beneficiul clientului la distanță, atunci s-ar putea să nu conteze faptul că datele finale s-au pierdut. Cu toate acestea, ar trebui să închideți socket-ul și să eliberați orice alte resurse asociate cu conexiunea.

Comentarii

  • Dacă setați opțiunea socket SO_LINGER la zero atunci când deschideți un nou socket, apoi îl închideți în mod normal, bitul RST va fi setat. Astfel, TOATĂ conexiunea se va încheia cu o resetare. Nu încercați acest lucru acasă, este doar enervant. stackoverflow.com/questions/3757289 –  > Por Chris Huang-Leaver.
  • Cum să rezolvăm această problemă atunci, trebuie să repornim atât remote cât și gazda noastră? –  > Por user2225190.
  • @user222525190 Trebuie să reconectați clientul, dar mai întâi trebuie să vă examinați software-ul pentru a vă asigura că nu se datorează unei erori de protocol de aplicație, adică închiderea unei conexiuni pe care celălalt capăt încă scrie. –  > Por user207421.
  • Vă mulțumim pentru comentariul dumneavoastră. A funcționat timp de două luni. De asemenea, încerc și dintr-o linie de comandă, dar tot primesc această eroare. Încerc „sftp [email protected]șină”. Eroarea este inconsecventă. –  > Por user2225190.

Tags:,