Koks skirtumas tarp uosto ir lizdo?

Tai buvo vienas iš mano organizacijos programinės įrangos inžinierių iškeltų klausimų. Mane domina plačiausia apibrėžtis.

780
30 сент. nustatė Richard Dorman 30 rugsėjis 2008-09-30 13:04 '08, 13:04 val. 2008-09-30 13:04
@ 35 atsakymai
  • 1
  • 2

Santrauka

TCP lizdas yra galinio taško, apibrėžto IP adresu ir prievadu konkrečios TCP ryšio ar klausymo būsenos kontekste, pavyzdys .

Uostas - tai virtualizacijos identifikatorius, kuris identifikuoja paslaugos galinį tašką (o ne paslaugų egzemplioriaus ar jo sesijos identifikatoriaus).

TCP lizdas nėra ryšys , tai yra konkretaus ryšio galinis taškas.

Gali būti lygiagrečių jungčių su paslaugų galiniu tašku , nes ryšį identifikuoja tiek vietiniai, tiek nuotoliniai galiniai taškai, leidžiantys eismą nukreipti į konkretų paslaugų pavyzdį.

Tam tikram adresų ir prievadų deriniui gali būti tik vienas jungties klausytojas.

Ekspozicija

Tai buvo įdomus klausimas, kuris privertė mane iš naujo apsvarstyti kai kuriuos dalykus, kuriuos maniau, kad žinojau, kad iš vidaus. Jūs manote, kad pavadinimas, kaip antai "lizdas", būtų laikomas savaime suprantamu dalyku: akivaizdu, kad jis buvo pasirinktas atvaizduoti galutinio taško, prie kurio prijungiate tinklo kabelį, vaizdus, ​​yra stiprios funkcinės paralelės. Tačiau tinklo kalba žodis „lizdas“ turi tiek daug bagažo, kad jam reikia kruopščiai peržiūrėti.

Plačiausia prasme uostas yra įėjimo arba išėjimo taškas. Prancūzų kalbos žodis porte, nors ir nenaudojamas tinklo kontekste, tiesiog reiškia duris arba vartai, kuri dar kartą pabrėžia, kad uostai yra transporto galiniai taškai, nesvarbu, ar siunčiate duomenis, ar didelius plieninius konteinerius.

Šioje diskusijoje aš apsiribosiu TCP-IP tinklų kontekstu. OSI modelis yra labai geras, tačiau jis niekada nebuvo visiškai įgyvendintas ir dar plačiau naudojamas didelės įtampos sąlygose su dideliu srautu.

IP adreso ir prievado derinys yra žinomas kaip galutinis taškas ir kartais vadinamas lizdu. Šis naudojimas susijęs su RFC793, originalia TCP specifikacija.

TCP ryšį apibrėžia du galiniai taškai, dar žinomi kaip lizdai.

Galutinį tašką (lizdą) lemia tinklo adreso ir prievado ID derinys. Atkreipkite dėmesį, kad adresas / prievadas visiškai neidentifikuoja lizdo (daugiau apie tai vėliau).

Uosto priskyrimas skirtas atskirti tam tikrus tinklo adresų galinius taškus. Galime pasakyti, kad uostas yra virtualizuotas galinis taškas. Ši virtualizacija leidžia kelis vienalaikius ryšius vienoje tinklo sąsajoje.

Tai lizdų pora (4-ių pakopų rinkinys, sudarytas iš kliento IP adreso, kliento prievado numerio, serverio IP adreso ir serverio prievado numerio), nurodantis du galinius taškus, kurie unikaliai identifikuoja kiekvieną TCP ryšį internete. (TCP-IP iliustruotas 1 tomas, W. Richard Stevens)

