Puncte:11

Ce se întâmplă dacă două sisteme locale descarcă aceeași resursă pe același port?

drapel cn
S.B

Sunt la curent cu tabelul NAT. Vreau doar să știu ce se întâmplă dacă doi clienți dintr-o rețea locală privată doresc să descarce exact aceeași resursă pe același port? Cu alte cuvinte, când un pachet vine de la server, cum poate routerul să decidă ce client ar trebui să primească acest pachet?

Dacă nu greșesc, pachetul primit de la server are adresa IP de destinație a routerului, care este publică și este aceeași pentru ambele, precum și numărul portului de destinație care se întâmplă să fie același și în acest caz.

Există vreun mecanism în router sau server pentru a detecta acest lucru? sau acest comportament este chiar posibil în primul rând?

Am căutat întrebări de genul acest, ceea ce are sens ca eroarea să apară deoarece portul este ocupat, dar întreb despre două sisteme separate.


Actualizați : Din comentarii mi-am dat seama că nu am fost suficient de clar așa că permiteți-mi să o spun din nou cu un exemplu:

Îmi pasă doar de portul „sursă” al dispozitivelor. Să presupunem că am două laptopuri (192.168.2.10 și 192.168.2.11), ambii descarcă același fișier de pe același server undeva pe internet. Fiecare dintre ele are un sistem de operare care generează un port aleator, astfel încât IP-ul sursă și portul sursă ar fi ceva de genul: 192.168.2.10:6321 și 192.168.2.11:7132. M-am gândit că în NAT, routerul își va seta adresa IP (publică) împreună cu porturile de pe laptopuri, așa că dacă adresa IP publică a routerului de acasă este 65.82.23.32, aceste două pachete vor primi aceste IP sursă și respectiv portul sursă: 65.82.23.32:6321 și 65.82.23.32:7132.

Acum, când răspunsul revine, routerul își poate da seama ce pachet este pentru ce laptop din numerele de porturi, nu? Până acum, bine. Dar ce se întâmplă dacă accidental sau intenționat două laptopuri generează exact același port sursă? de exemplu : 192.168.2.10:6000 și 192.168.2.11:6000. Acum routerul își va seta adresa IP publică ca adresă IP sursă la fel ca înainte, dar acum, dacă încearcă să folosească acele numere de port, acele pachete vor avea exact același IP sursă și număr de port sursă, cum ar fi: 65.82.23.32:6000 și 65.82.23.32:6000.

Aici am fost confuz că, atunci când răspunsul revine, cum poate decide routerul ce pachet este pentru ce laptop?

După răspunsul lui @mfinni, am observat că nu așa funcționează PAT! Dispozitivul NAT (aici routerul) va atribui porturi unice fiecărui laptop individual (adresă IP privată), apoi pachetele trimise cu aceste porturi unice (de exemplu 7777 și 7778). Deci, când răspunsul revine, este clar că pachetul este pentru ce laptop din porturi, apoi routerul le va converti 65.82.23.32:7777, 65.82.23.32:7778 la --> 192.168.2.10:6000, 192.168.2.11:6000 respectiv.

drapel se
Routerul va recunoaște că adresa IP este diferită. Tine minte.Un pachet IP este identificat prin 4 bucăți de date, nu 3, nu 2 și nu 1: IP sursă, port sursă, IP destinație, port destinație
S.B avatar
drapel cn
S.B
@slebetman Știu, dar atunci când același fișier este descărcat de la aceeași adresă URL (dacă ne conectăm la același server web), IP destinație și portul de destinație sunt aceleași pentru ambele pachete. IP sursă este, de asemenea, aceeași, deoarece este adresa IP a routerului. Deci ultima bucată din acele 4 date este „portul” sursă. Am dreptate ?
drapel se
Ele nu pot fi la fel. Serviciul NAT din router trebuie să se asigure că nu sunt la fel. Portul sursă care iese din NAT este oricum aleatoriu, așa că NAT-ul trebuie doar să se asigure că mapează în interior pachetul cu portul sursă de intrare la computerul corect
drapel se
Cu excepția cazului în care vă scrieți propriul NAT, dar asta ar fi considerat o eroare în implementarea dvs. NAT
RonJohn avatar
drapel id
„Există vreun mecanism în router sau server pentru a detecta acest lucru?” **TREBUIE** să știi că altcineva s-a gândit la asta **de ceva vreme** în ultimii 22 de ani.
Puncte:44
drapel co

