Hoppa yfir í efnið

Netkerfi: hvernig tölvur tala saman

Verkefnasafn

Þessi kafli hefur tilheyrandi verkefnasafn á fylgiþjóninum. Tólin og aðferðirner úr Linux-kaflanum geta komið að gagni. Sæktu safnið með

fetch networking

Í Linux-kaflanum prófuðum við að nota skelina til þess að eiga í einföldum samskiptum við netið, til dæmis með því að sækja gögn með curl. En hvað er eiginlega að gerast á bak við tjöldin? Hvernig „veit“ tölvan okkar hvar aðrar tölvur í heiminum eru niðurkomnar, og hvernig tekst henni að koma skilaboðum á áfangastað án þess að þau týnist á leiðinni?

Markmið þessa kafla er ekki að gera þig að sérfræðingi í netkerfum á einum degi, enda er það víðfemt efni sem fyllir margar þykkar bækur. Hins vegar ætlum við að byggja upp góða mynd af því hvernig tölvur tala saman og hvaða reglur gilda um „samtalið“. Þessi þekking er undirstaðan í öllu sem við gerum síðar, hvort sem það er að rannsaka vefveikleika eða tryggja öryggi eigin kerfa.


Hvað er netkerfi?

Í grunninn er netkerfi (e. network) einfaldlega hópur tækja sem eru tengd saman til þess að geta skipst á gögnum. Þessi tæki geta verið allt frá fartölvum og snjallsímum yfir í snjallperur, prentara og stóra netþjóna. Til þess að þessi tæki geti talað saman þurfum við sérhæfðan búnað eins og beina (e. routers) sem sjá um að vísa gögnunum á réttan stað.

Í einföldustu mynd lítur þetta svona út:

Tölvan þín  ───  beinir  ───  önnur tölva

Í raunveruleikanum er leiðin oft mun flóknari og liggur í gegnum fjölda beina og snúra víðs vegar um heiminn. Gögnin ferðast heldur ekki sem ein samfelld, risastór heild. Til þess að flutningurinn sé skilvirkur er gögnunum skipt niður í marga litla búta sem við köllum pakka (e. packets). Hver pakki inniheldur ekki bara hluta af gögnunum, heldur líka mikilvægar upplýsingar um hver sendandinn er og hvert pakkinn á að fara.


Netkerfislög

Tölvunetsamskipti eru ótrúlega flókið ferli. Til þess að hægt sé að halda utan um þessa flækju hafa tölvunarfræðingar skipt ferlinu upp í lög (e. layers). Hvert lag hefur sitt afmarkaða hlutverk og byggir ofan á lagið fyrir neðan það.

Algengt er að nota fimm laga líkan til að útskýra þetta. Hugsum okkur þetta eins og að senda bréf eða pakka í pósti:

Lag Samlíking við póst Spurning Dæmi
Notkunarlag (e. Application) Sjálft bréfið og tungumálið Hvað á að gera og hvaða reglur gilda? HTTP, DNS, SSH
Flutningslag (e. Transport) Ábyrgðarbréf (TCP) eða póstkort (UDP) Berst þetta örugglega og í réttri röð? TCP, UDP
Netlag (e. Network) Heimilisfangið á umslaginu Hvert á pakkinn að fara í heiminum? IP-tölur, beinar
Greinalag (e. Data Link) Póstbíllinn milli pósthúsa Hvernig tölum við við tæki nálægt okkur? Ethernet, Wi-Fi
Bitaflutningslag (e. Physical) Vegir, brýr og teinar Hvernig fara bitarnir líkamlega milli tækja? Kaplar, ljósleiðarar

Þessi skipting gerir það að verkum að sá sem býr til vefsíðu (á notkunarlagi) þarf ekki að hafa neinar áhyggjur af því hvort gögnin ferðast yfir ljósleiðara eða Wi-Fi (á bitaflutningslagi). Kerfið sér um að brúa bilið á milli laganna.


Staðarnet og internetið

Við skiptum netkerfum gjarnan í tvo meginflokka eftir stærð þeirra:

  1. Staðarnet (e. local area network, LAN): Þetta er netið sem þú notar heima hjá þér, í skólanum eða á vinnustaðnum. Það nær yfir stutta vegalengd og tengir saman tæki sem eru nálægt hvert öðru.
  2. Internetið: Þetta er risastórt „net netanna“. Það tengir saman milljónir staðarneta um allan heim og gerir okkur kleift að eiga samskipti við tæki í öðrum heimsálfum jafn auðveldlega og við tæki í næsta herbergi.

IP-tölur