Daugumoje „C“ kalbų TCP jungtys sukuriamos ir apdorojamos naudojant metodus Socket klasės egzemplioriuje. Nors yra įprasta dirbti aukštesniame abstrakcijos lygmenyje, paprastai „NetworkStream“ klasės egzemplioriuje, paprastai pateikiama nuoroda į lizdo objektą. Koduotojui atrodo, kad šis lizdo objektas atspindi ryšį, nes ryšys sukuriamas ir valdomas naudojant lizdo objekto metodus.

C #, norėdami sukurti TCP ryšį (esamam klausytojui), pirmiausia sukuriate „TcpClient“. Jei nenurodote TcpClient konstruktoriaus galutinio taško, jis naudoja numatytas reikšmes - vienaip ar kitaip, nustatomas vietinis taškas. Tada paskambinę „Connect“ metodu sukurtoje situacijoje. Šis metodas reikalauja kito parametro aprašymo.

Visa tai yra šiek tiek paini ir leidžia manyti, kad lizdas yra ryšys, kuris yra užraktas. Dirbau pagal šį nesusipratimą, kol Richard Dorman uždavė klausimą.

Padaręs daug skaitymo ir mąstymo, dabar esu įsitikinęs, kad būtų daug protingiau turėti TcpConnection klasę su konstruktoriumi, kuris turi du argumentus: LocalEndpoint ir RemoteEndpoint. Tikriausiai galėtumėte paremti vieną „RemoteEndpoint“ argumentą, kai galiojančios vietinio parametro reikšmės yra tinkamos. Tai yra dviprasmiška daugelio branduolių kompiuteriams, tačiau dviprasmiškumas gali būti išspręstas naudojant maršruto lentelę, pasirenkant trumpiausią maršrutą į nuotolinį galinį tašką.

Aiškumas bus pagerintas kitais būdais. Lizdas nėra identifikuojamas pagal IP adresą ir prievadą:

[...] TCP demultiplex gaunamus segmentus naudodamas visas keturias reikšmes, kuriose yra vietiniai ir užsienio adresai: paskirties IP adresas, paskirties uosto numeris, šaltinio IP adresas ir šaltinio prievado numeris. TCP negali nustatyti, kuris procesas gauna gaunamą segmentą, tik žiūrėdamas į paskirties uostą. Be to, tik vienas iš [skirtingų] galinių taškų [šiame prievado numeryje], kuris priims įeinančius ryšius, yra vienas iš klausymo būsenos. (p255, TCP-IP iliustruotas 1 tomas, W. Richard Stevens)

Kaip matote, tai ne tik įmanoma, bet tikėtina, kad tinklo paslauga turi daug lizdų, turinčių tą patį adresą / prievadą, bet tik vieną lizdų klausytoją konkrečiame adreso / prievado derinyje. Tipiniai bibliotekos diegimai yra lizdo klasė, kurios pavyzdys naudojamas ryšiui sukurti ir valdyti. Tai labai gaila, nes tai sukelia painiavą ir lėmė platų abiejų sąvokų derinį.

Hagraval netiki manimi (žr. Komentarus), todėl čia yra tikras pavyzdys. Prijungiau žiniatinklio naršyklę į http://dilbert.com ir pradėjau netstat -an -p tcp . Paskutinėse šešiose išvesties eilutėse yra du pavyzdžiai, kad adresas ir prievadas nėra pakankami, kad būtų galima vienareikšmiškai identifikuoti lizdą. Yra dvi skirtingos jungtys tarp 192.168.1.3 (mano darbo vieta) ir 54.252.92.236:80

  TCP 192.168.1.3:63240 54.252.94.236:80 SYN_SENT TCP 192.168.1.3:63241 54.252.94.236:80 SYN_SENT TCP 192.168.1.3:63242 207.38.110.62:80 SYN_SENT TCP 192.168.1.3:63243 207.38.110.62:80 SYN_SENT TCP 192.168.1.3:64161 65.54.225.168:443 ESTABLISHED 

