Java. Http-protokoll och arbeta med webben


Socket vs socket del 2, eller säg "Nej" TCP-protokoll - Wasm.ru Arkiv

I den första delen, som ägnas åt grunderna för användningswinda med hjälp av monterprogram, pratade vi om vilka uttag som de är skapade och vilka parametrar som uppstår. Samtidigt sagt sagt om icke-ansluten UDP-protokoll, som inte garanterar leverans av paket, liksom ordern för mottagandet till destinationen. I det pedagogiska exemplet användes vårt favorit TCP-protokoll. Och allt var bra med oss, men i slutändan var ett antal olösta frågor, i synnerhet hur man organiserar en ömsesidig utbyte mellan flera datorer i nätverket, hur man överför något till många datorer på en gång etc.

Generellt sett är det inte alls nödvändigt att läsa den första delen för att förstå strömmen, även om det i fråga om saken ständigt hänvisar till henne. Så går det. Ha ha ...

Så sätter vi uppgiften: det finns ett lokalt nätverk, säger, ut ur ett dussin datorer, måste du organisera meddelanden mellan två någon av dem, och (valfritt) mellan ett och allt.

Jag hör, jag hör tipset Chorus som de säger, använder de inbyggda fönstren i Windows, typ:

net Send 192.168.0.4 Zhenya Schlet Hej!

net Send Node4 Väntar på svar!

Det finns bara två invändningar på det. Först vet du aldrig att vårt operativsystem eller andra färdiga program kan, vi vill lära oss att skriva sina program, eller hur? Och den andra är det inte ett faktum att meddelandet kommer från en person till människan. I allmänhet kan operatören inte veta någonting ... och det borde inte veta någonting ...

För mig var det viktigaste i formuleringen av denna uppgift att ge möjlighet att överföra något till alla datorer i nätverket omedelbart. Tänk dig att vi skrev något program ... Vem sa - Troyan? Nej, nej och nej! Inga trojaner. Bara ett litet (mycket) redovisningsprogram, till exempel. Som fortfarande kan lösa sig i många datorer i vårt lokala nätverk. Och nu kommer den bestämda tiden, det är dags att minska balansen med buldo, släppa det, så att säga, resultatet för kvartalet ... det är nödvändigt att göra allt snabbt och helst samtidigt. Hur man gör det inom ramen för det material som vi studerade i den första delen var oklart.

Svaret, som alltid ger WINDSAPI. Vi letar efter och hittades. Fungera skicka till.() – skickar data på den angivna adressen. Och vad då dess skillnad från den funktion som redan studerats i den första delen av funktionen skicka.() ? Det visar sig att skicka till.() Kan utföra sändningsöverföring med en speciell IP-adress. Men uppmärksamhet, det fungerar bara för sock_dgramuttag! Och uttagen, vid öppning som Sock_DGgram-värdet används som en parameter av socketypen, arbetar via UDP-protokollet och inte TCP! Härifrån blir det klart värdet av undertexten i den här artikeln ... Naturligtvis är det bara en litterär mottagning, inget protokoll är inte bättre och inte värre än den andra, de är bara ... olika, det är allt. Även om båda är ett transportnivåprotokoll som "... ge dataöverföring mellan applikationsprocesser." Båda hänvisar till nätverksskiktprotokollet, såsom IP för sändning (mottagande) data. Genom vilken då de (data) faller i den fysiska nivån, d.v.s. På onsdagen, överföringen ... och vad är det för miljön som känner honom. Kanske är det här en kopparkabel, och kanske inte medium alls, och torsdag, och inte en kopparkabel, men en sändning ...

Schema för interaktion mellan nätverksprotokoll.

UDP.U.ser. D.atagram. P.rotokol

TCP-T.ransmission C.ontrol P.rotokol

ICMP - I.nternet. C.ontrol M.essage. P.rotocol (protokollhantering-ersättning)

ARP -A.ddress R.esolution P.rotocol (adressdefinitionsprotokoll)

I allmänhet, om ritningen inte hjälpte dig, inte problem. Det är viktigt att förstå en sak som TCP är ett transportnivåprotokoll som tillhandahåller pålitlig Transport av data mellan tillämpade processer på väg anläggningar av logisk förening (allokerad av mig). Och UDP - nej. Och vidare. Någonstans där, på den applicerade nivån, i en av de tomma rektanglarna och vår ansökan kommer att vara.

På detta avslutar vi den inledande delen och fortsätter att överväga hur man använder den, från början.

För att visa hela materialet, som vanligt, används ett pedagogiskt exempel som du kan ladda ner< >. Vi hoppar över en gemensam applikation på alla Windows-applikationer och beskriver bara vad uttagsarbetet. Först måste du initiera Windows Sockets DLL med funktionen WSASTARTUP.() som kommer tillbaka noll i händelse av framgångsrikt utförande, eller annars, en av felkoderna. Vid initialisering av huvudprogramfönstret öppnar du uttaget för att ta emot generaliseringen:

    anropa uttag, af_inet, \\

    Sock_dgram, \\; Anger typ av socket - UDP-protokoll!

    0; Protokoll typ

    Om EAX! \u003d Invalid_Socket; Om det inte finns något fel

    mOV HSocket, EAX; Kom ihåg beskrivning

Efter det måste du som vanligt ange Windows-meddelanden till ett visst fönster från det uttag som du öppnar:

    Åberopa wsaasyncselect, hsocket, hwnd, wm_socket, fd_read

var hsocket. - Beskrivningsuttag
hwnd. - Fönsterbeskrivare, vars förfarande kommer att skickas meddelanden
Wm_socket. - Meddelande, USA som definieras i avsnittet. Konst
Fd_read. - Mask, fråga de händelser du är intresserad av, i det här fallet är det här värdet av data från en läsuttag.

Jag hör, jag hör den förvånade kören med förtvivlan i en röst: de lovade en dold applikation, och sedan huvudfönstret och allt som ... Faktum är att det inte är nödvändigt att göra utan det, för Operativsystemet skickar alla meddelanden till vår applikation Chepred i sina fönster. Utgången är enkel. Om det behövs, gör ett doldt det här är det viktigaste applikationsfönstret. På vilket sätt? Till exempel, kommentera strängen:

    Åberopa showindow, hwnd, sw_shownormal

eller, mer korrekt, använd:

    invoke Showindow, HWND, SW_HIDE

Därefter startar vår applikation, huvudfönstret kommer att skapas, wm_create-meddelandet skickas från Windows med Windows med alla följande ... Endast dess fönster kommer inte att vara synliga på skrivbordet eller på aktivitetsfältet. Om det här är vad du ville, är jag glad. Under alla omständigheter fortsätter vi ...

För att göra detta omvandlar vi portnumret till nätverksordningens byte med hjälp av den speciella API-funktionen:

    Åberopa htns, hamn

    mOV SIN.SIN_PORT, AX

    mOV SIN.SIN_FAMILY, AF_INET

    mOV SIN.SIN_ADDR, INADDR_ANY

Liten lyrisk reträtt, valfritt för att förstå meningen med den här artikeln .

Antalet hamnar för våra socklar diskuterades i slutet av den första delen. Det är svårt att ge rekommendationer om vad de borde vara. Det enda som kan sägas är vad de inte kan vara. Det är orimligt att försöka använda portnummer som definieras för utbredda tjänster, till exempel:

genom protokollet TCP.: 20, 21 - FTP; 23 - Telnet; 25 - SMTP; 80 - http; 139 - Netbios sessionstjänst;

genom protokollet UDP.: 53 - DNS; 137, 138 - NetBIOS; 161 - SNMP;

Naturligtvis har API en speciell funktion. getservbyport.() som vid det angivna portnumret returnerar namnet på den tjänst som motsvarar det. Snarare återvänder funktionen själv en pekare till strukturen inuti som det finns en pekare på detta namn ...

Du kan kalla det så här:

    Åberopa htns, hamn; Vi omvandlar portnumret i nätverksordningens byte

    invoke Getserviceport, AX, 0;

Var uppmärksam på vad som rapporterar Win32 Programmer'sReference getservbyport.:

"... returnerar en pekare till en struktur som distribueras till Windows-uttag. Appen ska aldrig försöka ändra denna struktur eller någon av dess komponenter. Dessutom distribueras endast en kopia av denna struktur förÖversvämningSå applikationen måste kopiera all information som den krävs före några andra samtalsfunktioner. "

Och här är strukturen själv:

  1. s_NAME DWORD? pekare till strängen med namnet på tjänsten

    s_aliases dword;;

    s_port ord?; Portnummer

    s_PROTO DWORD

Det finns i API, så att säga och "par" -funktionen: getservbyname ()Vilket programnamn returnerar information om numret på den använda porten.

Tyvärr kommer praktiska fördelar med dessa funktioner inte att vara möjliga för oss. Så vet vad de är och glömmer dem ...

    Åberopa bind, hsocket, addr synd, storlek av synd

    Om EAX \u003d\u003d Socket_Error; Om fel

    invoke Messagebox, Null, ADDR ...

Detta beredda arbete med att skapa och konfigurera ett mottagaruttag med användning av datagram kan anses vara komplett. Inget behov av att installera ett uttag till hamnfunktionens kontras lyssna.Som vi gjorde för en sock_stream-uttag i den första delen. Nu i förfarandet i huvudfönstret i vår applikation kan vi lägga till koden som ska utföras när WM_Socket-meddelandet kommer från uttaget:

    ; Om ett meddelande är mottaget från uttaget (HSocket)

    Eleverif UMSG \u003d\u003d WM_Socket

  1. Om ax \u003d\u003d fd_read;

  2. Om AX \u003d\u003d null; Det finns inget fel

    ; Ta data (64 byte) från uttaget till Buffer Bytrecu

    Åberopa REVV, HSocket, ADDR Bytrecu, 64, 0;