Til þess að hægt sé að senda gögn á réttan áfangastað þarf hvert tæki á netinu að hafa einstakt auðkenni eða vistfang (e. address). Þetta auðkenni köllum við IP-tölu (e. IP address). Hægt er að hugsa um hana eins og heimilisfang tölvunnar.

Í dag eru tvenns konar IP-tölur í notkun, þ.e. IPv4 og IPv6.

IPv4

IPv4 er samskiptastaðall sem á rætur sínar að rekja til árdaga Internetsins og enn í dag fer megnið af umferð Internetsins fram með þeim staðli. IP-tölur í IPv4 eru 32 bitar, en þær eru oftast framsettar sem fjögur bæti í tugakerfinu (tölur frá 0 upp í 255), með punkti á milli, t.d. 93.184.216.34.

Þar sem IP-tolur samanstanda af 32 bitum, er fjöldi vistfanga í IPv4 kerfinu \(2^{32}\), sem eru u.þ.b. 4.3 milljarðar. U.þ.b. 300 milljón vistföng eru frátekin fyrir ákveðna virkni, og því eru um fjórir milljarðar IPv4 vistfanga í boði á Internetinu.

Til að skoða með hvaða IP-tölu við tengjumst Internetinu getum við prófað að keyra

curl http://ipconfig.me

IPv6

Eftir að Internetið fór að ryðja sér til rúms, upp úr 1990, kom fljótlega í ljós að þörf væri á fleiri vistföngum en þeim fjórum milljörðum sem IPv4 býður upp á. Því var brugðið á það ráð að hanna nýjan samskiptastaðal, IPv6, sem notast við 128 bita vistföng. Fjöldi vistfanga í boði með IPv6 eru þá u.þ.b. 430 sextiljónir, í kringum \(10^{36}\), sem nægir til að gefa öllum tölvum, símum, brauðristum, ísskápum, ljósaperum og öllum öðrum nettengdum tækjum sína eigin IP-tölu, og gott betur en það. Til að setja þennan fjölda í samhengi, þá ef við tækjum frá milljarð vistfanga á hverri sekúndu, myndi það taka okkur 10 trilljarða (\(10^{22}\)) ára að klára þau öll.

Innleiðing IPv6 hefur þó gengið hægt fyrir sig. T.a.m. hefur IPv6 ekki verið innleitt af íslenskum þjónustuveitendum. Við getum þó prófað ýmislegt sem tengist IPv6 á fylgiþjóninum, þar sem hann styður IPv6. Til að skoða hvaða IP-tölu fylgiþjónninn hefur á IPv6, getum við keyrt

curl -6 http://ipconfig.me

Opinber og einkavistföng

Eins og fram kom að ofan, þá er hluti vistfanga frátekinn af ýmsum ástæðum. Einn hlutinn er frátekinn fyrir notkun á staðarnetum og kallast sá hluti einkavistföng (e. private addresses). Það eru IP-tölur sem hafa sniðið 192.168.x.x eða 10.x.x.x.

Annar hluti vistfanga sem er frátekinn eru svoköllu sjálfvísunarvistföng (e. loopback address), sem eru á sniðinu 127.x.x.x. Þessi vistföng vísa öll á tölvuna sjálfa, en algengast er að notast við vistfangið 127.0.0.1 til að vísa í sjálfa tölvuna.

Auk sjálfvísunar- og einkavistfanga eru nokkrir smærri hlutar fráteknir í viðbót sem við förum ekki út í hér. Öll vistföng, umfram þessi fráteknu, kallast opinber vistföng (e. public addresses) og eru það IP-tölur sem eru sýnilegar öllu Internetinu. Allir þjónar sem hýsa vefi og aðrar þjónustur verða að hafa opinbera IP-tölu svo hægt sé að eiga samskipti við þá yfir Internetið.

Hvernig getur tölva sem er á staðarneti talað við Internetið, fyrst hún er ekki með opinbert vistfang? Það er hér sem netnúmerstúlkun (e. Network Address Translation, NAT) kemur til sögunnar. Beinirinn þinn talar við Internetið fyrir hönd allra tækjanna á heimilinu. Hann fær eina opinbera IP-tölu frá þjónustuveitanda og deilir henni á milli allra tækjanna.

Einkavistfangið mitt

Ef við prófum að keyra

ip addr
á heimatölvunni er mjög líklegt að rekast á IP-tölu á sniðinu 192.168.x.x (leitaðu í frálaginu að línum sem byrja á inet). Þar sem heimatölvur tengjast ekki internetinu beint, heldur tengjast netbeini sem býr til einkanet, þá sjáum við þessa tölu. Aftur á móti, ef við keyrum þessa skipun á fylgiþjóninum, fáum við IP-tölu þjónsins á Internetinu, þar sem hann er ekki hluti af einkaneti, heldur tengist Internetinu beint.