O conexiune TCP (care stă la baza HTTP și a multor alte protocoale) este definită în mod unic (la un moment dat) de 4 parametri:

  • IP-ul local
  • Portul local
  • IP-ul de la distanță
  • Portul de la distanță

Chiar dacă faceți aceeași cerere de două ori simultan de pe același computer, chiar și cu cele două adrese IP identice și portul de destinație identic, portul sursă va fi diferit.

De asemenea, dacă aveți două solicitări venite de la două dispozitive care trec prin același dispozitiv NAT, dispozitivul NAT va folosi porturi sursă diferite.În funcție de dispozitiv, poate fie să păstreze porturile sursă inițiale (și să schimbe unul numai dacă există un conflict), fie să atribuie întotdeauna un nou port sursă independent de portul sursă original.

Dispozitivul NAT va păstra apoi pentru fiecare conexiune o mapare în tabelul său de traducere care afirmă că conexiunea externă (IP extern, port sursă extern, IP destinație, port destinație) este mapată la conexiunea internă (IP intern gazdă, port sursă gazdă intern, destinație). IP, port de destinație).

S.B avatar
drapel cn
S.B
Bine explicat. Voi accepta asta ca răspuns. Este cuprinzător și ușor de înțeles.
drapel cn
Pe cât de simplu și de bază este - faptul că există un port SOURCE pentru fiecare conexiune client este trecut în mod regulat cu vederea de începători (și de programatori experimentați). De fapt, am avut oameni care presupun că portul sursă ar fi identic cu portul țintă, ceea ce, evident, nu funcționează deloc (adică un server web care face un apel http către un alt server web). Faptul de bază al TCP, bine explicat.
drapel cn
@TomTom Există de fapt câteva protocoale de nișă care folosesc același port pentru sursă și destinație. Sunt o raritate și, de obicei, proiectate de programatori care nu au înțeles cu adevărat punctele fine ale rețelei.
drapel cn
@Tonny De asemenea, nu pot fi mainstream, deoarece altfel ar avea un port alocat - care se încadrează în spațiul controlat al porturilor joase ;) Îmi puteți numi câțiva dintre acești infractori? Nu am auzit niciodată de ei, de fapt - pare că programatorii ar fi proști.
drapel cn
@TomTom Sunt cu adevărat de nișă. Am întâlnit câteva în aplicații de control pentru echipamente industriale. Nimic recent totuși (ca în „acest mileniu”). Chiar nu-mi amintesc niciun nume. A fost acum 2 decenii. Și prostia este un termen prea blând pentru acea nebunie...
jcaron avatar
drapel co
@HagenvonEitzen care ar fi contrar întregii paradigme TCP. O conexiune TCP este definită de 4-tuplu, nu de orice 3. De asemenea, nu sunt sigur că am înțeles care este cazul la care vă referiți. Dacă vă aflați într-o situație de failover (fără sincronizarea tabelelor NAT), atunci mecanismul standard pentru un pachet TCP care nu poate fi egalat este RST, nu un ICMP inaccesibil.
Hagen von Eitzen avatar
drapel cn
@jcaron Îmi pare rău, rău.Se pare că am fost confuz, deoarece afișajele de nivel înalt ale ICMP inaccesibile tind să menționeze doar adresa de destinație și portul - atunci când de fapt *nu* conțin antetul complet de internet, inclusiv trimiterea ip plus 64 de biți ai datagramei (și, prin urmare, porturile TCP implicate ) din pachetul ofensator *tocmai* pentru a permite aflarea ce încercare a eșuat cu adevărat.
Puncte:11
drapel cn

Tabelul NAT știe că portul sursă de pe fiecare client este diferit, așa că nu va trimite accidental pachetul greșit către clientul intern greșit. Dispozitivul NAT atribuie, de asemenea, diferite porturi de ieșire, iar acestea NU sunt aceleași între diferiți clienți interni.

