Sockets
- Skal jeg bruke gethostbyname() eller getaddrinfo()?
-
gethostbyname()
er foreldet (obsolete), og det anbefales at nye programmer brukergetaddrinfo()
. Begge alternativer er imidlertid mulig i l?sningen din, og gir lik uttelling.Funksjonene skiller seg ved at
getaddrinfo()
fungerer for flere adressefamilier enn IPv4, slik som IPv6. Forgjengerengethostbyname()
er derimot begrenset til IPv4-adresser.Merk at maskinene p? ifi per n? ikke har IPv6-forbindelse til Internett. Hvis du ?nsker ? teste hvorvidt koden din fungerer med IPv6, s? kan du bruke SSH-serverne
ulrik.uio.no
oglogin.uio.no
til dette. Dette er ikke et krav. - Hvordan vet man n?r en fullstendig ramme er mottatt?
-
UDP er datagramorientert, og ikke str?morientert slik som TCP. Ett receivekall p? en UDP socket kan kun h?ndtere hele UDP-pakker (datagram). Dette er n?rmere presisert p? man-siden til
udp(7)
:All receive operations return only one packet. When the packet is smaller than the passed buffer, only that much data is returned; when it is bigger, the packet is truncated and the MSG_TRUNC flag is set.
Hvis du sender én ramme for hver
sendto()
, vil du ogs? motta n?yaktig én ramme for hverrecvfrom()
.
Obligatorisk oppgave
- Hvor b?r jeg starte?
-
Lag 1 er et greit sted ? starte. Uten fungerende lag 1 er det vanskelig ? teste de ?vre lag.
-
Skal jeg blokkere i l1_connect?
-
Kommentarer i prekoden nevner to forskjellige m?ter ? implementere
l1_connect()
p?:- Blokkere i
l1_connect()
helt til tilkoblingen er ferdig. Da m? du feks. lage din egenselect()
-l?kke il1_connect()
. - Sende connect-pakke, markere tilkoblingen som connecting og la
l1_handle_events()
gj?re noe smart med up-pakker som kommer tilbake.
Hint: sistnevnte kan v?re en bedre l?sning.
- Blokkere i
- Skal jeg implementere oppdeling av rammer/pakker/filer?
-
Det er ikke behov for ? st?tte oppdeling (fragmentering) av rammer eller pakker p? lag 2–3. For ? overf?re st?rre filer kan lag 5 dele opp sendingen i flere sm? biter.
- Skal jeg implementere feildeteksjon (checksum o.l.)?
-
Du kan anta at alle mottatte UDP-pakker er fri for korrupsjon. Det er dermed ikke n?dvendig ? benytte en checksum p? lag 2 slik som Ethernet gj?r. UDP-pakker kan imidlertid g? tapt i sin helhet – dette m? du ta h?yde for.
- Hva er portene som gis til l4_send()?
-
Det er portene som lag 4 i teorien kan bruke til ? skille tjenester, slik at du skal kunne ha flere lag 5-programmer. Du beh?ver ikke skrive kode som sjekker disse portene, og kan derfor trygt angi 0 som begge portene til
l4_send()
. Portene p? lag 4 m? iallfall v?re under 1024 i prekoden.Her skal du ikke bruke port angitt p? kommandolinjen n?r du starter programmet.
Hjemmeeksamen 1
- M? jeg ta hensyn til dupliserte rammer i nettverk med l?kker?
-
I visse topologier med l?kker kan man f? dupliserte rammer hos endemottakeren n?r man bruker flooding for sending/videresending. Det er ikke n?dvendig ? ta hensyn til dette.
Husk: I denne oppgaven er det ikke noe krav om p?litelig ende-til-ende-kommunikasjon, kun punkt-til-punkt.
- Hvor er
l2_configbuf()
, og hva trenger jeg den til? -
Dere finner en eksempelsignatur i prekoden til den obligatoriske oppgaven som kan kopieres inn. Funksjonen
l2_configbuf()
skal kunne justere bufferst?rrelsen (og dermed vindusst?rrelsen) til et glidende vindu. Husk p? ? oppdatere informasjonen alle steder det er viktig ? ha riktig vindusst?rrelse. - Er det noen spesielle regler rundt ACKs?
-
Det er nyanseforskjeller i meningsinnholdet til ACKs i forskjellige ARQ-implementasjoner (Stop-and-Wait, Go Back-N, Selective Repeat). F?lg som utgangspunkt ACK-m?nstrene slik de er presentert i forelesningene. Det er ikke p?krevd ? benytte NAKs.
Underkapittelet i l?reboka (kap. 3.4, s. 226) dekker de fleste problemstillinger i forbindelse med Sliding Window-protokoller.
Generelt vil man aldri f? trekk for ? utbedre og gj?re optimaliseringer utover minimumskravene som er spesifisert i oppgaven. Alle avvik fra den opprinnelige oppgaveteksten skal begrunnes og dokumenteres i designdokumentet.
Hjemmeeksamen 2
- M? jeg ha k?er p? lag 3?
-
Siden vi ikke har noe funksjonalitet p? lag 4 i denne oppgaven, skal lag 3 tilby p?litelig ende-til-ende-kommunikasjon til lag 4 (slik som det st?r i oppgaven). Det betyr med andre ord at lag 3 p? avsendernoden m? mellomlagre de pakkene som blir sendt inntil det med sikkerhet kan si at pakkene har kommet helt frem til mottakernoden. Det er opp til deg ? velge en passende mekanisme for ? l?se dette problemet, og implementere den p? lag 3.
NB: Dette er annerledes enn i Internett-modellen! IP (p? nettlaget) tilbyr ende-til-ende-kommunikasjon, men gir ingen garantier om p?lietlighet. TCP er der eksempel p? en transportlagsprotokoll som sikrer p?litelig overf?ring.
C-programmering
- Hvordan fungerer…
-
En essensiell ressurs i C-programmering er de s?kalte man-sidene. Du beh?ver neppe pugge disse, men bruk gjerne tid p? ? l?re deg ? lese man-sider. De har som regel alt du trenger ? vite om en funksjon – en kort beskrivelse, parametre, returverdi og evt. hensyn man b?r ta.
For ? finne man-siden til funksjonen
getaddrinfo
, kan du kj?re f?lgende kommando i et shell:man getaddrinfo
. Merk for ?vrig at man-sidene finnes p? Internett, se lenke til h?yre. - Hvordan b?r jeg skrive ut debuginformasjon?
-
N?r du kompilerer koden med
make debug
vil gcc bli kj?rt med opsjonen-DDEBUG
. Dette kan du bruke til ? kun printe debugoutput hvis programmet blir kompilert medmake debug
.Her er et eksempel p? en makro
DPRINT()
som fungerer somprintf()
, som ogs? vil skrive ut filnavn og linjenummer, men ikke skrive ut noe hvis du kompilerer uten-DDEBUG
.#ifdef DEBUG #define DPRINT(args...) fprintf(stderr,"%10s:%-3d - ", __FILE__, __LINE__); fprintf(stderr, args); #else #define DPRINT(args...) #endif
Merk at du kan utvide en slik makro med tilleggsinformasjon etter behov. Se feks. en debugmakro som har tidspunkt med p? utskriften.
- Programmet mitt segfaulter?!
-
- S?rg for at du kompilerer med flagget
-g
tilgcc
, hvis du ikke gj?r dette s? vil ikke debuggingsinformasjon bli lagt ved. - Kj?r programmet ditt med
gdb
. Hvis du vanligvis ville kj?rt./main 1234 1
, s? gj?r dette:gdb ./main
, og n?r gdb har startet opp skriver durun 1234 1
- N?r programmet ditt da segfaulter, skriv
bt full
, da vil du se alle funksjonskallene (og argumentene til disse) som ledet opp til kr?sjet, hvis du kun f?r opp sp?rsm?lstegn s? har du ?delagt stakken, da har du mest sannsynlig skrevet for mye til en variabel av typenchar a[100];
.
- S?rg for at du kompilerer med flagget
Terminologi
Norsk | Engelsk | |
---|---|---|
Ramme | Frame | Overf?res p? lag 2 |
Pakke | Packet | Overf?res p? lag 3 |
Payload | Lasten fra/til laget over. (Typisk det som er igjen n?r header tas vekk.) |