Nu om hur du öppnar ett uttag för att skicka meddelanden. Här är alla nödvändiga åtgärder för programmet:

    anropa uttag, af_inet, sock_dgram, 0

      Åberopa htns, hamn

      mOV SIN_TO.SIN_PORT, AX

      mOV SIN_TO.SIN_FAMILY, AF_INET

      Åberopa inet_addr, addr adresip

      mOV SIN_TO.SIN_ADDR, EAX

    När det gäller dataöverföring är det tillräckligt att göra nästa:

      invoke Sendto, Hsocket1, Addr Bytend1, 64, 0, \\

      addr sin_to, storlek av sin_to

    Parametervärden när du ringer till den här funktionen:

    hsocket1. - Beskrivare tidigare öppet uttag
    addrbytsend1. - Adressen till bufferten innehållande data på överföringen
    64 - Data data wbufer, i byte
    0 - Indikator ..., i MSDNet, bara 0
    addrsin_to - Pekare till konstruktionen som innehåller destinationsadressen
    sizeofsin_to. - Storleken på denna struktur i byte.

    Om när du utför en funktion skicka till.() Det fanns inga fel, det returnerar antalet överförda byte, annars har vi socket_error i EAX-utgången.

    Nu är det dags att prata om själva sändningsadressen, som nämndes i början. I struktur Vi fyllde tidigare fältet med IP-adressen till destinationen, vilket indikerar var i själva verket skickar data. Om den här adressen är 127.0.0.1 - Naturligtvis kommer våra data inte att gå någonstans på din egen dator. Litteraturen anger tydligt att paketet som skickas till nätverket med en 127.x.x.x.x-adress kommer inte att överföras på vilket nätverk som helst. Dessutom bör routern eller gatewayen aldrig distribuera information om rutter för nätverket med ett nummer 127 - den här adressen är inte en nätverksadress. För att skicka "sänd" till alla datorer till alla datorer till det lokala nätverket måste du använda den adress som bildas från vår egen IP-adress, men med alla enheter i den yngre oktaten, något typ 192.168.0.255.

    Här, faktiskt alla. Vid tidpunkten för att stänga programmet är det nödvändigt att stänga socklarna och frigöra resurserna i sockets DLL, det är bara gjort:

      invoke Closeskket, Hsocket

      invoke Closesocket, Hsocket1

      Åberopa wsacleanup.

    För multipotala applikationer efter Wsacleanup. Verksamheten är färdig med uttag för alla trådar.

    Det svåraste i den här artikeln var att bestämma för mig hur bäst du vill illustrera användningen av Windows Sockets API. Ett tillvägagångssätt, du har nog redan sett när ett uttag för mottagning och ett uttag för meddelanden används samtidigt i en enda applikation. Inte mindre attraktiv verkar vara ett annat sätt när koden för en och den andra är tydligt uppdelad, upp till den som finns i olika tillämpningar. I slutändan implementerade jag också den här metoden som kan vara något lättare att förstå nybörjare. I andra<архиве

    Icke-legosoldat skicka ()utfärdat socket_error!

    Slutligen kan vi notera några vanliga problem som uppstår vid arbete med uttag. För att hantera ett fönstermeddelande som informerar om att uttaget har ändrats, använde vi som vanliga direktmeddelanden från Windows till huvudprogramfönstret. Det finns ett annat tillvägagångssätt när du skapar separata fönster för varje uttag.

    Generellt sett är centraliserad meddelandebehandling huvudfönstret - det verkar vara enklare att förstå den metod som ändå i praktiken kan lägga till problem. Om programmet används mer än ett uttag samtidigt måste du lagra en lista med socketbeskrivare. När meddelanden visas från uttag, söker huvudfönsterproceduren i listan information som är associerad med denna socketbeskrivare och skickar ett statusändringsmeddelande vidare till proceduren som är utformat för detta. Vilket på ett eller annat sätt reagerar, gör något där ... Detta tillvägagångssätt tvingar behandlingen av nätverksuppgifter att integrera sig i kärnan i programmet, vilket gör det svårt att skapa bibliotek med nätverksfunktioner. Varje gång dessa nätverksfunktioner används, ska en extra kod läggas till i huvudfönsterhanteraren.

    I den andra metoden för att bearbeta meddelanden för att ta emot dem skapar programmet ett doldt fönster. Det tjänar till att separera huvudfönsterproceduren för applikationen från hantering av nätverksmeddelanden. Detta tillvägagångssätt kan förenkla huvudansökan och underlätta användningen av den tillgängliga nätverkskoden i andra program. Den negativa sidan av detta tillvägagångssätt är den överdrivna användningen av Windows - användarminne, eftersom För varje fönstret skapas en ganska stor volym.

    Vilket sätt att välja är att bestämma själv. En sak till. Vid tidpunkten för experiment kan du behöva stänga av din personliga brandvägg. Exempelvis reagerade Outpost Pro 2.1.275 i träningsläget på ett försök att överföra till ett uttag, men när överföringen manuellt löstes, nådde data fortfarande inte. Här har du UDP. Även om fallet inte är i detta. Det fanns inga problem med min zonealarmpro 5.0.590 i samma situation.

    P.S.Avsluta den andra delen av artikeln, jag snubblat av av misstag på nätverket på Trojans källor på vårt favoritmasmspråk. Allt är sammanställt och startat, en sak, men klienten vill inte ansluta till servern, och även under Windows 2000 SP4 kraschar ibland med ett fel, de säger att programmet kommer att stängas och allt som ... personligen, i Den här trojanen jag gillar att programmet inte är där, eller "kastar ut" en fil med lösenord och skickar det via e-post och har ett brett spektrum av kontrollerade fjärrfunktioner som är descended ursprungligen implementerade. Om det visar sig få all den här ekonomin till en mening, kan det snart framstå den tredje delen på beskrivningen av det specifika implementeringen ... för dem som noggrant läser båda artiklarna och räknat ut funktionen av API-uttagets funktion , det finns inget komplicerat. Det verkar som om ... Författaren själv skriver själv i Readme att han skrev det (Troyan) för utbildningsändamål. Jaja. Detta kommer att använda det.

    Direktör.

Socklar

Uttag - Detta är ena änden av den bilaterala kommunikationskanalen mellan de två programmen som körs. Ansluta två socklar kan du sända data mellan olika processer (lokal eller fjärrkontroll). Uttagets implementeringar säkerställer inkapsling av nätverks- och transportnivåprotokoll.

Ursprungligen utvecklades uttag för UNIX i Kalifornien universitet i Berkeley. I UNIX följs en ingångsutgångsmetod av en öppen / läs / skriv / stäng algoritm. Innan du använder resursen måste du öppna, ställa in lämpliga behörigheter och andra parametrar. Så snart resursen är öppen kan du läsa från den eller skriva data till den. Efter att ha använt resursen måste användaren ringa den stängda metoden () för att skicka en signal till operativsystemet på slutförandet av dess operation med den här resursen.

När medel läggs till i UNIX-operativsystemet interprocess interaktion (interprocesskommunikation, IPC) Och nätverksutbyte, den vanliga I / O-mallen lånades. Alla resurser som öppnas för kommunikation i UNIX och Windows identifieras av deskriptorer. Dessa beskrivare, eller beskrivare (handtag)Kan indikera en fil, minne eller någon annan kommunikationskanal, och indikerar faktiskt den interna datastrukturen som används av operativsystemet. Socket, som samma resurs, är också en deskriptor. Följaktligen, för uttag, kan livslängden delas upp i tre faser: öppna (skapa) uttag, få från uttaget eller skicka uttaget och slutligen stänga uttaget.

IPC-gränssnittet för att interagera mellan olika processer är byggt ovanpå I / O-metoder. De gör det lättare för socklar som skickar och tar emot data. Varje målobjekt anges av socketadressen, därför kan denna adress anges i klienten för att upprätta en anslutning till målet.

Typer av uttag

Det finns två huvudtyper av socklar - Streaming Sockets och Datagram.

Strömuttag (strömuttag)

Strömningsuttaget är ett uttag med en ansluten förening bestående av en ström av byte, som kan vara dubbelriktad, t, e. Genom denna ändpunkt kan applikationen sända och ta emot data.

Strömningsuttag säkerställer felkorrigering, hanterar leverans och lagrar datasekvens. Det kan reeded i leverans av beställda, infuserade data. Strömningsuttag är också lämpligt för sändning av stora mängder data, eftersom de omkostnader som är förknippade med att upprätta en separat anslutning för varje meddelande som sänds kan vara oacceptabelt för små mängder data. Streaming socklar når denna nivå av kvalitet på grund av användningen av protokollet Transmissionskontrollprotokoll (TCP) . TCP tillhandahåller data på andra sidan i önskad sekvens och utan fel.

För denna typ av uttag bildas sökvägen innan meddelandet startas. Därigenom är det garanterat att båda parter som deltar i interaktionen antas. Om programmet skickar två meddelanden till mottagaren är det garanterat att dessa meddelanden kommer att erhållas i samma sekvens.

Men enskilda meddelanden kan krossas i paket, och metoden att bestämma gränserna för register existerar inte. Vid användning av TCP antar detta protokoll separering av de överförda data till lämpliga storlekspaket, skicka dem till nätverket och montera dem på andra sidan. Ansökan vet bara att den skickar ett visst antal byte till TCP-nivån och den andra sidan tar emot dessa byte. I sin tur delar TCP effektivt dessa data på förpackningarna med lämplig storlek, det tar emot dessa paket på andra sidan, det belyser data och kombinerar dem tillsammans.

Trådar är baserade på explicit föreningar: uttag A-förfrågningar En anslutning med ett uttag B, och uttaget är antingen överens om en begäran om att upprätta en anslutning eller avvisar den.

Om data ska garanteras leverera till den andra sidan eller storleken är stor, är streaminguttag föredras för datagram. Om tillförlitligheten av kommunikation mellan två ansökningar är av största vikt, välj Streaming-uttag.

E-postservern presenterar ett exempel på en applikation som måste leverera innehåll i rätt ordning utan duplicering och hoppning. Streaming-uttaget räknas att TCP kommer att leverera meddelanden för deras ändamål.

Datagramuttag (datagramuttag)

Datagramuttag kallas ibland uttag utan att organisera anslutningar, dvs ingen tydlig förbindelse mellan dem är inställd - meddelandet skickas till det angivna uttaget och kan följaktligen erhållas från det angivna uttaget.

Streaming socklar jämfört med datagram ger verkligen en mer tillförlitlig metod, men för vissa applikationer är de overheadkostnader som är förknippade med att installera en explicit anslutning oacceptabla (till exempel tidsservern som ger tidssynkronisering för sina kunder). I slutändan tar det en tid att upprätta en tillförlitlig anslutning med servern som helt enkelt gör underhållsförseningar och serverapplikationsuppgiften inte utförs. För att minska kostnaderna måste du använda datagramuttag.

