Nå har jeg snart gått konstant på skole i 15 år, og det er så godt som 3/4 av livet mitt. Jeg vet liksom ikke hva livet går ut på utenom skole og ferier. Skole og utdannelse skal jo egentlig bare være et grunnlag for hva man skal jobbe med store deler av resten av sitt liv, og jeg skal jobbe med det samme som jeg gjør akkurat nå… sitte med ræva mi plantet foran pcen!
Det er litt rart det å vite at man låser seg litt hva man skal bruke store deler av livet sitt til, men så er jeg jo ikke eeegentlig låst til dataingeniøryrket, jeg kan jo velge å bli f.eks sykepleier når jeg vil… Men, det vil jeg jo ikke, i alle fall ikke nå.
Som en slags avslutning på mine tre år med ingeniørutdannelse, skal jeg gjennomføre en bacheloroppgave. Nå føles ikke dette egentlig som en avslutning på de siste tre årene med skole, men heller om en avslutning på mine siste 15 år med skole! Jeg har jo fulle planer om å ta en mastergrad etterhvert, men nå trenger jeg å gjøre noe annet enn skole en liten stund.
Bacheloroppgaven jeg og tre andre skal gjennomføre, går ut på å lage noe som såvidt vi vet ikke har blitt laget hittil. Vi skal lage et system som tillater oss å bruke flere smartboards (en tavle som fungerer som en stor touchscreen) som om de var en enhet. Altså skal man kunne tegne hvem som helst av enhetene som er koblet sammen, og det skal komme opp på alle de andre enhetene. Det blir altså som om alle står foran den samme tavla og jobber, selv om man i realiteten kan være på hver sin del av verden. Vi lager dette fordi det var ønsket fra noen i bedriftsmarkedet som hadde utviklingsgrupper i store deler av verden, og de trengte bedre verktøy for å kunne samarbeide over store avstander. Hvis vi klarer å komme langt nok med prosjektet, så kan vi møte opp på denne bedriften og prøve dette systemet med et av deres utviklingslag i f.eks Sør-Korea. Hadde vært utrolig gøy å få det til!
En ting jeg har lært etter å ha jobbet med dette prosjektet nå i tre uker, er at ting er ikke så lett som man først forventet…
For de av dere som ikke er interessert i teknisk bullshit, kan stoppe å lese nå og si dere fornøyd med at dere nå vet hva min bacheloroppgave er. For de av dere som faktisk kunne være interessert i å høre om det magiske problemet med NAT-traversal med TCP, så kan dere lese videre.
For de som ikke vet hva NAT er for noe, men har fortsatt lyst til å lese videre, så skal jeg prøve å forklare det kort og enkelt her nå.
For, i den teknologiske verden som heter “Internettet”, må vi jo klare å finne frem til alle de andre pcene og serverne. Når du skal komme deg til f.eks www.vg.no, skriver du bare inn linken og trykker ENTER. Men, det er jo ikke eeeegentlig en adresse som heter “www.vg.no”, dette er bare et alternativt navn til VG sine servere. Den egentlige adressen er 195.88.54.16, men dette er jo en håpløs adresse å huske, så det er derfor vi gir dem enklere navn alle klarer å huske. Hvis du prøver å skrive inn tallkombinasjonen i stedet for en link, så kommer du uansett frem til VG sine nettsider. Dette er det som kalles en IP-adresse, og består av 32-bit, som kan enten vær 1 eller 0. Dette gir hele 4 294 967 296 ulike IP-adresser, noe man virkelig skulle tro var nok, noe man i alle fall trodde når internettet ble oppfunnet for 50-60 år siden eller noe. Men, i dagens verden er faktisk ikke dette nok. Dette er grunnen til at NAT ble oppfunnet. Etterhvert (de nærmeste årene) vil ikke lenger NAT være like nødvendig som det er nå, for da går vi over til IPv6, som er etterfølgeren til det vi har i dag som heter IPv4. I IPv6 er hver adresse noe lenger. I stedet for 32-bit, har de nå økt det til 128-bit, noe som vil gi hele 340 282 366 920 938 463 463 374 607 431 768 211 456 mulige adresser. Utrolig nok er dette nok til å gi en million adresser til hver eneste stjerne på himmelen, og fortsatt ha nok igjen.
NAT står for Network Address Translation, og brukes til å la flere enheter ha samme IP-adresse. Den enkleste forklaringen jeg kommer på akkurat nå, er om du ser for deg at du og en gruppe andre mennesker deler samme bolig, altså samme husadresse. Hvis du skal poste et brev til noen andre, så skriver du jo opp deres felles adresse som avsender-adresse, og når du får brev tilbake så vet dere jo at det brevet skal til deg, uansett om det er alt fra 1 til 1 million mennesker som bor i det huset. Akkurat der du sitter og leser dette her nå, så sitter du 99,999998% sannsynligvis bak et system som bruker NAT. Din helt vanlige trådløse router du kanskje har hjemme fungerer som en slags mellommann mellom deg og andre enheter på internettet. Routeren har ansvaret for å holde oversikt over hvem som sender “post” til hverandre, så den vet hvem den skal sende svaret tilbake til når det eventuelt kommer et svar.
For å gå over til å forklare alt dette endel mer avansert, for ellers kommer jeg nok aldri frem til poenget…
Når vi oppretter en tilkobling ut gjennom NAT, så kan det hende vi sender ut fra port 1111 på pcen vår, men når det kommer gjennom routeren, så merker routeren at port 1111 er allerede i bruk, så den endrer litt på pakka, og velger å sende det ut fra port 2222. Mottageren av pakka ser bare at den er sendt ut fra port 2222, og bruker den samme porten når den skal sende svar tilbake. Når en pakke så kommer tilbake til routeren på port 2222, så husker den at port 2222 egentlig er port 1111 til den pcen som originalt sendte pakka. Den den oversetter altså hvilken port og adresse som skal brukes til en som ikke er i bruk. Dette er fordi man skal løse problemet som oppstår hvis to pcer prøver å overføre informasjon samtidig gjennom f.eks port 1111. Man vet ikke hvilken data som skal ha informasjonen når den kommer tilbake.