Hýsisnöfn og lén

Til að eiga samskipti við aðrar tölvur þurfum við vistföng þeirra, en við notum vistföngin sjaldnast beint til að vísa í þær. Þess í stað notum við hýsisnöfn (e. hostnames), sem eru nöfn sem við gefum tækjum sem eru tengd netum, þ.e.a.s. hýsisnafn er nafn sem vísar á vistfang.

Að vísa í hýsisnöfn hefur ýmsa kosti framyfir að vinna með vistföngin beint. Það er töluvert auðveldara að muna hýsisnöfn en vistföng, en hýsisnöfnin hafa einnig þann kost að hægt er að breyta hvert þau vísa, ef ákveðið er að færa þjónstu frá einum þjóni yfir á annan.

Lén (e. domain names) eru í raun bara skipulögð hýsisnöfn á internetinu sem auðvelt er að muna, eins og google.is eða framhaldsskoli.is.

En þá er vert að spyrja hvar eru þessar vísanir geymdar?

Skráin /etc/hosts: þín eigin símaskrá

Áður en Internetið varð jafn stórt og það er í dag, geymdi hver tölva hreinlega lista yfir öll hýsisnöfn í sérstakri skrá. Þessi skrá er enn til staðar í öllum tölvum (Linux, macOS og jafnvel Windows) og heitir /etc/hosts í Linux.

Í þessari skrá getum við skilgreint okkar eigin vísanir frá hýsisnafni á IP-tölur, á borð við

127.0.0.1   localhost
10.0.0.5    printer.local

Þarna skilgreinum við að localhost vísi á 127.0.0.1 og að printer.local vísi á 10.0.0.5.

Stýrikerfið lítur alltaf fyrst í þessa skrá þegar hún reynir að finna IP-tölu fyrir hýsisnafn eftir öðrum leiðum. Ef hún finnur nafnið þar, þá þarf hún ekki að spyrja neinn annan.

Tölvan sjálf

Stundum viljum við að tölvan okkar tali við sjálfa sig, til dæmis þegar við erum að prófa okkar eigin forrit. Hefð er fyrir því að nota hýsisnafnið localhost til þess, en það vísar yfirleitt á sjálfvísunarvistfangið 127.0.0.1. Þetta er sjálfgefin stilling sem má einmitt finna í /etc/hosts.


DNS: Símaskrá internetsins

Það er ekki fýsilegt lengur að halda utan um skrá með öllum hýsisnöfnum Internetsins í einni skrá. Þess í stað notum við kerfi sem kallast DNS (e. Domain Name System). DNS er eins og risastór símaskrá sem tölvan þín flettir upp í þegar hún þarf að finna IP-tölu fyrir lén eins og google.com.

Flest forrit sem vinna með nettengingar, eins og vafrar, curl og wget, framkvæma þessar uppflettingar á bak við tjöldin. Við getum notað skipunina dig til þess að spyrja DNS beint. Til dæmis gefur

dig +short google.com

vistfangið (eða vistföngin) sem google.com vísar á. Höfum í huga að svarið gæti breyst eftir því hvar við erum stödd í heiminum, enda eiga stór fyrirtæki oft mörg þúsund netþjóna á ólíkum stöðum.


Tengi: Hvaða dyr á að nota?

Ein tölva getur gert margt í einu. Hún getur hýst vefsíðu, tekið við SSH-tengingum og sent tölvupóst, allt á sama tíma. En hvernig veit hún hvaða gögn eiga að fara til hvaða forrits?

Til þess notum við tengi (e. ports). Ef við hugsum um IP-töluna sem heimilisfang fjölbýlishúss, þá væri tengið íbúðarnúmerið. IP-talan kemur okkur að húsinu, en tengið segir okkur við hvaða forrit á að tala.

Á öllum stýrikerfum eru u.þ.b. 65 þúsund tengi í boði, númeruð frá 0 upp í 65535. Sum tengi eru hefðbundin (e. well-known ports) og eru nánast alltaf notuð fyrir sömu þjónusturnar:

Tengi Þjónusta Lýsing
21 FTP Skráaflutningur (eldri staðall)
22 SSH Örugg fjarstýring tölva
25 SMTP Sending tölvupósts milli þjóna
53 DNS Uppfletting léns yfir í IP-tölu
80 HTTP Venjulegur vefur (ódulritaður)
110 POP3 Móttaka tölvupósts (eldri leið)
143 IMAP Móttaka tölvupósts (nútímaleg leið)
443 HTTPS Öruggur vefur (dulritaður með TLS)
3306 MySQL Samskipti við gagnagrunna