Användningen av datagramuttag kräver överföring av data från klienten till servern för att engagera sig User Datagram Protocol (UDP) . I detta protokoll införs storleken på meddelandena på vissa begränsningar, och till skillnad från streaminguttag som kan på ett tillförlitligt sätt skicka meddelanden till adresseringsservern, tillhandahålls Datagram Sockets-tillförlitlighet. Om data förlorades någonstans på nätverket, rapporterar servern inte fel.

Förutom de två typerna av typer finns det också en generaliserad form av uttag, som kallas indirekt eller rå.

Råuttag (råuttag)

Det främsta målet att använda rå socklar kringgår mekanismen genom vilken datorn behandlar TCP / IP. Detta uppnås genom att tillhandahålla ett speciellt implementering av TCP / IP-stapeln, som ersätter mekanismen som tillhandahålls av TCP / IP-stapeln i kärnan - förpackningen överförs direkt till applikationen och bearbetas därför mycket mer effektivt än när de passerar genom Den huvudsakliga stacken av klientprotokoll.

Enligt definition är RAW-uttaget ett uttag som tar paket genom att kringgå TCP- och UDP-nivåer i TCP / IP-stacken och skickar dem direkt till programmet.

Vid användning av sådana socklar passerar paketet inte genom TCP / IP-filtret, dvs. Det behandlas inte och visas i sin råa form. I det här fallet är tullen att korrekt bearbeta alla data och utföra sådana åtgärder som avlägsnande av rubriker och analysen av fälten faller på mottagarprogrammet - det är inte lika med att inkludera en liten TCP / IP-stack i ansökan .

Det kan dock sällan krävas av ett program som arbetar med råuttag. Om du inte skriver systemprogram eller ett program som liknar paketanalysatorn behöver du inte dyka in i sådana delar. Råuttag används huvudsakligen i utvecklingen av specialiserade protokollapplikationer med låg nivå. Till exempel, en sådan mängd olika TCP / IP-verktyg, som spårväg, ping eller ARP, använder rå socklar.

Att arbeta med råuttag kräver en solid kunskap om TCP / UDP / IP-grundprotokoll.

Hamnar

Hamnen är definierad för att lösa uppgiften att samtidigt interaktion med flera applikationer. I huvudsak expanderar det begreppet IP-adressen. Den dator där flera applikationer utförs samtidigt, mottager ett paket från nätverket, kan identifiera målprocessen med det unika portnummer som definieras när anslutningen är etablerad.

Socket består av en IP-adress för maskinen och portnumret som används av TCP-programmet. Eftersom IP-adressen är unik på Internet, och portnummer är unika på en separat maskin, är socketantal också unika på hela Internet. Denna egenskap gör det möjligt för processen att kommunicera via ett nätverk med en annan process exklusivt baserat på uttagsnumret.

För vissa tjänster är portnummerstjänster reserverade - dessa är allmänt kända portnummer, till exempel port 21 som används i FTP. Din ansökan kan använda något portnummer som inte har reserverats och är inte upptagen än. Byrå Internet tilldelat talmyndighet (IANA) Wides en lista med allmänt kända portnummer.

Vanligtvis är programmet för applikationsklient-server som använder socklar består av två olika applikationer - en klient, initierar en anslutning till (servern) och en server som väntar på en anslutning från klienten.

Till exempel, på klientsidan, bör ansökan känna till målet för målet och portnumret. Om du skickar in en anslutningsförfrågan försöker kunden att upprätta en anslutning till servern:

Om händelser utvecklas framgångsrikt, förutsatt att servern körs innan klienten försökte ansluta till den, godkänner servern till anslutningen. Genom att ge samtycke skapar serverns program ett nytt uttag för interaktion med klienten som är installerad av klienten:

Nu kan klienten och servern interagera med varandra, läsa meddelanden var och en av sitt uttag och, följaktligen inspelade meddelanden.

Arbeta med v.net-uttag

Stöd för Vet Sockets ger klasser i namnrymd System.net.Sockets. - Låt oss börja med sin korta beskrivning.

Klasser för att arbeta med socklar
Klass Beskrivning
Multicastoption Multicastoption-klassen ställer in värdet på IP-adressen för att fästa i IP-gruppen eller för att avsluta den.
Nätverksström NetworkStream-klassen implementerar den grundläggande flödesklassen från vilken data skickas och där de erhålls. Detta är en abstraktion på hög nivå som representerar en TCP / IP-kommunikationskanal.
Tcpclient. TCPClient-klassen är baserad på socketklassen för att ge TCP-tjänst på en högre nivå. TCPClient tillhandahåller flera metoder för att skicka och ta emot data via nätverket.
Tcplistener. Den här klassen är också byggd på en lågnivåuttag. Dess huvudsakliga syfte är serverapplikationer. Det förväntar sig inkommande frågor till anslutningar från kunder och meddelar en ansökan om några anslutningar.
Udpclient. UDP är ett protokoll som inte organiserar en anslutning, därför för genomförandet av V.Net UDP-tjänst krävs annan funktionalitet.
Socketexception Detta undantag genereras när ett fel uppstår i uttaget.
Uttag. Den sista klassen i systemet. Net.Sockets Namespace är självkontrollen. Det ger den grundläggande funktionaliteten i uttaget.

Socketklass

Socket-klassen spelar en viktig roll i nätverksprogrammering, vilket garanterar både klientens och serverns funktion. Huvudsakligen utför samtalen till dessa klassmetoder de nödvändiga säkerhetsrelaterade kontrollerna, inklusive verifiering av säkerhetssystembehörigheterna, varefter de överförs till analoger av dessa metoder i Windows Sockets API.

Innan du kontaktar användningen av socketklassen, överväga några viktiga egenskaper och metoder för den här klassen:

Egenskaper och metoder
Egendom eller metod Beskrivning
Adressfamilj. Ger en familjeadressfamilj - ett värde från socket.addressfamily-noteringen.
Tillgängliga Returnerar mängden data som är tillgängliga för läsning.
Blockering Det ger eller ställer in värdet som visar huruvida uttaget är i blockeringsläge.
Ansluten. Returnerar ett värde som informerar om uttaget med en fjärrvärd är ansluten.
LocalEndpoint. Ger en lokal slutpunkt.
Protokolltype. Ger typ av socket protokoll.
REMOTENDPOINT. Ger en fjärranslutning.
Sockettyp Ger typen av uttag.
Acceptera () Skapar ett nytt uttag för att behandla en inkommande anslutningsförfrågan.
Binda () Binds ett lokalt slutpunktsuttag för att förvänta sig inkommande anslutningsförfrågningar.
Stänga () Orsakar socket nära.
Anslut () Ställer in en anslutning med en fjärrvärd.
GetSocketoption () Returnerar värdet på socketoption.
Iocontrol () Ställer in lågnivå driftlägen för uttag. Denna metod ger tillgång till lågnivå till den underliggande sockelklassen.
Lyssna () Placerar ett uttag i lyssningsläge (väntar). Denna metod är endast avsedd för serverapplikationer.
Motta () Går data från ett anslutet uttag.
Opinionsundersökning () Bestämmer statusen för uttaget.
VÄLJ () Kontrollerar statusen för en eller flera uttag.
Skicka () Skickar data till det anslutna uttaget.
SetSocketOpption () Ställer in uttaget.
Stänga av () Förbjuder operationerna att skicka och ta emot data i ett uttag.

Därför är "skärpningen" av detta protokoll under arbete med separata dokument, mestadels text. Http i sitt arbete använder TCP / IP-funktioner, så överväga de möjligheter som Java tillhandahåller att arbeta med den senare.

I Java finns det ett speciellt paket "java.net" för detta, som innehåller java.net.socket-klassen. Socket i översättning betyder "boet", namnet det gavs analogt med uttag på utrustningen, de själva där pluggarna är anslutna. Följaktligen kan denna analogi associeras med två "socklar" och sända data mellan dem. Varje uttag hör till en viss värd (värd - ägaren, innehavaren). Varje värd har en unik IP (Internet Packet) -adress. För närvarande arbetar Internet på IPv4-protokollet, där IP-adressen är skriven med 4 nummer från 0 till 255 - till exempel 127.0.0.1 (mer om fördelningen av IP-adresser här - RFC 790, RFC 1918, RFC 2365, Om IPv6-version Läs här - RFC 2373)

Nockets är monterade på värdporten (port). Hamnen indikeras med ett tal från 0 till 65535 och markerar logiskt där du kan docka (bind) uttag. Om porten på den här värden redan är inkopplad i viss uttag, kommer det inte längre att lyckas. Således, efter att uttaget är installerat, har den en helt definierad adress, symboliskt skrivet enligt följande:, till exempel - 127.0.0.1:8888 (betyder att socket tar port 8888 på värden 127.0.0.1)

För att lätta livet för att inte använda en obekväma IP-adress uppfanns DNS-systemet (DNS-domännamnstjänst). Syftet med detta system är att kartlägga IP-adresser symboliska namn. Till exempel är adressen "127.0.0.1" i de flesta datorer associerad med namnet "localhost" (i den rymliga "lockalhost").

Lockalhost betyder faktiskt att datorn själv, där programmet är igång, det är den lokala datorn. Allt arbete med LockochTom behöver inte tillgång till ett nätverk och anslutning till andra värdar.

Klientuttag

Så, låt oss återvända till Java.net.Socket-klassen mest lämpliga för att initiera det enligt följande:

Public Socket (String Host, Int Port) kastar okäntHostException, ioException i värdsträngskonstanten, kan du ange både serverns IP-adress och dess DNS-namn. I det här fallet väljer programmet automatiskt en fri port på den lokala datorn och "Scout" där din uttag, varefter ett försök kommer att göras för att kontakta ett annat uttag, vilket anges i initialiseringsparametrarna. Samtidigt kan två typer av undantag inträffa: en okänd värdadress - när det inte finns någon dator med ett sådant namn eller ett icke-anslutningsfel med det här uttaget på nätverket.

Det är också användbart att känna till funktionen

