Laboration i Datakommunikation - Introduktion till Sockets och TCP/IP Magnus Jonsson Högskolan i Halmstad 1. Syftet med laborationen Syftet med denna laboration är dels att få lite praktisk syn på bl.a. TCP/IP-kommunikation genom att undersöka inställningar och kommandon i Windows- och UNIX-miljö. En introduktion till sockets ingår också i laborationen. 2. Nätverksinställningar i Windows Beroende på vilken version av Windows som är installerad på datorn ni sitter vid så kan inställningarna presenteras på lite olika sätt. Detta borde dock inte vara något problem. Innebörden av vissa termer tas upp djupare på föreläsning. A. Gå in på startmenyn och välj "Inställningar" => "Kontrollpanelen". Dubbelklicka därefter på nätverk. Välj fliken "Protokoll" och markera "TCP/IP protocol". Tryck därefter på "Egenskaper...". Stäng fönstren efter att nedanstående frågor är besvarade Om ni inte är behöriga att se dessa egenskaper (se ovanstående i så fall endast som "för kännedom") så skall ni hoppa till uppgift 3 och besvara nedanstående frågor senare. B. Får datorn IP-adress mm tilldelat av en DHCP-server eller är det manuellt inmatat? Om konfigureringsinformation fås från en DHCP-server så skall ni hoppa till uppgift 3 och besvara nedanstående frågor senare. C. Vilken IP-adress är bunden till nätverkskortet? Detta skall vara en unik adress i hela Internet som normalt fås av systemansvarig. Systemansvarig har i sin tur fått ett eller flera intervall av adresser från organisation som koordinerar detta. D. Vilken Nätmask används? Till exempel så anger nätmasken 255.255.255.128 (binärt så blir det 11111111.11111111.11111111.10000000) att en host med en adress som är identisk med den egna så när som de sista sju bitarna finns i samma nätverk som vårt nätverkskort i fråga är anslutet till. Med andra ord så finns det ingen router mellan de båda noderna och eventuellt datagram kan skickas direkt över det gemensamma nätet. De första 25 bitarna anger i exemplet "netid" medan de sista sju bitarna anger "hostid" i nätet. E. Vilken router är angiven som Standardgateway? Om en destinationsadress (för ett datagram som vi skall skicka) inte finns representerad i routingtabellen som är kopplad till nätverkskortet i datorn så skickas datagrammet till den specificerade adressen för Standardgateway. F. Vilken eller vilka DNS-servrar (se "Sökordning för DNS-tjänsten") används? En DNS-server anropas för att översätta logiska namn till adresser, t.ex. från camjpcp.hh.se till 194.47.1.192.
3. Nätverksrelaterade kommandon i Windows NT A. Starta kommandotolken (den med MS-DOS symbolen). Kör kommandot: ipconfig /all more B. Gå tillbaka till uppgift 2 och besvara uppgifterna C till F. C. Vilken MAC-adress har Ethernet-nätverkskortet (hexadecimalt)? Ett Ethernet-kort får vid tillverkning en 48-bitars adress som garanteras vara unik gentemot alla andra Ethernet-kort. Med andra ord så är detta en fast adress som inte kan ändras. Eftersom IP-datagram som skickas över Ethernet packas in i Ethernet-ramar, så måste MAC-adresser också användas. För att få reda på vilken MAC-adress som en host med en viss IP-adress har (förutsatt att både källa och destination befinner sig i samma nätverk, dvs har samma netid), så skickas förfrågan enligt ARP-protokollet. D. Kör kommandot: tracert www.teknocenter.se Kommandot tracert används för att se vilken väg som IP-datagram tar från källa till destination. Datagram med olika värden på time-to-live-parametern (TTL) skickas med början på värdet 1. Varje router på vägen räknar ner TTL med 1 eller mer. När TTL i ett datagram räknats ner till noll så kastas datagrammet och ett felmeddelande (ICMPprotokollet) skickas tillbaka. Tiderna som skrivs ut är tid från sändning till svar, så kallad round-trip-delay. Det som skrivs ut på varje rad är: TTP (som sattes i datagrammet vid sändning), tre tider (för varje TTP skickas tre datagram) och namn/ip-adress för router som skickade tillbaka felmeddelanden (router där TTP nådde värdet noll). En asterix betyder att inget svar kom innan tracert tröttnade på att vänta (time-out). Observera att datagrammen kan ta olika vägar från gång till gång. E. Hur många routrar passerar ett IP-datagram på vägen mellan källa (datorn ni sitter vid) och destination (Teknocenters web-server): F. Studera namnen på routrarna för att grovt gissa vilken väg IP-datagrammen tar geografiskt: 4. Nätverksrelaterade kommandon i UNIX Motsvarigheter till ovan testade kommandon finns i UNIX, t.ex. kommandot traceroute. Använd kommandot man om ni vill få reda på mer om kommandona, t.ex. man traceroute. A. Starta telnet-klienten (om den inte finns i startmenyn så leta i C:\Winnt\system32) och logga in på någon av högskolans arbetsstationer. B. Kör kommandot: netstat -r Routingtabellen i arbetsstationen visas med detta kommando. Vilken router är angiven som "default router"? C. Kör kommandot (använd parametern -n också om adresser skall visas som "dotted-decimal"): netstat -p ARP-tabellen visas, dvs de par av MAC-adress och IP-adress (här angivet som namn) som är kända. Kommunicera med två hosts som inte finns representerade i ARP-tabellen med hjälp av ftp, rlogin eller dylikt. Den ena hosten skall vara ansluten till samma nät (ingen router mellan källa och destination) medan den andra skall ligga längre iväg, t.ex. utanför
högskolan. För vilken av de två destinationerna så sker det en förfrågan med hjälp av ARPprotokollet så att ARP-tabellen kan uppdateras? Kör netstat-kommandot igen för att kontrollera och jämföra ARP-tabellen före och efter. Eftersom den andra destinationen ligger utanför det direktanslutna nätet så skall datagrammen skickas till en router (next-hop på väg till destination), i detta fallet "default gateway" och MAC-adressen för denna lär redan finnas i ARP-tabellen (kontrollera). D. Uppgift D, E och F är i första hand till för att få lite kännedom om vad man kan få fram för övrig information, information som dock kan vara svår att tyda utan djupare granskning. Med andra ord så behöver ni inte ta uppgifterna så allvarligt. Kör nedanstående kommando för att studera statistik för TCP/IP-trafik till/från arbetsstationen, t.ex. hur många TCP-ACK som sänts: netstat -s E. Kör nedanstående kommando för att se status för UDP- och TCP-portar: netstat -a F. Kör nedanstående kommando för att se status för nätverksinterface (Ethernet) där t.ex. antal kollisioner visas. netstat -i G. Denna övning skall ge exempel på applikationsprotokoll med klartextkommandon. Kör nedanstående kommando för att få en TCP-förbindelse till högskolans www-server på port 80. telnet www.hh.se 80 Port 80 används för http-protokollet, ett enkelt filöverföringsprotokoll som används för att föra över bl.a. web-sidor. Skriv nedanstående http-kommando för att hämta en html-fil (kan egentligen vara vilken typ av fil som helst) över den skapade TCP-förbindelsen. OBS, kommandot GET skall skrivas med versaler och hela raden skall följas av TVÅ tryck på return/enter. GET /staff/magnusj/datorkom.htm HTTP/1.0 Eftersom ni kör en telnet-klient-applikation så kommer dess innehåll (samt lite annan information först, t.ex. 200 som betyder OK) att skrivas ut på skärmen som ren text. Om det hade varit en www-klient som hade hämtat filen så hade www-klienten tolkat filens innehåll enligt html-språket och skrivit ut den formatterad på skärmen. 5. Sockets och klient/server-kommunikation Ni skall nu kompilera ett färdigt program och därefter göra smärre ändringar i det. Tanken är att visa att man enkelt kan komma igång med klient/server-kommunikation över Internet med hjälp av sockets om man har ett skal att börja med (t.ex. så är funktionerna i sock.c generella rutiner). 5.1 Förberedelser A. Hämta källkodsfilerna från kursens hemsida: http://www.hh.se/staff/magnusj/datorkom.htm B. Packa upp filerna med t.ex. WinZip. C. Skapa ett projekt för 32-bit konsollprogram i Visual C++ (version 5 förutsätts i förklaringarna av menyer nedan), där de hämtade filerna ingår.
D. Se till att ".lib"-filen enligt nedan länkas (se meny projects -> settings, under fliken "link", fält "object/library modules") och att rätt ".h"-fil inkluderas. Välj något av följande alternativ beroende på aktuellt operativsystem: Kompilera med "winsock2.h" inkluderad (görs i befintlig källkod) och länka med "ws2_32.lib". Endast testat med framgång under Windows NT 4.0 och Windows 98. Programmet kräver Ws2_32.dll och Ws2help.dll för att kunna köras. Kompilera med "winsock.h" inkluderad (ändring i källkod från winsock2.h måste göras) och länka med "wsock32.lib". Testat med framgång under Windows NT 4.0, Windows 95 och Windows 98. Programmet använder äldre ".dll"-filer. E. Börja med att kompilera programmet och testa det enligt nedan 5.2 Test av befintligt program A. Välj alternativet "TCP Daytime" vilket är en klient som kopplar upp sig till valfri daytimeserver och väntar på svar. Genom att i källkoden välja portnummer "daytime" så översätts detta till portnummer 13 vilket är den så kallade "well-known port" för daytime. Välj namn eller IPadress till valfri dator med DAYTIME aktiverat (timehost.hh.se eller remote.stud.hh.se). När TCP-förbindelsen är upprättad så kommer daytime-servern att svara (utan att något egentligt kommando skickats) med att skicka aktuellt datum och tid. B. Kör igång två instanser av programmet, en server först och sedan en klient. Servern ligger och väntar på anrop från godtycklig klient på porten som ni valt. När ni startar klienten så skall ni välja samma portnummer eftersom detta tillsammans med serverns IP-adress bildar en så kallad end-point-address. Det är just denna end-point-address som det aktuella server-programmet lyssnar efter anrop på. Ni kan även testa att köra servern på en dator och klienten på en annan. 5.3 Modifiering av programmet A. Modifiera servern så att den returnerar sitt namn (enligt anrop av gethostname) till klienten. B. Ni skall nu skriva ett program som skall kunna användas för att kontrollera om klockorna i två datorer är någorlunda synkroniserade med varandra. Modifiera TCPdaytime-klienten så att man först matar in TVÅ IP-adresser eller namn. Därefter skall programmet koppla upp sig till de båda daytime-servrarna. Sist skall svar inväntas från de båda samt skrivas ut på skärmen. Använd två sockets istället för en för att lösa uppgiften. 5.4 Modifiering av programmet Ni skall nu göra en chat-applikation. Ni ska använda UDP och realisera en server och klient. Enda skillnaden mellan server och klient är att servern måste startas först. Efter start ligger servern och väntar på att en klienten startas och tar initiativ genom att skicka ett token till servern. Token kommer sedan att vandra mellan klient och server där den datorn som har token frågar användaren efter en textrad via tangentbordet. Om användaren inte har något att sända så trycker han/hon bara på <CR> vilket får till följd att token skickas tillbaka till den andra noden igen. Om användaren vill mata in text så blir den enda skillnaden den att textraden skickas med token för att sedan skrivas ut på den andra datorns skärm. Nedan ser du tillståndsgrafer för server och klient.
Server: Start; Vänta på token <CR> nedtryckt; Skicka token och eventuell text Token mottaget; Skriv ut mottagen text (om ej tom) och fråga användaren efter ny text Vänta på inmatning från användaren Klient: Start; Skicka token Vänta på token <CR> nedtryckt; Skicka token och eventuell text Token mottaget; Skriv ut mottagen text (om ej tom) och fråga användaren efter ny text Vänta på inmatning från användaren