Prófaðu: Hvaða tengi eru opin hjá þér?

Við getum notað skipunina ss til að sjá hvaða forrit á tölvunni okkar eru með opin port.

ss -tln

Ef þú ræsir lítinn vefþjón (t.d. með Python: python3 -m http.server), muntu sjá nýja línu birtast í þessum lista sem sýnir að tölvan sé byrjuð að hlusta á tengi 8000.


Ping: Er einhver heima?

Ein leið til að kanna hvort við náum sambandi við aðra tölvu er að nota skipunina ping. Til dæmis getum við athugað hvort við náum sambandi við google.com með

ping -c 4 google.com
Skipunin sendir lítinn pakka til hinnar tölvunnar og bíður eftir að hún svari. Þessi staðall hefur þann eina tilgang að kanna hvort hægt sé að ná sambandi við aðra tölvu og hversu langan tíma (í millisekúndum) það tekur skeytið að fara fram og til baka. Ef þú færð ekkert svar gæti það þýtt að tölvan sé niðri, að þú sért ekki með netsamband, eða að hin tölvan sé stillt þannig að hún svari ekki ping.

Vissir þú?

Í tölvuleikjum er „lágt ping“ lykilatriði. Það segir til um hversu fljótt skipanir frá þér (t.d. að skjóta eða hoppa) skila sér til leikjaþjónsins. Ef þú ert með „hátt ping“ upplifir þú tafir eða hik (e. lag), sem getur haft veruleg áhrif í hröðum leikjum!

Vissir þú?

Heitið „ping“ er dregið af hljóði sónartækja í kafbátum. Þegar hljóðbylgja skellur á öðrum bát heyrist hátt „ping“ þegar hún endurkastast til baka. Tölvunarfræðingar fengu þessa hugmynd að láni vegna þess að skipunin virkar nákvæmlega eins: sendir merki og bíður eftir bergmáli.


Samskiptareglur: reglur samtalsins

Til þess að samskipti gangi snurðulaust fyrir sig verða báðir aðilar að fylgja sömu reglunum. Við köllum þessar reglur samskiptareglur (e. protocols). Þessar reglur stýra því hvernig skilaboð eigi að líta út, hvenær þau enda, hvenær hvor aðilinn á að hlusta og hvenær hann á að senda og hvenær á að slíta samtalinu, svo dæmi séu nefnd.


TCP og UDP: Hvernig ferðast gögnin?

Á flutningslaginu (lagi 4) þurfum við að ákveða hvernig gögnin eiga að ferðast á milli forrita. Tvær samskiptareglur ráða þar ríkjum, TCP og UDP. Við getum hugsað um þær sem tvo ólíka póstmenn með mjög mismunandi vinnubrögð.

TCP: Áreiðanlegi valkosturinn

TCP (e. Transmission Control Protocol) er hannað fyrir aðstæður þar sem við megum engan veginn við því að týna gögnum. Hugsaðu um þetta eins og símtal.

Áður en við byrjum að senda raunveruleg gögn fer fram svokallað handaband (e. handshake). Tölvan þín sendir boð, hin tölvan svarar og staðfestir að hún sé tilbúin, og þá fyrst hefst samtalið.

sequenceDiagram
    participant A as Tölvan þín
    participant B as Netþjónninn

    A->>B: Beiðni um tengingu (SYN)
    B->>A: Staðfesting + tilbúinn (SYN-ACK)
    A->>B: Staðfesting (ACK)
    Note over A,B: Handabandinu er lokið – samtalið getur hafist

TCP fylgir svo hverjum pakka eftir með staðfestingu. Fyrir hvern pakka sem berst sendir móttakandinn „kvittun“ til baka. Ef sendandinn fær ekki kvittun innan ákveðins tíma, gerir hann ráð fyrir að pakkinn hafi týnst og sendir hann aftur.

Pakkar koma ekki alltaf á áfangastað í sömu röð og þeir voru sendir (þeir gætu farið ólíkar leiðir um netið). TCP merkir hvern pakka með raðnúmeri svo móttakandinn geti raðað þeim rétt saman á ný.

TCP tryggir þannig heilindi gagna en það kostar líka smá tíma og aukavinnu fyrir kerfið. Við notum TCP í nánast allt þar sem hvert einasta bæti skiptir máli, þ.e. vefsíður (HTTP), tölvupóst (SMTP) og fjarstýringu (SSH).

UDP: Hraðvirki valkosturinn