Public Void SetSotIneout (int timeout) kastar socketException Den här funktionen ställer in timeout (timeout) för att fungera med uttaget. Om ingen åtgärd med uttaget har gjorts under denna tid (det beror på kvittot och sändningsdata) är det självförstörelse. Tiden är inställd på några sekunder, när du installerar timeout lika med 0-uttaget blir "Evig".

För vissa nätverk är timeout-ändringen inte möjlig eller installerad med vissa intervaller (till exempel från 20 till 100 sekunder). När du försöker installera en ogiltig timeout, kommer ett lämpligt undantag att utfärdas.

Ett program som öppnar uttaget på denna typ kommer att betraktas som en klient, och det uttagsprogram som du försöker ansluta kommer att kallas servern. I själva verket är serverprogrammet i själva verket och kommer att vara ett boet, och klienten är densamma för pluggen.

Socket server

Så här etablerar du en anslutning från klienten till den server som jag just har beskrivit, nu - hur man gör ett uttag som kommer att betjäna servern. För att göra detta, i Java finns det följande klass: java.net.serverocket den mest lämpliga initializer för det är följande:

Public Serversocket (INT-port, INT-backlog, inetaddress BindAddr) kastar IoException Som du kan se, som en tredje parameter, används ett objekt med en annan klass som en tredje parameter - java.net.inetaddress Denna klass ger arbete med DNS och IP-namn , På detta kan ovanstående initializer i program användas så: servrar (hamn, 0, inetaddress.getbyname (värd)) kastar IoException För denna typ av uttag anges installationsporten direkt, därför, när den initieras, kan ett undantag uppstår att den här porten redan används eller förbjuden för att använda datorpolicy.

Efter installationen av uttaget kallas funktionen

Public Socket Accept () kastar IOException Den här funktionen nedsänker programmet i väntan på det ögonblick då klienten ska fästa serverns uttag. Så snart anslutningen är etablerad, kommer funktionen att returnera Socket Class-objektet för att kommunicera med klienten.

Klientserver över socklar. Exempel

Som ett exempel är det enklaste programmet som implementerar arbetar med socklar.

Från klientsidan fungerar programmet enligt följande: Klienten är ansluten till servern, skickar data, varefter den tar emot data från servern och visar dem.

Från serverns sida ser det ut så här: servern ställer in serverns uttag till port 3128, varefter den väntar på inkommande anslutningar. Efter att ha fått en ny anslutning sänder servern den till en separat datorström. I en ny ström mottar servern data från klienten, attributera sekvensnummeret för anslutningsnumret och skickar data tillbaka till klienten.


Logisk struktur av programexempel

Program Enkel TCP / IP-klient