Kadangi lizdas yra ryšio galinis taškas, yra dvi lizdai su adresų / prievadų 207.38.110.62:80 ir dar du su adreso / prievado 54.252.94.236:80 .

Manau, kad „Hagraval“ nesusipratimas kyla iš labai kruopščiai naudojamo žodžio „identifikuoja“. Aš turiu galvoje „visiškai, vienareikšmiškai ir vienareikšmiškai identifikuoti“. Pirmiau pateiktame pavyzdyje yra du galiniai taškai, kurių adresas / prievadas 54.252.94.236:80 . Jei turite adresą ir prievadą, neturite pakankamai informacijos, kad galėtumėte atskirti šias jungtis. Nepakanka informacijos, kad būtų galima identifikuoti lizdą.

Pridėti

RFC793 2.7 skirsnio 2 dalyje nustatyta:

Ryšį visiškai nustato pora lizdų galuose. vietinė parduotuvė gali dalyvauti daugelyje jungčių su įvairiomis užsienio lizdais.

Šis lizdo apibrėžimas nėra naudingas programavimo požiūriu, nes jis neatitinka lizdo objekto, kuris yra konkretaus ryšio galutinis taškas. Dėl programuotojo ir daug šios auditorijos yra programuotojas, tai yra gyvybiškai svarbus funkcinis skirtumas.

Nuorodos

  • TCP-IP iliustruotas 1 tomas Protokolai, W. Richard Stevens, 1994 Addison Wesley

  • RFC793 , Informacinių mokslų institutas, Pietų Kalifornijos universitetas, DARPA

  • RFC147 , apibrėžties lizdas, Joel M. Winett, Linkolno laboratorija

855
30 сент. Atsakymą pateikė Peter Wone . 2008-09-30 15:40 '08 15:40 pm 2008-09-30 15:40

Lizdą sudaro trys dalykai:

  • IP adresas
  • Transporto protokolas
  • Uosto numeris

Portas yra skaičius nuo 1 iki 65535 imtinai, o tai reiškia loginį vartus įrenginyje. Kiekvienam kliento ir serverio ryšiui reikalingas unikalus lizdas.

Pavyzdžiui:

  • 1030 yra uostas.
  • (10.1.1.2, TCP, 1030 prievadas) yra lizdas.
163
02 авг. atsakymas pateikiamas RT_ 02 rug . 2012-08-02 20:10 '12, 8:10 pm 2012-08-02 20:10

Lizdas yra vienas ryšys tarp dviejų tinklo programų. Šios dvi programos veikia iš esmės skirtinguose kompiuteriuose, tačiau lizdai taip pat gali būti naudojami tarpusavio bendravimui tame pačiame kompiuteryje. Programos gali sukurti kelis lizdus, ​​kad galėtų bendrauti tarpusavyje. Kištukiniai lizdai yra dvikrypčiai, o tai reiškia, kad abi ryšio pusės gali siųsti ir priimti duomenis. Todėl teoriškai galima sukurti lizdą bet kuriame OSI modelio lygyje nuo 2 iki aukštyn. Programuotojai dažnai naudoja tinklo programavimo lizdus, ​​nors ir netiesiogiai. Tokių bibliotekų, kaip Winsock, programavimas paslėpia daugelį žemo lygio informacijos apie lizdų programavimą. Parduotuvės yra plačiai naudojamos nuo devintojo dešimtmečio pradžios.

Uostas yra galutinis taškas arba „kanalas“, skirtas tinklo ryšiui. Portų numeriai leidžia skirtingoms to paties kompiuterio programoms naudoti tinklo išteklius, netrukdydami tarpusavyje. Uosto numeriai dažniausiai randami tinklo programavimo, ypač lizdų programavimo. Kartais uosto numeriai tampa matomi atsitiktiniam vartotojui. Pavyzdžiui, kai kurios interneto svetainės, kurias lanko internetas, naudoja šį URL:

http://www.mairie-metz.fr:8080/ Šiame pavyzdyje skaičius 8080 reiškia prievado numerį, kurį naudoja interneto naršyklė, kad prisijungtų prie žiniatinklio serverio. Paprastai svetainė naudoja prievado numerį 80, ir šis numeris neturi būti įtrauktas į URL (nors ir gali būti).

IP tinkluose, teoriškai, prievado numeriai gali skirtis nuo 0 iki 65535. Tačiau populiariausios tinklo programos naudoja prievado numerius diapazono apačioje (pvz., 80) HTTP.

Pastaba Terminas „uostas“ taip pat reiškia keletą kitų tinklo technologijų aspektų. Portas gali būti susijęs su fiziniu periferinių įrenginių, pvz., Serijinių, lygiagrečių ir USB, prijungimo taškų. Terminas „uostas“ taip pat reiškia konkrečius Ethernet ryšio taškus, pvz., Šakotuvą, jungiklį arba maršrutizatorių.

ref http://compnetworking.about.com/od/basicnetworkingconcepts/l/bldef_port.htm

ref http://compnetworking.about.com/od/itinformationtechnology/l/bldef_socket.htm

88
30 сент. atsakymas duotas Galwegian Sep 30 2008-09-30 13:07 '08, 13:07 pm 2008-09-30 13:07

Su tam tikra analogija

Nors daugelis techninių detalių jau buvo pateiktos dėl lizdų ... Norėčiau pridėti savo atsakymą, tik tuo atveju, jei kas nors vis dar negali jaustis skirtumo tarp IP, prievadų ir lizdų

Apsvarstykite serverį S ,

tarkime, kad žmogui X, Y, Z reikia šios serverio paslaugos (pvz., pokalbių paslaugos)

tada

IP adresas sakokas? kad pokalbių serveris „S“, kad X, Y, Z nori susisiekti

gerai, jūs turite „kas yra serveris“

bet tarkime, kad serveris „S“ taip pat teikia kitas paslaugas kitiems žmonėms, tarkim, „S“ teikia saugojimo paslaugas asmenims A, B, C

tada

uostas sako ---> kuris? paslaugą, kurią jums reikia (X, Y, Z), t.y. pokalbių paslauga, o ne saugojimo paslauga

gerai .. jūs darote, kad serveris žinotų, jog jums reikia pokalbių paslaugos, o ne saugyklos

bet

esate treji metai ir serveris gali norėti identifikuoti visus tris skirtingus

lizdas

Dabar lizdas sakoką? konkretus ryšys

tai yra, tarkim

1 lizdas žmogui x

2 lizdas žmogui Y

ir lizdas 3 žmogui Z

Tikiuosi, kad tai padės kažkas, kas vis dar supainioti :)

60
20 июня '16 в 12:57 2016-06-20 12:57 atsakymą pateikia „ eRaisedToX“ birželio 20 d., 16 d., 12:57 2016-06-20 12:57

Pirma, manau, kad turėtume pradėti mažai suprasti, kas yra paketo priėmimas iš A į B.

Bendras tinklo apibrėžimas yra OSI modelio naudojimas , kuris pagal paskirtį padalija tinklą į kelis sluoksnius. Yra keletas svarbių dalykų, kuriuos mes peržiūrėsime čia:

  • Duomenų kanalo lygis. Šis sluoksnis yra atsakingas už duomenų paketų priėmimą iš vieno tinklo įrenginio į kitą ir yra šiek tiek didesnis už faktiškai perduotą lygį. Jis kalba apie MAC adresus ir žino, kaip rasti kompiuterius pagal jų MAC (aparatūros) adresą, bet ne daugiau.
  • Tinklo sluoksnis yra sluoksnis, leidžiantis perkelti duomenis per mašinas ir per fizines ribas, pvz., Fizinius įrenginius. Tinklo sluoksnis iš esmės turėtų paremti papildomą mechanizmą, pagrįstą adresu, kuris yra kažkaip susijęs su fiziniu adresu; Įveskite IP adresą (IPv4). IP adresas gali gauti jūsų paketą nuo A iki B internetu, bet nieko nežino, kaip eiti per atskirus skrydžius. Tai apdorojama aukštesniu lygiu pagal maršruto informaciją.
  • Transporto lygis. Šis lygis yra atsakingas už tai, kad būtų nustatyta, kaip gaunama informacija iš A į B ir kokie yra apribojimai, patikrinimai ar klaidos. Pavyzdžiui, TCP paketui prideda papildomos informacijos, kad galėtumėte ištrinti, jei paketai buvo prarasti.