Så, i vårt tilfelle i dette prosjektet, så må vi klare å koble sammen to klienter som begge sitter bak NAT. Hvis man prøver å sende informasjon til en annen IP-adresse som bruker NAT, så vil ikke routeren ha noen kjennskap til hvem som skal ha denne informasjonen, så den vil bare kaste pakka og ikke bry seg noe mer om den. For å komme seg gjennom dette må man få begge klientene til å prøve å koble seg til den andre samtidig. Da vil routeren merke at du sender informasjon ut gjennom port 1111, selv om du ikke klarer å koble deg til noen i andre enden, så vil fortsatt den andre kunne klare å koble seg til deg gjennom din port 1111. Du har nå laget et slags “hull” rett gjennom NAT på begge sider. Dette kalles Hole Punching, og er lett når man bruker UDP, men vanskelig når man bruker TCP, på grunn av den treveis-handshake’n. Greit nok det, men et problem til er at routeren som gjennomfører NAT, lager seg også en database som inneholder fire ting;
- Den lokale IP-adressen til avsenderen.
- Den lokale porten til avsenderen.
- IP-adressen til mottageren.
- Porten til mottageren.
Altså, hvis bare en av tingene endrer seg, vil ikke lenger routeren vite hvor den skal sende ting. Så, for å komme rundt dette må man bruke mellommannen til å skaffe IP-adressen og porten til den du skal koble deg til. Så må begge to prøve å koble seg til hverandre samtidig. Ikke bare det, man må også passe på at man får den samme porten ut gjennom NAT hver gang man prøver å koble seg utover, altså må man binde seg til den porten. Men der kommer det et nytt problem i programmeringsverden. For, man har egentlig ikke lov til binde seg til en port for fort etter den har vært brukt før, og man kan bare binde seg til porten en gang og alt mulig for å få til alt dette. Et rent helvete så langt! Men, fremskritt gjøres, og snart fungerer det også gjennom NAT på systemet!
Siste kommentarer