(Sampleclient.java) Importera Java. Io. *; Importera Java. netto. *; Klass sampleclient förlänger tråd (offentlig statisk void huvud (sträng args) (försök ( // Öppen uttag och anslut till Localhost: 3128 // få serveruttag Socket s \u003d Ny uttag ("localhost", 3128); // Ta utgångsströmmen och ta det första argumentet där. // Ställ in när du ringer, en öppen kontakt och dess port Args [0] \u003d args [0] + "\\ n" + s. getinetaddress (). GetHostAddress () + ":" + s. getlocalport (); s. Getoutputstream (). Skriv (args [0]. Getbytes ()); // Läs svaret Byte Buf \u003d New Byte [64 * 1024]; int r \u003d s. getInputStream (). Läs (BUF); Strängdata \u003d ny sträng (BUF, 0, R); // visa svaret på konsolen Systemet. Ut. Println (data); ) Fånga (undantag e) (system. Ut. Println ("init fel:" + e);) // Uteslutning } }

Enkelt TCP / IP-serverprogram

(Samverserver.java) Importera Java. Io. *; Importera Java. netto. *; Klass Samplerver förlänger tråd (socket s; Int num; offentlig statisk void huvud (sträng args) (försök (int i \u003d 0; // Anslutningsmätare // Skruva ut kontakten på Lockalhost, port 3128 Serversocket Server \u003d Ny servrar Locket (3128, 0, Inetaddress. Getbyname ("localhost")); Systemet. Ut. Println ("Server är igång"); // Lyssna på startporten (TRUE) ( // väntar på en ny anslutning, varefter vi kör klientens bearbetning // i en ny datorström och öka mätaren per enhet Ny Samplerver (I, Server. Acceptera ()); Jag ++; )) Fånga (undantag e) (system. Ut. Println ("init fel:" + e);) // Uteslutning ) Offentligt samplevert (int num, socket s) ( // kopiera data Detta. num \u003d num; Detta. s \u003d s; // och starta en ny datorström (se F-Y-körning ()) Setdaemon (sant); SETPRIRITET (NORM_PRIORITET); Start (); ) Public Void Run () (försök ( // från klientens uttag Ta flödet av inkommande data Inputstream är \u003d s. getInputStream (); // och därifrån - dataflödet från servern till klienten OUTPUTSTREAM OS \u003d s. getoutputstream (); // buffertdata i 64 kilobytes Byte buf \u003d ny byte [64 * 1024]; // Vi läser 64kb från klienten, resultatet - antalet faktiskt mottagna data int r \u003d är. Läs (BUF); // Skapa en sträng som innehåller informationen som tas emot från klienten Strängdata \u003d ny sträng (BUF, 0, R); // Lägg till data om socketadressen: Data \u003d "" + num + ":" + "\\ n" + data; // Visa data: OS. Skriv (data getbytes ()); // Fyll i anslutningen s. stänga (); ) Fånga (undantag e) (system. Ut. Println ("init fel:" + e);) // Uteslutning } }

Efter sammanställning mottar vi Samplerver.class och Sampleclient.class-filer (alla program här och sedan sammanställt med JDK v1.4) och starta servern först:

Java Samplerver och sedan väntar på inskriptionerna "-servern är igång", och ett antal kunder: Java Sampleclient Test1 Java Sampleclient Test2 ... Java Sampleclient Testn

Om under serverns uppstart, i stället för "servern är igång" -linjen utfärdat en typsträng

Init-fel: java.net.Bindy i bruk: JVM_Bind Det här kommer att ange att port 3128 på din dator är redan upptagen något program eller förbjudet att tillämpa säkerhetspolicyer.

Anteckningar

Vi noterar ett viktigt inslag i serverns uttag: den kan ta emot anslutningar omedelbart från flera kunder samtidigt. Teoretiskt är antalet samtidiga anslutningar obegränsat, men nästan allt vilar på datorns kraft. Förresten används detta problem med den slutliga kraften i datorer i DOS-attacker till servrar: de slänger dem helt enkelt av ett sådant antal anslutningar som datorer inte klarar av lasten och "fall".

I det här fallet visas jag på SimpleServer Exempel, hur man hanterar flera samtidiga anslutningar samtidigt: Socket på varje ny anslutning skickas till behandling av en separat datorström.

Det är värt att nämna att socket - servraraktiva abstraktions- och dataströmmar används med C / C ++, Perl, Python, många andra programmeringsspråk och API-operativsystem, så mycket av det som har tillämpats för att inte bara användas för Java-plattformen.

Det är dags att ansöka Erlang för sitt avsedda syfte - att genomföra nätverkstjänsten. Oftast görs sådana tjänster på grundval av en webbserver, ovanpå HTTP-protokollet. Men vi kommer att ta nivån nedan - TCP och UDP-uttag.

Jag antar att du redan vet hur nätverket är ordnat, vad är internetprotokoll, användardatagramprotokoll och överföringskontrollprotokoll. Detta ämne är mest känt för de flesta programmerare. Men om du av någon anledning missade det, måste du komma ikapp först och sedan återvända till den här lektionen.

UDP-uttag

Minns i allmänhet vad som är UDP:

  • kortmeddelanden överföringsprotokoll (datagram);
  • snabb leverans;
  • utan en konstant förbindelse mellan klienten och servern, utan tillstånd;
  • leverans av meddelanden och fraktsekvens är inte garanterad.

Gen_UDP-modulen används för att fungera med UDP.

Låt oss starta två noder och ställa in kommunikation mellan dem.

På den 1: a noden öppnar jag UDP på \u200b\u200bhamnen 2000:

1\u003e (OK, uttag) \u003d Gen_UDP: öppen (2000,). (OK, # port<0.587>}

Ringa upp gen_UDP: OPEN / 2, Passera portnumret och listan över alternativ. Listan över alla möjliga alternativ är ganska stora, men vi är intresserade av två av dem:

binär. - Uttaget är öppet i binärt läge. Alternativt kan uttaget öppnas i textläge genom att ange alternativet lista. Skillnaden i hur vi tolkar de data som erhållits från uttaget är som ett byteflöde eller som text.

(Aktiv, sant) - Uttaget är öppet i aktivt läge, då kommer data som kommer till uttaget att skickas i form av meddelanden i flödesboxen, socketägaren. Läs mer om detta nedan.

På 2: a noden, öppna UDP på \u200b\u200bhamnen 2001:

1\u003e (OK, uttag) \u003d Gen_UDP: öppen (2001,). (OK, # port<0.587>}

Och skicka ett meddelande från 1: a noden på 2: a:

2\u003e Gen_UDP: Skicka (uttag, (127,0,0,1), 2001,<<"Hello from 2000">\u003e). OK.

Ringa upp gen_UDP: Skicka / 4, Passera socklar, adress och port av mottagaren, och själva meddelandet.

Adressen kan vara ett domännamn i form av en sträng eller en atom, eller en IPv4-adress i form av en grupp av 4-tal, eller en IPv6-adress i form av en tavern av 8 nummer.

På 2: a noden ser vi till att meddelandet kom:

2> <0.587>,{127,0,0,1},2000,<<"Hello from 2000">\u003e) OK.

Meddelandet kommer i form av en avsmalning (UDP, Socket, SenderAddress, Senderport, Packet).

Skicka ett meddelande från 2: a noden till 1: a:

3\u003e Gen_UDP: Skicka (uttag, (127,0,0,1), 2000,<<"Hello from 2001">\u003e). OK.

I den 1: a noden kommer du att se att meddelandet kom:

3\u003e spola (). Shell fick (UDP, # port<0.587>,{127,0,0,1},2001,<<"Hello from 2001">\u003e) OK.

Som du kan se är allt enkelt.

Aktivt och passivt socketläge

OCH gen_udp., I. gen_TCP.Båda har en viktig miljö: arbetar med inkommande data. Det kan vara antingen aktivt läge (Aktiv, sant)eller passivt läge (Aktiv, falsk).

I aktivt läge mottar flödet inkommande paket i form av meddelanden i sin brevlåda. Och de kan erhållas och hanteras av samtalet till mottagaren, som alla andra meddelanden.

För UDP-uttag är det här meddelanden i formuläret:

(UDP, Socket, SenderAddress, Senderport, Packet)

vi har redan sett dem:

(UDP, # port<0.587>,{127,0,0,1},2001,<<"Hello from 2001">>}

För TCP-uttag Liknande meddelanden:

(TCP, uttag, paket)

Det aktiva läget är lätt att använda, men det är farligt att klienten kan överföra kön av flödesmeddelanden, avgasminne och koppla in koden. Därför rekommenderas passivt läge.

I passivt läge måste data hämta samtalen gen_udp: recv / 3 och gen_TCP: RECV / 3:

Gen_UDP: recv (uttag, längd, timeout) -\u003e (OK, (adress, port, paket)) | (Fel, anledning) Gen_TCP: recv (uttag, längd, timeout) -\u003e (OK, paket) | (Fel, anledning)

Här påpekar vi hur många databytor vill läsa från uttaget. Om det finns dessa data får vi dem omedelbart. Om inte, blockeras samtalet tills en tillräcklig mängd data kommer. Du kan ange timeout för att inte blockera strömmen under lång tid.

Men, gen_UDP: recv. Ignorera argumentlängden och returnerar alla data som finns i uttaget. Eller är blockerad och väntar på data om det inte finns något i uttaget. Det är inte klart varför längden är närvarande på API.

För gen_TCP: recv. Längdsargumentet fungerar som det borde. Om inte alternativet anges. (Paket, storlek)som kommer att diskuteras nedan.

Det finns också ett alternativ (Aktiv, Oce). I det här fallet startar uttaget i det aktiva läget, det tar emot det första datapaketet som ett meddelande och stängs omedelbart till passivt läge.

TCP-uttag

Minns i allmänhet vad TCP är:

  • pålitligt dataöverföringsprotokoll garanterar meddelande leverans och frakt order;
  • klientens och serverns permanenta anslutning har ett tillstånd;
  • ytterligare överliggande installation och stängning av anslutning och dataöverföring.

Det bör noteras att det är länge att hålla konstanta förbindelser med många tusentals kunder. Alla anslutningar ska fungera oberoende av varandra, vilket innebär - i olika strömmar. För många programmeringsspråk (men inte för Erlang) är ett allvarligt problem.

Det är därför som HTTP-protokollet är så populärt, som, även om det fungerar ovanpå TCP-uttaget, men innebär en kort interaktionstid. Detta möjliggör ett relativt litet antal strömmar (tiotals hundratals) för att betjäna ett betydligt större antal kunder (tusentals, tiotusentals).

I vissa fall är det fortfarande behovet av att ha långlivade permanenta anslutningar mellan klienten och servern. Till exempel, för chattar eller för multiplayer-spel. Och här har Erlang få konkurrenter.

Att arbeta med TCP använder Gen_TCP-modulen.

Att arbeta med TCP-uttag är mer komplicerat än med UDP. Vi har kundens roll och servern som kräver olika genomförande. Tänk på versionen av serverns implementering.

Modul (server). -Export (). Start () -\u003e Start (1234). Start (port) -\u003e SPAGN (? Modul, server,), OK. Server (port) -\u003e IO: Format ("Start server vid port ~ P ~ n",), (OK, Listensocket) \u003d Gen_TCP: Lyssna (hamn),) || Id<- lists:seq(1, 5)], timer:sleep(infinity), ok. accept(Id, ListenSocket) -> IO: Format ("Socket # ~ P Vänta på klienten ~ n",), (OK, _Socket) \u003d Gen_TCP: Acceptera (Listensocket), IO: Format ("Socket # ~ P, Session Startat ~ N",), Handle_Connection (ID, Listensocket). Handtag_Connection (ID, Listensocket) -\u003e Ta emot (TCP, Socket, MSG) -\u003e IO: Format ("Socket # ~ P har meddelande: ~ P ~ n",), Gen_TCP: Skicka (sockel, msg), Handtag, Listensocket ); (TCP_closed, _Socket) -\u003e

Det finns två typer av uttag: Lyssna uttaget. och Acceptera uttag.. Lyssna uttag en, det accepterar alla anslutningsförfrågningar. Acceptera uttaget behöver mycket, en för varje anslutning. Flödet i vilket socket skapas blir ägaren av uttaget. Om ägaren är klar stängs uttaget automatiskt. Därför skapar vi en separat ström för varje uttag.

Lyssna uttaget ska alltid fungera, och för detta bör dess flödesägare inte sluta. Därför B. server / 1. Vi lade till ett samtal timer: Sova (oändlighet). Det kommer att blockera strömmen och låt det inte vara klart. En sådan realisering, naturligtvis, utbildning. För gott skick måste du tänka möjligheten att stoppa servern korrekt, men här är det inte.

Acceptera uttag och ström för att det kan skapas dynamiskt, eftersom kunderna visas. I början kan du skapa en sådan ström, ring den gen_TCP: Acceptera / 1 Och vänta på kunden. Denna utmaning blockerar. Den är klar när klienten visas. Därefter kan du behålla den aktuella klienten i den här strömmen och skapa en ny tråd som väntar på en ny klient.

Men här har vi ett annat genomförande. Vi skapar en pool av flera strömmar i förväg, och de väntar alla på kunder. Efter avslutad arbetet med en klient stänger inte uttaget, men väntar på en ny. Således, istället för att ständigt öppna nya socklar och stänga den gamla, använder vi en pool av långlivade uttag.

Det är effektivare med ett stort antal kunder. Först på grund av det faktum att vi är snabbare tar föreningar. För det andra, på grund av det faktum att vi mer noggrant hanterar uttag som en systematisk resurs.

Trådar tillhör Erland-noden, och vi kan skapa dem så mycket som du vill. Men uttag hör till operativsystemet. Deras nummer är begränsat, även om det är ganska stort. (Vi pratar om gränsen på antalet filbeskrivningar, som operativsystemet låter dig öppna en användarprocess, vanligtvis 2 10 - 2 16).

Storleken på poolen Vi har leksak - 5 par flödesuttag. Verkligen behöver en pool av flera hundra sådana par. Det skulle vara trevligt att kunna öka och minska denna pool i runtime för att anpassa sig till den aktuella belastningen.

Den aktuella sessionen med klienten behandlas i funktionen hANDLE_CONNECTION / 2.. Det kan ses att socket fungerar i aktivt läge, och tråden får en vy (TCP, Socket, MSG)var Msg. - Det här är binära data som kom från klienten. Dessa data vi förgiftar tillbaka till klienten, det vill säga, vi implementerar en banal ekoservice :)

När klienten stänger anslutningen mottar flödet ett meddelande (TCP_Closed, _Socket)återvänder tillbaka till acceptera / 2. Och väntar på nästa klient.

Här är vad arbetet med en sådan server med två telnetklienter ser ut som:

$ Telnet localhost 1234 försöker 127.0.0.1 ... ansluten till localhost. Escape Character är "^]". Hej från Client 1 Hej från Client 1 Några meddelanden från klienten 1 Ett meddelande från klienten 1 Nytt meddelande från klient 1 Nytt meddelande från klient 1 Klient 1 kommer att stänga anslutning Klient 1 kommer att stänga anslutning ^] Telnet\u003e Avsluta anslutningen stängd.

$ Telnet localhost 1234 försöker 127.0.0.1 ... ansluten till localhost. Escape Character är "^]". Hej från Client 2 Hej från klient 2 Meddelande från klient 2 Meddelande från Client 2 Client 2 är fortfarande aktiv klient 2 är fortfarande aktiv men klient 2 är fortfarande aktiv men klient 2 är fortfarande aktiv och nu klient 2 kommer att stänga anslutningen och nu klienten 2 kommer att stänga anslutningen ^] Telnet\u003e Avsluta anslutningen stängd.

2\u003e Server: Start (). Start-server i port 1234 OK Socket # 2 Vänta på klientuttag # 4 Vänta på klientuttag # 5 Vänta på klientuttag # 1, Session Startat uttag # 1 Fick Meddelande:<<"hello from client 1\r\n">\u003e Socket # 1 Fick meddelande:<<"some message from client 1\r\n">\u003e Socket # 2, session startade socket # 2 fick meddelande:<<"hello from client 2\r\n">\u003e Socket # 2 fick meddelande:<<"message from client 2\r\n">\u003e Socket # 1 Fick meddelande:<<"new message from client 1\r\n">\u003e Socket # 2 fick meddelande:<<"client 2 is still active\r\n">\u003e Socket # 1 Fick meddelande:<<"client 1 is going to close connection\r\n">\u003e Socket # 1, Session Stängt uttag # 1 Vänta på Client Socket # 2 Fick Meddelande:<<"but client 2 is still active\r\n">\u003e Socket # 2 fick meddelande:<<"and now client 2 is going to close connection\r\n">\u003e Socket # 2, Session Stängt uttag # 2 Vänta på klient

Server i passivt läge

Det är bra, men en bra server ska fungera i passivt läge. Det vill säga det ska ta emot data från kunden som inte är i form av meddelanden i brevlådan, utan genom att ringa gen_TCP: RECV / 2.3.

Nuance är att här måste du ange hur mycket data vi vill läsa. Och var kan servern veta hur mycket kunden skickade honom? Tja, tydligen måste klienten själv säga hur mycket data det kommer att skicka. För att göra detta skickar klienten först ett litet verktygspaket, vilket indikerar storleken på data och sedan skickar själva data.

Nu måste du bestämma hur mycket byte ska ta detta servicepaket. Om det är 1 byte är det omöjligt att packa numret mer än 255. I 2 byte kan du packa nummer 65535, i 4 byte 4294967295. 1 byte, självklart är inte tillräckligt. Det är troligt att klienten måste skicka data mer än 255 byte. Huvudet i 2 byte är ganska lämplig. Huvudet i 4 byte behövs ibland.

Så skickar klienten ett servicepaket med 2 byte i storlek, där det indikeras hur mycket data som kommer att följa den, och sedan själva dessa data:

Msg \u003d.<<"Hello">\u003e, Storlek \u003d byte_size (msg), header \u003d<\u003e, Gen_TCP: Skicka (uttag,<

>),

Full klientkod:

Modul (Client2). -Export (). Start () -\u003e Start ("Localhost", 1234). Start (värd, port) -\u003e SPAGN (? Modul, klient,). Skicka (PID, MSG) -\u003e PID! (Skicka, Msg), OK. STOPP (PID) -\u003e PID! Sluta, ok. Klient (värd, port) -\u003e IO: Format ("Klient ~ P Ansluts till ~ P: ~ P ~ n",), (OK, Socket) \u003d Gen_TCP: Anslut (värd, port,), slinga (uttag). Loop (socket) -\u003e ta emot (skicka, msg) -\u003e io: format ("klient ~ p skicka ~ p ~ n",), storlek \u003d byte_size (msg), header \u003d<\u003e, Gen_TCP: Skicka (uttag,<

\u003e), Slinga (uttag); (TCP, Socket, MSG) -\u003e IO: Format ("Klient ~ p har meddelande: ~ p ~ n",), slinga (uttag); STOPP -\u003e IO: Format ("Klient ~ p stängs anslutning och slutar ~ n",), Gen_TCP: Stäng (uttag) efter 200 -\u003e Loop (socket) End.

Servern läser först 2 byte, bestämmer storleken på data och läser sedan alla data:

(OK, rubrik) \u003d Gen_TCP: RECV (uttag, 2),<\u003e \u003d Header, (OK, MSG) \u003d Gen_TCP: recv (uttag, storlek),

I serverkodskoden start / 0. och start/1. Inte förändrats, resten har förändrats lite:

Server (port) -\u003e IO: Format ("Start server vid port ~ P ~ n",), (OK, Listensocket) \u003d Gen_TCP: Lyssna (hamn),) || Id<- lists:seq(1, 5)], timer:sleep(infinity), ok. accept(Id, ListenSocket) -> IO: Format ("Socket # ~ P Vänta på klienten ~ n",), (OK, Socket) \u003d Gen_TCP: Acceptera (Listensocket), IO: Format ("Socket # ~ P, Session startade ~ n",), Handle_Connection (ID, Listensocket, Socket). Handtag_Connection (ID, Listensocket, Socket) -\u003e Case Gen_TCP: recv (socket, 2) av (OK, rubrik) -\u003e<\u003e \u003d Header, (OK, MSG) \u003d Gen_TCP: recv (uttag, storlek), io: format ("socket # ~ p har meddelande: ~ p ~ n",), gen_tcp: skicka (socket, msg), handtag_connection ( ID, Listensocket, Socket); (Fel, stängt) -\u003e io: format ("socket # ~ p, session stängd ~ n",), acceptera (ID, Listensocket) slutet.

Ett exempel på en session från klienten:

2\u003e PID \u003d Client2: Start (). Klient.<0.40.0> Ansluts till "localhost": 1234<0.40.0> 3\u003e Client2: Skicka (PID,<<"Hello">\u003e). Klient.<0.40.0> Skicka.<<"Hello">\u003e OK klient.<0.40.0> Fick meddelande:<<"Hello">\u003e 4\u003e Client2: Skicka (PID,<<"Hello again">\u003e). Klient.<0.40.0> Skicka.<<"Hello again">\u003e OK klient.<0.40.0> Fick meddelande:<<"Hello again">\u003e 5\u003e Client2: Stopp (PID). Klient.<0.40.0> Stänger anslutningen och slutar OK

Och från serverns sida:

2\u003e Server2: Start (). Start-server i port 1234 OK Socket # 2 Vänta på klientuttag # 4 Vänta på klientuttag # 5 Vänta på klientuttag # 1, Session Startat uttag # 1 Fick Meddelande:<<"Hello">\u003e Socket # 1 Fick meddelande:<<"Hello again">\u003e Socket # 1, Session Stängt uttag # 1 Vänta på klient

Allt detta är bra, men i själva verket är det inte nödvändigt att manuellt hantera huvudpaketet. Detta är redan implementerat i gen_TCP.. Du måste ange storleken på servicepaketet i inställningarna när du öppnar ett uttag på klientsidan:

(OK, Socket) \u003d Gen_TCP: Anslut (värd, port,),

och på serverns sida:

(OK, Listensocket) \u003d Gen_TCP: Lyssna (hamn),

och behovet av att bilda sig och demontera dessa rubriker försvinner.

På klientsidan förenklar sändning:

Gen_TCP: Skicka (socket, msg),

och på serversidan förenklar kvittot:

Handtag_Connection (ID, Listensocket, Socket) -\u003e Case Gen_TCP: RECV (Socket, 0) av (OK, MSG) -\u003e IO: Format ("Socket # ~ P har meddelande: ~ P ~ n",), Gen_TCP: Skicka (Socket, MSG), HANDLE_CONNECTION (ID, Listensocket, Socket); (Fel, stängt) -\u003e io: format ("socket # ~ p, session stängd ~ n",), acceptera (ID, Listensocket) slutet.

Nu när du ringer gen_TCP: RECV / 2 Vi anger längd \u003d 0. gen_TCP. Han vet hur mycket byte du behöver läsa från uttaget.

Arbeta med textprotokoll

Förutom alternativet med en servicehuvud, finns det ett annat tillvägagångssätt. Du kan läsa från uttaget en efter en tills den speciella byten är uppfylld och symboliserar slutet på förpackningen. Det kan vara en nollbyte eller en strängöversättningssymbol.

Det här alternativet är typiskt för textprotokoll (SMTP, POP3, FTP).

Skriv din realisering av läsning från uttaget är inte nödvändigt, allt är redan implementerat i gen_TCP.. Du behöver bara ange i socketinställningar istället (Paket, 2) alternativ (Paket, linje).

(OK, Listensocket) \u003d Gen_TCP: Lyssna (hamn),

Resten av serverkoden förblir oförändrad. Men nu kan vi återvända till Telnet-klienten igen.

$ Telnet localhost 1234 försöker 127.0.0.1 ... ansluten till localhost. Escape Character är "^]". Hej hej hej igen hej igen ^] Telnet\u003e Avsluta anslutningen stängd.