TCP, be kitų dalykų, apima uostų sąvoką. Tai iš tikrųjų yra skirtingi duomenų taškai tame pačiame IP adrese, kurį interneto lizdas gali susieti ( AF_INET ).

Taip atsitinka ir UDP bei kitų transporto sluoksnių protokolų. Jie nereikalauja uosto priežiūros, tačiau šie uostai suteikia galimybę kelioms pirmiau minėtų sluoksnių programoms naudoti tą patį kompiuterį priimti (ir iš tikrųjų) išeinančius ryšius.

Tai veda prie TCP arba UDP ryšio anatomijos. Kiekvienas iš jų turi prievado ir šaltinio adresą, taip pat tikslinį uostą ir adresą. Tai reiškia, kad bet kurioje sesijoje taikomoji programa gali atsakyti ir gauti iš šaltinio.

Taigi, prievadai iš esmės yra kredencialas, leidžiantis naudoti kelis vienalaikius ryšius naudoti tą patį adresą.

Dabar turime pažvelgti į tai, kaip jūs bendraujate nuo paraiškos su išoriniu pasauliu. Norėdami tai padaryti, turite paprašyti jūsų operacinės sistemos, ir kadangi dauguma operacinių sistemų palaiko „Berkeley“ lizdų metodą, matome, kad galime sukurti programas, kuriose yra uostų iš šių programų:

 int fd = socket(AF_INET, SOCK_STREAM, 0); // tcp socket int fd = socket(AF_INET, SOCK_DGRAM, 0); // udp socket // later we bind... 

Puikus! Todėl sockaddr struktūrose nurodome mūsų uostą ir bam! Darbas! Na, beveik, išskyrus:

 int fd = socket(AF_UNIX, SOCK_STREAM, 0); 

taip pat įmanoma. Urgas, kuris savo darbuose išmeta veržliaraktį!

Na, gerai, iš tikrųjų tai nėra. Viskas, ką turime padaryti, yra rasti tinkamus apibrėžimus:

  • Interneto lizdas yra IP adreso, protokolo ir susijusio prievado numerio, per kurį paslauga gali teikti duomenis, derinys. Taigi, port tcp 80, stackoverflow.com yra interneto lizdas.
  • Unix lizdas yra, pavyzdžiui, IPC galinis taškas, rodomas failų sistemoje. /var/run/database.sock .
  • Lizdas API yra būdas prašyti programos skaityti ir rašyti duomenis į lizdą.

Voila! Jis susitvarko. Taigi, mūsų schemoje

  • Uostas yra skaitmeninis identifikatorius, kuris, kaip transporto sluoksnio protokolo dalis, nurodo paslaugos numerį, kuris turėtų atsakyti į pateiktą užklausą.

Taigi iš tiesų uostas yra internetinės lizdo formavimo reikalavimų pogrupis. Deja, paaiškėjo, kad žodinio lizdo reikšmė buvo pritaikyta kelioms skirtingoms idėjoms. Todėl nuoširdžiai patariu įvardinti savo kitą projekto lizdą, tik pridėti prie painiavos;)

41
07 апр. atsakymą pateikė vartotojo257111 07 balandžio. 2012-04-07 23:17 '12, 23:17, 2012-04-07 23:17

