Stabilirea unei conexiuni
"Confirmarea celor trei căi" este procedura utilizată pentru stabilirea conexiunii. Această procedură este de obicei inițiată de programul de protocol TCP ca răspuns la o solicitare din partea altui program TCP. Această procedură funcționează, de asemenea, dacă două programe TCP o inițiază simultan. Când se efectuează o încercare de inițializare de la ambele capete în același timp, fiecare program TCP primește un segment "SYN" care nu conține o confirmare pentru "SYN" pe care la trimis deja. Desigur, sosirea vechilor duplicate ale segmentului "SYN" poate impresiona destinatarul, ca și cum ar fi făcută o deschidere simultană a conexiunii. Aplicarea corectă a segmentelor "reset" poate împiedica ambiguitatea unor astfel de situații.
Mai jos sunt câteva exemple de inițializare a conexiunilor. Cu toate că aceste exemple nu arată conexiunea de sincronizare, utilizând segmente care transportă date, este perfect legitim, deoarece programul TCP primit segmente nu livreze datele clientului până când este clar datele sunt valabile (adică, datele de utilizator trebuie să fie „depozitate“ până până când conexiunea intră în starea ESTABLISHED). Confirmarea celor trei căi reduce probabilitatea conexiunilor false. Primirea informațiilor pentru o astfel de verificare se realizează prin implementarea unui schimb între memoria calculatorului și mesajele care circulă în rețea.
Aici, "stările" protocolului TCP corespund momentului imediat după expedierea sau primirea unui segment (conținutul acestui segment este afișat în coloana de mijloc a fiecărui rând). Conținutul segmentului B este dat în formă prescurtată și reprezintă numărul de coadă, stegulețele de control și câmpul ACK. Restul câmpurilor din segment, cum ar fi fereastra, lungimea și câmpul de date, sunt dincolo de interesul nostru.
Obținerea duplicatului vechi al semnalului SYN
Figura 9
Ca un exemplu simplu, ia în considerare situația de a obține două exemplare vechi în Figura 9. Pe linia 3 de semnal vechi SYN ajunge la un TCP B. duplicat din urmă Programul nu se poate stabili că este o copie veche, și, prin urmare, îndeplinește modul obișnuit (linia 4).
Programul TCP A detectează o valoare incorectă în câmpul ACK și, prin urmare, returnează semnalul RST (reboot). În acest caz, valoarea câmpului SEQ este selectată astfel încât să facă acest segment credibil. Programul TCP B primește semnalul RST și merge la starea LISTEN. Când pe linia 6 semnalul SYN, valabil, nu depășește, ajunge la programul TCP B, procesul de sincronizare are loc în mod normal. Dacă semnalul SYN de pe linia 6 ajunge la programul TCP B înainte de semnalul RST, poate apărea o combinație mai complexă a schimbului cu expedierea RST în ambele direcții.
Jumătate conexiuni deschise și alte anomalii
O conexiune deja stabilită se numește "jumătate deschisă" dacă unul dintre programele TCP a închis conexiunea sau a refuzat conexiunea. Și am făcut-o la capătul meu, fără a-mi avertiza partenerul. Această situație poate apărea și în cazul în care sincronizarea la capetele liniei este încălcată din cauza unei defecțiuni care duce la pierderea informațiilor din memorie. Dacă astfel de conexiuni încearcă să trimită date în orice direcție, conexiunea se repornește automat. Cu toate acestea, se presupune că conexiunile pe jumătate deschise sunt rare, iar procedura de recuperare se aplică în rețea foarte moderat.
Dacă la sfârșitul compusului A este considerat a fi inexistentă, iar clientul la sfârșitul B încearcă să trimită date, aceasta va duce la faptul că, la sfârșitul TCP B va primi mesajul de control la repornire. Un astfel de mesaj arată programul TCP la sfârșitul lui B că ceva nu este în regulă și i se cere să elimine această conexiune.
Să presupunem că doi clienți de la punctele A și B să comunice unul cu celălalt, iar în acest moment există colaps, ceea ce duce la pierderea de informații în memoria programului la sfârșitul TCP A. În funcție de sistemul de operare, programul de serviciu TCP A, este probabil să fie implicat un mecanism de corectare a erorii. Când programul TCP A este repornit, va începe probabil din nou de la bun început sau cu instrucțiuni pentru depășirea eșecului. Ca urmare, programul A, probabil va încerca să deschidă compusul (OPEN) sau trimite informații (TRIMITERE) prin intermediul unui compus care crede că este deschis. În acest din urmă caz, se va primi mesajul "conexiunea nu a fost deschisă" din programul local TCP (la sfârșitul lui A). Când încercați să stabiliți o conexiune, programul TCP A va trimite un segment care conține semnalul SYN. Acest scenariu rezultat în situația prezentată în Figura 10. După TCP A se blochează, utilizatorul încearcă să deschidă conexiunea. În același timp, programul TCP B continuă să creadă că conexiunea rămâne deschisă.
Detectarea conexiunii semi-deschise
Figura 10
Atunci când pe linia 3 SYN semnal ajunge la programul B TCP, care este sincronizat, iar segmentul de intrare este în afara ferestrei, programul TCP B răspunde la această confirmare, arată numărul liniei pe care dorește să le primească (ACK = 100). TCP Un program, văzând că pe segmentul linia 4 nu este confirmat trimis, acesta fixează absența sincronizării și trimite o resetare (RST), așa cum a descoperit că compusul este întredeschisă. Pe linia 5, TCP B șterge conexiunea. TCP A va continua să încerce să stabilească o conexiune.
Problema este rezolvată prin simpla confirmare a celor trei căi (Figura 7).
O altă poveste interesantă are loc dacă programul TCP A se blochează și programul TCP B, presupunând că este într-o stare de sincronizare, încearcă să trimită date. Această situație este prezentată în Figura 11.
În acest caz, datele trimise de programul TCP B, și a venit la programul TCP A (linia 2). vor fi respinse, deoarece conexiunea pe care o folosesc nu există. Pe această bază, TCP A trimite un semnal RST. Odată ce semnalul RST este recepționat de programul TCP B, acesta va fi luat în considerare și conexiunea utilizată anterior va fi eliminată.
(numărul parcelei 300, chitanța - 100)
Partea activă duce la detectare
conexiune pe jumătate deschisă
Figura 11
Figura 12 arată că două programe TCP-A și B, cu o stare pasivă, așteaptă semnalul SYN. Duplicatul vechi al semnalului, ajunge la programul TCP B (linia 2), îl pornește. Semnalul SYN-ACK (linia 3) este returnat și determină ca programul TCP A să genereze un semnal RST (pe linia 3, semnalul ACK este inacceptabil). Programul TCP B acceptă comanda de repornire și revine la starea pasivă LISTEN.
reveniți la LISTEN
Duplicatul vechi al semnalului SYN inițiază o repornire
pe două prize pasive
Figura 12
Pot exista multe alte variante care pot fi explicate prin regulile de mai jos pentru crearea și procesarea semnalelor RST.
Creați un semnal de repornire
Conform regulii principale, semnalul de resetare (RST) trebuie trimis ori de câte ori vine un segment care nu este destinat în mod evident pentru această conexiune. Dacă nu este clar dacă sa produs acest caz, trebuie să vă abțineți de la repornire.
Există trei grupuri de state pentru o conexiune:
Dacă segmentul de intrare are un steag în câmpul ACK, segmentul cu semnalul de resetare primește numărul pentru coadă din câmpul ACK al primului segment. În caz contrar, segmentul cu semnalul de resetare are un număr de coadă zero și o valoare în câmpul ACK egală cu suma numărului de coadă de așteptare a segmentului de intrare și a lungimii acestuia. Conexiunea rămâne în starea ÎNCHIS.
În cazul în care SYN nostru nu a fost confirmată, iar nivelul de prioritate al segmentului de intrare este mai mare decât nivelul cerut, sau va crește nivelul de prioritate locală (dacă este acceptabil pentru utilizator și sistemul) sau va trimite o resetare. Sau, dacă nivelul de prioritate al segmentului de intrare este mai mică decât a solicitat, prelucrarea va fi continuată în continuare, ca și în cazul în care nivelul a fost același (în cazul în care TCP-ul de la distanță nu se poate ridica nivelul de prioritate a noastră potrivi acest lucru va fi notat în segmentul următor îl trimite, iar apoi va fi închis compus). În cazul în care SYN nostru a primit confirmare (probabil în acest segment de intrare) nivelul de prioritate a segmentului de intrare trebuie să se potrivească exact locațiile Nome nivel. Dacă ultima condiție nu este îndeplinită, este trimis un semnal de resetare.
Dacă segmentul de intrare poartă un semnal ACK, semnalul de resetare va avea un număr în coada de așteptare corespunzătoare numărului de semnal ACK din segmentul de intrare. În caz contrar, semnalul de resetare va avea un număr de coadă zero, iar semnalul ACK este numărul egal cu suma numărului segmentului de intrare și a lungimii acestuia. Conexiunea nu își schimbă starea.
Dacă segmentul de intrare are un nivel de protecție, izolare sau prioritate care nu corespunde nivelului de conectare local, se trimite un semnal de resetare și conexiunea merge în starea ÎNCHIS. Semnalul de resetare are un număr de coadă corespunzător numărului de semnal ACK din segmentul de intrare.
Procesarea semnalelor pentru resetare
Pentru toate stările, cu excepția SYN-SENT, toate segmentele cu semnal de resetare (RST) transmit verificarea câmpului SEQ. Un semnal de resetare este recunoscut dacă numărul de coadă se află în fereastră. În starea SYN SENT (semnalul RST este recepționat ca răspuns la trimiterea semnalului SYN de inițiere), semnalul RST este recunoscut dacă câmpul ACK recunoaște semnalul SYN trimis anterior.
Receptorul semnalului RST îl verifică mai întâi și numai atunci își schimbă starea. Dacă receptorul era în starea LISTEN, acesta ignoră semnalul. Dacă destinatarul se afla în starea SYN-RECEIVED, se întoarce din nou la starea LISTEN. În alte cazuri, destinatarul lichidează conexiunea și merge în starea ÎNCHIS. Dacă destinatarul se află într-o altă stare, atunci lichidează conexiunea și înainte de a anunța CLOSED, notifică clientul despre acest lucru.