TCP-server, Text Protocol och Telnet-klienten behöver vi i terminaltycke.

35 svar

Sammanfattning

TCP-uttaget är en slutpunktsinnehållDefinierad av IP-adressen och porten i samband med en specifik TCP-anslutning eller auditionsstatus.

Port är en virtualiseringsidentifierarebestämma slutpunkten för tjänsten (i motsats till slutpunkten för tjänsten eller dess sessionidentifierare).

TCP-uttaget är inte anslutetDetta är slutpunkten för en viss anslutning.

Det kan finnas parallella anslutningar till slutpunkten för tjänsten.Eftersom anslutningen identifieras både lokala och fjärranslutningspunkter, vilket gör det möjligt för trafiken att dirigera till en specifik förekomst av tjänsten.

För denna kombination av adresser och portar kan det bara finnas en lyssnarkontakt.

Utläggning

Det var en intressant fråga som fick mig att ompröva några saker som jag trodde att jag visste inuti. Du skulle tro att ett sådant namn, som ett "uttag", det skulle beviljas: Det var uppenbart att det valdes att utlösa slutpunkten som du ansluter en nätverkskabel, det finns starka funktionella paralleller. Men på nätverksspråket bär ordet "uttag" så mycket bagage som det är nödvändigt att noggrant ompröva.

I bredaste bemärkelse är hamnen entrépunkten eller utgången. Den franska ordet Porte, men inte som används i nätverkskontexten, betyder bokstavligen dörren eller gatewayen, som återigen betonar det faktum att hamnarna är transportändpunkter, oavsett om du skickar data eller stora stålbehållare.

För denna diskussion kommer jag att begränsa övervägandet av sammanhanget med TCP-IP-nätverk. OSI-modellen är mycket bra, men har aldrig genomförts fullt ut, och ännu mer utplacerad under högspänningsförhållanden med hög trafik.

Kombinationen av IP-adressen och porten är strängt känd som slutpunkten och kallas ibland uttag. Denna användning är associerad med RFC793, den ursprungliga TCP-specifikationen.

TCP-anslutningen bestäms av två ändpunkter av AKA-uttag.

Slutpunkten (uttaget) bestäms av kombinationen av nätverksadressen och portidentifieraren. Observera att adressen / porten inte helt identifierar uttaget (mer om detta senare).

Portuppgift är att skilja mellan flera slutpunkter på en angiven nätverksadress. Det kan sägas att hamnen är en virtualiserad slutpunkt. Denna virtualisering gör flera parallella anslutningar på samma nätverksgränssnitt.

Detta är ett par socklar (4-tuple bestående av en IP-adress för klienten, klientportnumret, serverns IP-adress och serverns portnummer), vilket indikerar två ändpunkter som entydigt identifierar varje TCP-anslutning till Internet. (TCP-IP-illustrerad volym 1, W. Richard Stevens)

På de flesta språk baserade på C installeras och bearbetas TCP-anslutningar med användning av metoder i socket-klassen. Även om det är vanligt att arbeta på en högre abstraktionsnivå, är det vanligtvis en förekomst av NetworkStream-klassen, det ger vanligtvis en referens till socketobjektet. Till kodaren verkar detta socketobjekt vara en anslutning, eftersom anslutningen är skapad och styrd med hjälp av metoderna för socketobjektet.

I C # För att installera en TCP-anslutning (till en befintlig lyssnare) skapar du först TCPClient. Om du inte anger slutpunkten för TCPClient Constructor använder den standardvärdena - ett eller annat sätt är den lokala ändpunkten bestämd. Då ringer du till CONNECT-metoden på den skapade instansen. Denna metod kräver en parameter som beskriver en annan slutpunkt.

Allt detta förvirrar lite och får dig att tro att uttaget är en anslutning som blockerar. Jag arbetade under detta missförstånd tills Richard Dorman frågade frågan.