Socket = IP adresas + prievadas (skaitmeninis adresas)
Kartu jie nustato įrenginio tinklo ryšio galinį tašką. (Ar tiesiog paleidžiau tinklą 101?)

27
30 сент. Gishu atsakymas 30 rugsėjis 2008-09-30 13:05 '08, 13:05 val. 2008-09-30 13:05

Trumpas trumpas atsakymas.

Uostas gali būti apibūdinamas kaip vidinis adresas priimančiojoje vietoje, kuri identifikuoja programą ar procesą.

Lizdą galima apibūdinti kaip programinės įrangos sąsają , leidžiančią programai bendrauti su kitomis programomis ar procesais internete ar vietoje.

24
19 марта '14 в 4:31 2014-03-19 04:31 atsakymą pateikė Andy, kovo 19 d., 14 d., 4:31, 2014-03-19 04:31

Paprastai jūs gaunate daug teorinių, bet vienas iš paprasčiausių būdų atskirti šias dvi sąvokas yra toks:

Norėdami gauti paslaugą, jums reikia paslaugos numerio. Šis paslaugos numeris vadinamas uoste. Tiesiog taip.

Pavyzdžiui, HTTP kaip paslauga veikia 80 prievade.

Dabar daugelis žmonių gali prašyti paslaugos, o ryšys su kliento serveriu yra nustatytas. Bus daug jungčių. Kiekvienas ryšys yra klientas. Norėdami palaikyti kiekvieną ryšį, serveris sukuria lizdą kiekvienam ryšiui, kad palaikytų savo klientą.

24
13 дек. atsakymas pateikiamas kta 13 dec. 2013-12-13 13:09 '13, 13:09 2013-12-13 13:09

Atrodo, kad yra daug atsakymų, lyginant lizdą su ryšiu tarp dviejų kompiuterių. Manau, kad tai visiškai negerai. Lizdas visada buvo galutinis taškas 1 asmeniniame kompiuteryje, kuris gali būti arba negali būti prijungtas - žinoma, mes visi naudojome imtuvą arba UDP lizdus * tam tikru momentu. Svarbi dalis yra ta, kad ji yra adresuojama ir aktyvi. Tikėtina, kad pranešimo siuntimas į failą 1.1.1.1:1234 neveiks, nes nėra šio lizdo.

Kištukiniai lizdai yra specifiniai protokolai, todėl unikalumo įgyvendinimas yra tas, kad TCP / IP ir UDP / IP naudojimas * (ipaddress: port) skiriasi nuo, pavyzdžiui, IPX (tinklo, mazgo ir ... žaidimo, lizdo, bet skirtingo lizdo, nei bendrinis terminas „lizdas“. Lizdų numeriai (IPX atitinka IP prievadus). Bet jie visi siūlo unikalų adresuojamą rezultatą.

Kadangi IP tapo dominuojančiu protokolu, uostas (tinklo sąlygomis) tapo vienaskaita su UDP arba TCP prievado numeriu, kuris yra lizdo adreso dalis.

  • UDP nėra susijęs su ryšiu - tai reiškia, kad virtuali schema tarp dviejų galinių taškų niekada nesukurta. Tačiau kaip galutinį tašką mes vis dar nurodome UDP lizdus . API funkcijos aiškiai parodo, kad abi yra tik skirtingų tipų lizdai. SOCK_DGRAM yra UDP (tiesiog siunčia žinutę), o SOCK_STREAM yra TCP (sukurianti virtualią schemą).

  • Techniškai IP antraštėje yra IP adresas, o protokolas per IP (UDP arba TCP) turi prievado numerį. Это позволяет использовать другие протоколы (например, ICMP , которые не имеют номеров портов, но имеют информацию о IP-адресе).

23
ответ дан Mark Brackett 30 сент. '08 в 16:26 2008-09-30 16:26