S.B avatar
drapel cn
S.B
Oh, mulțumesc, mă tem că ai vrut să spui `ip` în loc de `port` în prima ta propoziție? deoarece se presupune că porturile sunt aceleași.
mfinni avatar
drapel cn
Nu. Portul sursă de la un client nu se presupune a fi același. Când un client face o solicitare, portul sursă pentru majoritatea protocoalelor va fi un port liber aleatoriu în intervalul de porturi efemere.
S.B avatar
drapel cn
S.B
Da, este adevărat, dar întreb exact despre situația aceea în care porturile sursă sunt aceleași, de exemplu, deschid în mod intenționat același port cu socket python.
mfinni avatar
drapel cn
Ei bine, ești prost făcând asta, dar tabelul NAT știe că IP-urile sursei sunt diferite, așa că se aplică același lucru. Porturile NAT de ieșire vor fi cu siguranță diferite, acestea vor veni din gama de porturi efemere de pe dispozitivul NAT.
S.B avatar
drapel cn
S.B
Lol, a fost din cauza curiozității. Vă mulțumim pentru informațiile dumneavoastră
drapel se
@SorousHBakhtiary Sistemul de operare vă va împiedica să deschideți același port de două ori cu o eroare „port în uz” (de obicei EADDRINUSE în implementările normale ale IP). Ceea ce puteți face este să aveți un proces să deschidă UN port sursă și să comunice cu alte două procese prin conducte sau memorie partajată etc., iar cele două procese își transmit cererea prin intermediul primului proces. Dar în acest caz, rutarea va depinde 100% de dvs., deoarece aceasta este acum în afara protocolului IP.
drapel se
@SorousHBakhtiary Se pare că python nu are nici măcar un API unde puteți seta portul pentru client. Puteți specifica portul serverului doar în metoda `.connect()`. Portul client este alocat aleatoriu socket-ului dumneavoastră. Deci nu puteți face ceea ce plănuiți să faceți în python. Este posibil să o faceți în C editând manual structura socketului (spoofing), dar nu este standard
S.B avatar
drapel cn
S.B
@slebetman Ai dreptate, e vina mea că nu am fost suficient de clar. Am actualizat întrebarea cu un exemplu. Vă rugăm să consultați secțiunea „actualizare”.
user49822 avatar
drapel pl
@slebetman Cel puțin pe Linux puteți seta portul sursă atunci când vă conectați apelând metoda `.bind()` înainte de `.connect()`
Puncte:6
drapel in

Când te referi la NAT probabil la care te referi de fapt NAPT. Care schimbă portul sursă (cel puțin dacă este necesar) în dispozitivul NAT. Ca atare, portul sursă se va schimba.

De exemplu iptables MASCARADĂ

Atunci când faceți NAT în acest caz, este de asemenea nevoie de „urmărirea conexiunii” care pur și simplu ține evidența „portului extern” se referă la ce „client intern și port”. În iptables veți vedea adesea regula LEGATE, STABILIT care foloseste. Veți descoperi, de asemenea, că dacă un router care face NAPT este repornit, va renunța la toate conexiunile. În timp ce un router fără NAT va relua de obicei orice conexiune. (presupunând că finalizează repornirile înainte ca clientul să expire)

S.B avatar
drapel cn
S.B
Da, problema mea a fost: de exemplu, când folosim portul 6000 în aplicația noastră, am crezut că acel port va fi plasat în pachet împreună cu IP-ul (public) al routerului... dar povestea adevărată este din cauza PAT, un alt port care este generat de dispozitivul NAT (aici routerul) este atribuit adresei noastre IP private. Acesta este modul în care routerul poate distinge cu ușurință ce pachet este pentru care adresă IP, chiar dacă a folosit inițial aceleași porturi. Am dreptate ?
drapel se
@SorousHBakhtiary Când spui portul 6000 te referi la server sau client? Vă dați seama că fiecare pachet din protocolul IP este identificat de 4 biți de informații, nu? Nu doar 2. client(sursă) port, client(sursă) IP, destinație(server - cred că asta este ceea ce vrei să spui prin 6000) port, destinație IP. Deci, chiar dacă doi clienți de pe același computer se conectează la portul (destinație) 6000, li se va atribui aleatoriu diferite porturi sursă de către sistemul de operare. Acesta este ceea ce routerele (și NAT) folosesc pentru a determina rutarea - portul sursă, IP sursă, portul de destinație, IP de destinație
Puncte:5
drapel ru

Routerul nu folosește același număr de port sursă pe care îl generează laptopurile în solicitările sale către WAN, el generează propriile sale porturi sursă unice. Tabelul NAT din router convertește laptop1:6000 în publicip:N și laptop2:6000 în publicip:M. Apoi știe unde să direcționeze pachetele primite prin care port ajunge traficul de pe Internet.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.