Efter att ha gjort mycket läsning och tänkande, är jag nu övertygad om att det skulle vara mycket klokare att ha en TCPConnection-klass med en designer som tar två argument: localendagpoint och remotendpoint. Du kan förmodligen stödja ett Remotendpoint-argument när standardvärdena är tillåtna för den lokala ändpunkten. Detta är tvetydigt för multisoliga datorer, men tvetydighet kan lösas med hjälp av routingtabellen genom att välja ett gränssnitt med den kortaste vägen till fjärranslutningspunkten.

Klarhet kommer att förbättras i andra avseenden. Socket identifieras inte med kombinationen av IP-adressen och porten:

[...] TCP demultiplexer Inkommande segment med alla fyra värden som innehåller lokala och externa adresser: Mottagare IP-adress, destinationsportnummer, källa IP-adress och källportnummer. TCP kan inte bestämma vilken process det inkommande segmentet tar emot, bara tittar på destinationsporten. Dessutom är de enda [olika] ändpunkterna i [det här portnumret], som kommer att få inkommande anslutningsförfrågningar, en i auditionsstaten. (P255, TCP-IP illustrerad volym 1, W. Richard Stevens)

Som du kan se är det inte lätt, men det är troligt att nätverkstjänsten har många uttag med samma adress / port, men bara en socket lyssnare i en viss kombination av adresser / portar. Typiskt biblioteksimplementering är en klass av uttag, en förekomst som används för att skapa och styra anslutningen. Det är extremt misslyckat eftersom det orsakar förvirring och ledde till en bred kombination av två begrepp.

Hagraval tror inte på mig (se kommentarer), så här är ett riktigt prov. Jag anslutde en webbläsare till http://dilbert.com och lanserade sedan NetStat -an -P-TCP. De sista sex raderna av produktionen innehåller två exempel som adresserna och porten inte räcker för att unikt identifiera uttaget. Det finns två olika föreningar mellan 192.168.1.3 (min arbetsstation) och 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.23241 54.252.94.236:80 SYN_SENT TCP 192.168.1.3:63242 207.38.110.62:63243 207.38.110.6243 Syn_Sent TCP 192.168 .1.3: 64161 65.54.225.168:443 Etablerade

Eftersom uttaget är slutpunkten för anslutningen, finns det två uttag med en kombination av adresser / portar 207.38.110.62:80 och ytterligare två med en kombination av adresser / portar 54.252.94.236:80.

Jag tror att den felaktiga förståelsen av hagravale uppstår från min mycket noggranna användning av ordet "identifierar". Jag menar "helt, otvetydigt och entydigt identifiera." Ovanstående exempel har två slutpunkter med en kombinationsadress / port 54.252.94.236:80. Om du har adress och port, har du ingen information om att dela dessa kontakter. Inte tillräckligt med information för att identifiera uttaget.

Tillägg

I andra stycket, den andra avsnittet 2.7 RFC793 säger:

Anslutningen bestäms fullständigt av ett par socklar i ändarna. Det lokala uttaget kan delta i många anslutningar med olika utländska socklar.

Denna definition av ett uttag är inte användbart när det gäller programmering, eftersom den inte sammanfaller med socketobjektet, vilket är slutpunkten för en specifik anslutning. För en programmerare, och det mesta av denna publik är en programmerare, är det en viktig funktionell distinktion.