UDP (e. User Datagram Protocol) býður, aftur á móti, ekki upp á neina eftirfylgni með pökkum. Með því er engin tenging búin til fyrirfram og engar kvittanir sendar. Hugsaðu um þetta eins og að senda póstkort.

Skilaboðin (sem við köllum gagnaskeyti e. datagrams) eru einfaldlega skrifuð með vistfangi móttakanda og þau eru send. Svo vonum við bara það besta.

Af hverju myndum við vilja nota svona óáreiðanlegt kerfi þegar áreiðanlegra kerfi er í boði? Svarið er einfaldlega: hraði. Þar sem tölvurnar þurfa ekki að eyða tíma í handabönd eða bíða eftir staðfestingum byrja gögnin að flæða samstundis.

Í sumum tilfellum er einnig verra að fá gömul gögn seint en að missa af þeim alveg. Ef þú ert í tölvuleik eða myndsímtali og einn pakki týnist, þá viltu frekar fá nýjustu stöðuna strax en að bíða eftir að tölvan reyni að sækja gamla pakkann aftur.

UDP hentar því vel fyrir streymi, tölvuleiki og mikið notuð kerfi þar sem hraði skiptir máli, eins og DNS.


Netcat

Skipunin nc (stytting á netcat, einnig aðgengileg sem skipunin netcat í sumum Linux kerfum) er eitt af grundvallartólunum þegar kemur að netkerfum. Skipunin getur bæði opnað tengingar sem biðlari og hlustað eftir tengingum sem miðlari.

Við getum prófað virkni nc með því að láta tvo skeljaglugga tala saman. Til þess þurfum við að opna tvo skeljaglugga á vélinni okkar. Ef við viljum hafa samskiptin á fylgiþjóninum, þurfum við að opna ssh tengingu í báðum skeljagluggunum. Ef að fylgiþjónninn er notaður, skulum við byrja á því að velja okkur tengi. Þar sem tengi eru auðlindir sem allir notendur stýrikerfisins deila, þá um leið og við notum eitthvað tengi er það frátekið og enginn annar notandi getur notað það (en aðrir notendur geta samt tengst því!) Veljum okkur þannig tengi sem tölu á bilinu 9000-10000. Í dæminu hér að neðan notum við tengið 9876.

  1. Í fyrri glugganum látum við nc hlusta (e. listen) með
    nc -l -p 9876
    
  2. Í seinni glugganum tengjumst við þessu sama tengi með
    nc localhost 9876
    

Nú geturðu skrifað texta í öðrum glugganum og séð hann birtast jafnóðum í hinum! Þetta sýnir okkur í sinni einföldustu mynd hvernig TCP-tenging virkar.

Þetta má einnig prófa með ólíkum notendum. Láttu annan notanda keyra nc sem miðlara og hinn sem biðlara og þá erum komin með lítið einkaspjall milli notenda.

En við getum gert meira en bara eiga samskipti á sömu tölvunni. Við getum notað nc til að tala beint við aðra netþjóna, án þess að nota sérhæfð forrit eins og vafra eða curl.

Prófum að opna tengingu við vefþjóninn á bak við example.com á tengi 80, sem er hefðbundið tengi fyrir ódulritaðan vef, með

nc example.com 80

Þegar tengingin hefur opnast getum við skrifað eftirfarandi (þú þarft að ýta tvisvar á Enter á eftir seinni línunni):

GET / HTTP/1.1
Host: example.com

Ef allt fer að óskum ættum við að fá svar frá vefþjóninum, sem hefst á HTTP/1.1 200 OK. Með þessu erum við að senda hráa HTTP fyrirspurn, á sama hátt og vafri gerir. Við sendum skilaboð sem fylgja HTTP samskiptareglunum og vefþjónninn svarar með hausunum og HTML-kóðanum sem myndar vefsíðuna. Við munum kafa mun dýpra ofan í HTTP-samskipti og veftækni í Vef-kafla bókarinnar.

Stjörnustríð í skelinni

Árið 1997 tók Simon Jansen sig til og endurgerði upphaf fyrstu Stjörnustríðsmyndarinnar í svokölluðum ASCII-myndum (e. ASCII art). Hann endaði á því að teikna upp tæplega 17.000 ramma í 18 mínútna langt „myndband“ sem endursegir u.þ.b. 40% af upprunalegu kvikmyndinni. Hægt er að horfa á afraksturinn með

nc towel.blinkenlights.nl 23
Munum að hægt er að nota Ctrl+C ef við viljum ekki horfa á allar 18 mínúturnar.

Verkefni

Hér má finna öll verkefnin úr efni þessa kafla.

Opna verkefni