Länkar

    TSP-IP Illustrerad volym 1 Protokoll, W. Richard Stevens, 1994 Addison Wesley

    Uttag Det är en anslutning mellan två nätverksapplikationer. Dessa två applikationer fungerar nominellt på olika datorer, men uttag kan också användas för interprocessing interaktion på en dator. Applikationer kan skapa flera uttag för kommunikation med varandra. Socketsna är dubbelriktad, vilket innebär att båda sidor av anslutningen kan skicka och ta emot data. Därför kan socket skapas teoretiskt på vilken nivå som helst av OSI-modellen från 2 uppåt. Programmerare använder ofta socklets i nätverksprogrammering, även om det är indirekt. Programmeringsbibliotek, som Winsock, döljer många program med låg nivåuttag. Socklarna används i stor utsträckning sedan början av 1980-talet.

    Hamn Det är en ändlig punkt eller "kanal" för en nätverksanslutning. Portnummer tillåter olika applikationer på en dator för att använda nätverksresurser utan att störa varandra. Portnummer är vanligast i nätverksprogrammering, särskilt i programmeringsuttag. Ibland blir dock portnummer synliga för en slumpmässig användare. Till exempel, vissa webbplatser som en person besöker på Internet använder följande webbadress:

    Med någon analogi

    Även om för socetov Det var redan mycket tekniskt detaljer... Jag skulle vilja lägga till mitt svar, bara i fallet om någon fortfarande inte kan känna skillnaden mellan IP, hamn och uttag

    Tänk på servern S.,

    och låt oss säga man x, y, z Behöver en tjänst (säg, chatt service) från detta server S.

    IP-adressen sägerwHO? Den chatt servern "s", med vilken x, y, z vill kontakta

    tja, du har "WHO SERVER"

    men antar att "s" -servern också ger några andra tjänster till andra människor, säger "S" ger lagringstjänster för personer A, B, C

    hamnen säger ---> vilken? Tjänsten som du (x, y, z) behövs, d.v.s. Chattstjänst, inte lagringstjänst

    okej .., du gör servern vet att du behöver en chattjänst, inte lagring

    tre år gammal, och servern kanske vill identifiera alla tre olika

    kommer uttag

    nu socket sägervad? Betonganslutning

    det är, låt oss säga

    uttag 1 för man x

    socket 2 för man y

    och uttag 3 för man z

    Jag hoppas att det hjälper någon som fortfarande var förvirrad :)

    Först tror jag att vi måste börja med en liten förståelse för det som gör det möjligt att ta emot ett paket från A till B.

    Den allmänna definitionen för nätverket är användningen av OSI-modellen, som delar nätverket med flera lager enligt syftet. Det finns flera viktiga saker som vi kommer att se här:

    • Dataöverföringskanalnivå. Denna nivå är ansvarig för att ta emot datapaket från en nätverksenhet till en annan och är något högre än den nivå som faktiskt sänder. Han pratar om MAC-adresser och vet hur man hittar värdar baserat på deras Mac (hårdvaruadress), men inte mer.
    • Nätverksnivå är en nivå som låter dig överföra data på maskiner och via fysiska gränser, till exempel fysiska anordningar. Nätverksnivån måste i huvudsak upprätthålla en ytterligare mekanism baserat på adressen, vilket på något sätt är förknippad med den fysiska adressen; Ange IP-adressen (IPv4). IP-adressen kan få ditt paket från A till B via Internet, men inget vet hur man passerar enskilda flygningar. Detta behandlas av nivån ovan i enlighet med routningsinformationen.
    • Transportnivå. Denna nivå är ansvarig för att bestämma metoden för att erhålla information från A till B och eventuella restriktioner, kontroller eller fel i detta beteende. Till exempel lägger TCP ytterligare information till paketet, så du kan mata ut om paketen förlorades.

    TCP innehåller bland annat begreppet hamnar. Dessa är faktiskt olika slutpunktsdatapunkter på samma IP-adress till vilken Internetuttag (AF_INET) kan bifogas.

    Kort kort svar.

    A. hamn kan beskrivas som Intern adress Inuti värden, som identifierar programmet eller processen.

    A. Uttag. kan beskrivas som Programgränssnitttillåter programmet att kommunicera med andra program eller processer på Internet eller lokalt.

    Som regel får du mycket teoretiskt, men ett av de enklaste sätten att skilja mellan dessa två begrepp är som följer:

    För att få en tjänst behöver du ett servicenummer. Detta servicenummer kallas hamnen. Precis så.

    Till exempel körs HTTP som en tjänst på port 80.

    Nu kan många begära en tjänst, och anslutningen till klientservern är inställd. Det kommer att finnas många anslutningar. Varje anslutning representerar klienten. För att stödja varje anslutning skapar servern ett uttag för varje anslutning för att stödja din klient.

    Det verkar som om det finns många svar som jämför ett uttag med en förening mellan två datorer. Jag tycker att det är helt fel. Socket har alltid varit en slutpunkt per dator, som kan vara eller inte anslutna - vi använde alla mottagaren eller UDP-uttagen * vid någon tidpunkt. Den viktiga delen ligger i det faktum att det är adresserbart och aktivt. Skicka ett meddelande till fil 1.1.1.1:1234 är osannolikt att fungera, eftersom det inte finns någon uttag för denna slutpunkt.

    Uttagen är specifika för protokollet - därför är genomförandet av unikhet att TCP / och UDP / Användning * (iPaddress: port), skiljer sig från, till exempel IPX (nätverk, nod och ... spel, uttag - men en annan socket än under den allmänna termen "uttag". IPX-uttagsnummer motsvarar IP-portar). Men de erbjuder alla en unik adresserbar slutpunkt.

    Eftersom IP har blivit det dominerande protokollet har hamnen (i nätverksvillkor) blivit singulär med UDP- eller TCP-portnumret, vilket är en del av socketadressen.

    • UDP har ingen relation till anslutningen - det betyder att den virtuella kretsen mellan de två ändpunkterna aldrig skapas. Men som slutpunkten gäller vi fortfarande för UDP-uttag. API-funktionerna gör det klart att båda är helt enkelt olika typer av uttag. Sock_dGram är UDP (bara skicka ett meddelande) och Sock_Stream - TCP (skapa ett virtuellt schema).

      Tekniskt sett innehåller IP-rubriken en IP-adress, och protokollet över IP (UDP eller TCP) innehåller portnumret. Detta gör att du kan använda andra protokoll (till exempel ICMP, som inte har portnummer, men har information om IP-adressen).

      Det här är villkoren för två olika domäner: "Port" är ett koncept från TCP / IP-nätverk, "socket" - det här är en API (programmering). Socket är skapat (i kod), tar port, värdnamn eller nätverksadapter och kombinerar dem i den datastruktur som du kan använda för att skicka eller ta emot data.

      TCP-IP-anslutningar är dubbelriktade vägar som ansluter en adress: en kombination av portar med en annan adress: en kombination av portar. Därför, när du öppnar en anslutning från den lokala maskinen till porten på en fjärrserver (till exempel, www.google.com:80), associerar du också ett nytt portnummer på din dator med anslutning så att servern kan skicka saker Tillbaka till dig (till exempel 127.0.0.1:65234). Användbar att använda NetStat för att visa dina anslutningar med en dator:

      \u003e NetStat -NWP TCP (OS X) Aktiva Internetanslutningar Proto Recv-Q Skicka-Q Lokal adress Utländsk adress (stat) TCP4 0 0 0 192.168.0.6.49871 17.172.232.57.5223 Etablerade ...

      Socket är en speciell typ av filbeskrivare, som används av processen för att begära nätverkstjänster från operativsystemet. Socketadressen är trippel: (protokoll, lokaladress, lokalprocess), där den lokala processen identifieras av portnumret.

      I TCP / IP-uppsättningen, till exempel:

      (TCP, 193.44.234.3, 12345)

      Konversationen är en länk mellan två processer, vilket visar förhållandet mellan två. Föreningen är en 5-tuple, som helt definierar två processer som innehåller anslutningen: (protokoll, lokaladress, lokalprocess, utländsk adress, utländsk process)

      I TCP / IP-uppsättningen, till exempel:

      (TCP, 193.44.234.3, 1500, 193.44.234.5, 21)

      kan vara en tillåten förening.

      Semi-Association: (protokoll, lokal adress, lokal process)

      (Protokoll, utländsk adress, utländsk process)

      som bestämmer var och en hälften av föreningen.

      Semikalen kallas också uttag eller transportadress. Det vill säga uttaget är slutpunkten för kommunikation, som kan namnges och adresseras till nätverket. Socket-gränssnittet är ett av flera applikationsprogrammeringsgränssnitt (API) för kommunikationsprotokoll. Utvecklades som ett universellt programmeringskommunikationsgränssnitt, implementerades det först av UNIX 4.2BSD-systemet. Även om det inte var standardiserat blev det den faktiska industristandarden.

      Hamnen var den enklaste delen, det är bara en unik socketidentifierare. Socket är att processer kan använda för att upprätta anslutningar och kommunicera med varandra. Tall Jeff hade en utmärkt telefonanalogi som inte var perfekt, så jag bestämde mig för att fixa det:

      Applikationen består av ett par processer som utbyter data på nätverket (par av klient-server). Dessa processer skickar och tar emot meddelanden till nätverket och från det via programgränssnittet. uttag. Med tanke på analogi som presenteras i boken "Datornätverk: Approach Top Down". Det finns ett hus som vill kommunicera med ett annat hem. Här är huset liknar processen och dörrarna till utloppet. Sändningsprocessen förutsätter att det på andra sidan dörren finns en infrastruktur som kommer att sända data till destinationen. Så snart budskapet kommer å andra sidan, passerar den via mottagarens dörr (uttag) till huset (process). Denna illustration av samma bok kan hjälpa dig:

      Sockets är en del av en transportnivå som ger en logisk anslutning med applikationer. Det betyder att både noderna är direkt relaterade till varandra, även om det finns många routrar och / eller växlar mellan dem. Således är socket inte själva anslutningen, det här är slutpunkten för anslutningen. Transportnivåprotokollen implementeras endast på värdar och inte på mellanliggande routrar.
      Hamnar Ge medel för intern adressering för maskinen. Huvudmålet är att tillåta flera processer att skicka och ta emot data i nätverket utan störningar i andra processer (deras data). Alla uttag är utrustade med ett portnummer. När segmentet går in i värden utforskar transportnivån portnumret för segmentet av segmentet. Då översätter det segmentet till lämplig uttag. Denna inställning av dataleverans i transportlagssegmentet i rätt uttag kallas Demonstration. Därefter överförs segmentdata till processen som är fäst vid uttaget.

      Socket är strukturen i din programvara. Detta är mer eller mindre fil; Den har verksamhet som läsning och skrivning. Detta är inte en fysisk sak; Detta är ett sätt för din programvara att hänvisa till fysiska saker.

      Hamnen är en sak som liknar enheten. Varje värd har ett eller flera nätverk (fysiskt); Värd har en adress i varje nätverk. Varje adress kan ha tusentals portar.

      Endast ett uttag kan använda porten på. Socket fördelar porten ungefär samma sätt som valet av enheten för I / O-filsystem. Så snart porten är markerad kan ingen annan uttag ansluta till den här porten. Hamnen kommer att släppas när hylsan är stängd.

      Socket är en slutpunkt för den tvåvägskommunikationslinje mellan två program som körs på nätverket. Hylsan är bunden till portnumret, så TCP-nivån kan identifiera den ansökan för vilken data är utformad som ska skickas.

      Relativ TCP / IP-terminologi, som jag antar innebär denna fråga. Under en icke-specialist:

      Port är ett telefonnummer för ett specifikt hus i ett specifikt brevindex. Stadens postnummer kan ses som stadens IP-adress och alla hus i denna stad.

      Socket, å andra sidan, ser mer ut som ett telefonsamtal mellan telefonerna i ett par hus, pratar med varandra. Dessa samtal kan installeras mellan hus i en stad eller två hus i olika städer. Detta är den tillfälliga uppsatta vägen mellan två telefoner, som talar med varandra, vilket är uttag.

      Hamnen och uttaget kan jämföras med bankgrenen.

      Byggnumret "Bank" liknar IP-adressen. Banken har olika sektioner, till exempel:

      1. Institutionen för sparkontot
      2. Institutionen för personliga krediter
      3. Institutionen för hypotekslån
      4. Övervägande Division Klagomål

      Således är 1 (Institutionen för sparkonto), 2 (Institutionen för personliga krediter), 3 (Institutionen för bostadslån) och 4 (klagomål) hamnar.

      Låt oss nu säga att du går för att öppna ett sparkonto, du går till banken (IP-adress), då går du till "Institutionen för sparkonto" (portnummer 1), då möter du en av de anställda som arbetar i " Avdelningsbesparingskonto ". Låt oss ringa honom att sparaccount_employee1 för att öppna ett konto.

      Sparaccount_employee1 är din socketbeskrivare, så det kan vara från att spara laglig_employee1 för att räddaAccount_employeen. Det här är alla socketbeskrivare.

      På samma sätt kommer andra avdelningar att ha ett jobb under deras ledarskap, och de liknar uttaget.

      Uttaget är slutpunkten för kommunikation. Uttaget är inte direkt relaterat till TCP / IP-protokollfamiljen, den kan användas med vilket protokoll som stöds av ditt system. C-uttaget API förväntar dig att först få ett tomt uttagsobjekt från systemet, som då kan födas till den lokala uttaget (för att direkt få inkommande trafik till protokollen utan att upprätta en anslutning eller få inkommande anslutningsförfrågningar om protokollsorienterade anslutningar) eller att du kan ansluta till adressen till fjärrkontakten (för vilken typ av protokoll som helst). Du kan även göra både om du vill styra båda: den lokala uttagsadressen till vilken uttaget är bunden och adressen till fjärrkontakten till vilken uttaget är anslutet. För protokoll utan att upprätta anslutning är socketanslutningen även inte ens nödvändig, men om du inte gör det måste du också överföra destinationsadressen med varje paket som du vill skicka via uttaget, som annars, hur skulle hylsan Vet var du ska skicka den här data för? Fördelen är att du kan använda ett uttag för att skicka paket till olika socketadresser. När du har konfigurerat uttaget och kanske, även anslutit det, anser det vara en dubbelriktad kommunikationskanal. Du kan använda den för att överföra data till någon destination, och en annan destination kan använda den för att överföra dig till dig. Vad du skriver till uttaget skickas, men det som erhölls är tillgängligt för läsning.

      Å andra sidan är portarna vad som bara är vissa TCP / IP-protokoll. TCP- och UDP-paket har hamnar. Hamnen är bara ett nummer. Kombination av källans hamn och destinationsporten definierar kommunikationskanalen mellan de två värdarna. Till exempel kan du ha en server som ska vara en enkel HTTP-server, och en enkel FTP-server. Om ett paket nu kommer att ta itu med den här servern, hur kan det ta reda på om det här är ett paket för en HTTP- eller FTP-server? Tja, han kommer att veta hur HTTP-servern kommer att fungera på porten 80, och FTP-servern är på port 21, så om paketet går in i destinationsporten 80 är den avsedd för en HTTP-server och inte för FTP-servern. Paketet har också en källport, för utan en sådan portkälla kan servern endast ha en anslutning till en IP-adress i taget. Källporten tillåter servern att skilja identiska anslutningar: Alla har samma destinationsport, till exempel port 80, samma IP-adress för destinationen, alltid samma serveradress och samma källa IP-adress, eftersom de alla kommer Från samma klient, men eftersom de har olika källportar, kan servern skilja dem från varandra. Och när servern skickar svaren tillbaka, gör det med den hamn från vilken den mottagna förfrågan, så klienten kan också skilja olika svar som den tar emot.

      En port kan ha en eller flera kontakter anslutna till en annan extern IP-adress, till exempel till flera uttag.

      TCP 192.168.100.2:9001 155.94.246.179:39255 Upprättad 1312 TCP 192.168.100.2:9001 171.25.193.9:61832 Upprättad 1312 TCP 192.168.100.2:9001 178.62.19.226.100.2:9001 188.193.64.150.2:9001 188.193.64.150.2:9001 188.193.64.150.2:9001 188.193.64.150:40900 Etablerad 1312 TCP 192.168.100.2:9001 198.23.194.149:43970 Upprättad 1312 TCP 192.168.100.2:9001 198.49.73.11:38842 Upprättad 1312

      Socket är en abstraktion som tillhandahålls av kärnan till användarprogram för datainmatning / utgång. Typ av uttag bestäms av protokollet för dess bearbetning, IPC-bindning etc. Om någon skapar ett TCP-uttag kan det därför göra manipuleringar, till exempel att läsa data i uttag och spela in data på den med hjälp av enkla metoder och bearbeta det lägre nivåprotokollet, såsom TCP-transformationer och överföringspaket till lägre nätverksprotokoll utförs. De Implementering av uttaget i kärnan. Fördelen är att användaren inte behöver oroa sig för hur man hanterar specifika specifika protokoll, såväl som bara läser och skriver data till ett uttag som en vanlig buffert. Detsamma gäller när det gäller IPC, läser användaren helt enkelt och skriver data till uttaget, och kärnan behandlar alla detaljer på den lägre nivån beroende på vilken typ av det skapade uttaget.







2021. gtavrl.ru..