C# Workshop - Networking

3,005 views

Published on

That's the slides for our C# Workshop at Darmstadt University of Technology, powered by Microsoft Student Partners.

Published in: Technology
  • Be the first to comment

C# Workshop - Networking

  1. 1. Netzwerke, Sockets und Server C# Workshop, TU Darmstadt 2008, Präsentation von Qiong Wu (Microsoft Student Partner)
  2. 2.  Kommunikation zwischen Applikationen  Bereitstellen von Services  Server Applikationen  Client Applikationen  Anbindung an das Internet
  3. 3.  Kommunikationsnetze sind das A und O heutiger Computerapplikationen  Ohne Kommunikationsnetze wäre IT heutzutage nicht IT
  4. 4. Ethernet Token Ring IPv6 RTSP UDP TCP PPP IPv4 RSVP FTP RIP Telnet IPX SCTP HTTP SMTP DNS IGMP SIP RTP POP NTP ICMP SSH
  5. 5. • Schnittstelle von Anwendung zum  Logische Aufteilung der Application Netzwerk Netzwerkkommunikation • Darstellung von Daten, Presentation Komprimierung & Verschlüsselung in Layer  7 Layer durch OSI Standard Session • Prozesskommunikation definiert Transport • Ende-zu-Ende Verbindung  Relevant für .net Programmierung Network • Paketvermittlung, Wegeermittlung (Routing) hauptsächlich Layer 3-7 • MAC & LLC, Physikalische Data Link  OSI Protokolle kaum Adressierung verwendet Physical • Medium, Signal & Bitübertragung
  6. 6.  Auf Internetprotokolle • Austausch Application anwendungsspezifischer Daten zugeschnitten  TCP/IP Protokolle heute enorm wichtig Transport • Ende-zu-Ende Verbindung • Paketvermittlung, Internet Wegeermittlung (Routing) & Adressierung (IP) • Physikalische Adressierung, Link Bitübertragung, Medium & Signal
  7. 7.  De Facto Standards für • DNS, DHCP, HTTP, Application Internetkommunikatio FTP, IMAP, SMTP n  Nutzung durch Sockets Transport • TCP, UDP, SCTP Internet • IP (IPv4, IPv6) • Ethernet, Token Bus, Link Token Ring, FDDI
  8. 8.  Network Layer • DNS, DHCP, HTTP, Application  Wichtigstes Protokoll FTP, IMAP, SMTP für heutige Datenkommunikation Transport • TCP, UDP, SCTP  2 Standards  IPv4 ▪ Derzeit nahezu überall ausgebaut Internet • IP (IPv4, IPv6)  IPv6 ▪ Noch nicht großflächig produziert • Ethernet, Token Bus, Link ▪ Größerer Adressraum Token Ring, FDDI
  9. 9.  Transport Layer • DNS, DHCP, HTTP, Application  Nutzt IP als FTP, IMAP, SMTP Netzwerkprotokoll  zuverlässiges, Verbindu Transport • TCP, UDP, SCTP ngs- und Stream- orientiertes Punkt-zu- Punkt-Protokoll Internet • IP (IPv4, IPv6)  Daten erreichen das Ziel sicher • Ethernet, Token Bus, Link Token Ring, FDDI
  10. 10.  Transport Layer • DNS, DHCP, HTTP, FT Application  Nutzt IP als P, IMAP, SMTP Netzwerkprotokoll  unzuverlässiges Punkt- Transport • TCP, UDP, SCTP zu-Punkt-Protokoll  Schneller als TCP, weniger Overhead Internet • IP (IPv4, IPv6) • Ethernet, Token Bus, Link Token Ring, FDDI
  11. 11.  Identifizieren eine IP Maschine  Adressen können je nach IP Version in zwei Versionen auftreten  IPv4 Adressen 0.0.0.0-255.255.255.255  IPv6 Adressen 3FFE:FFFF:7654:FEDA  Namensverwaltung erforderlich um umständliche Adressen „nachzuschlagen“ -> Domain Name System  Beispiel: www.microsoft.com-> 207.46.192.254
  12. 12.  Bereitstellung Well- Dynamic / Registered mehrerer Services auf Known Private Ports Ports Ports einem Hosts  Adressierung von Protokollen der Anwendungsschicht 1024- 49152-  Getrennte TCP und 0-1023 49151 65535 UDP Ports
  13. 13.  Schnittstelle zur Netzwerkkommunikation  Berkeley Sockets / Microsoft Winsock  Verschiedene Sockettypen  Raw Sockets  Datagram Sockets  Stream Sockets
  14. 14. Computer 1 Computer 1 Anwendung Anwendung Application Layer (TCP/IP Layer 4) Application Layer (TCP/IP Layer 4) HTTPWebRe HTTPWebRe quest, Application Layer (OSI Layer 7) Application Layer (OSI Layer 7) quest, FTPWebReq Presentation Layer (OSI Layer 6) Presentation Layer (OSI Layer 6) FTPWebReq uest, etc. uest, etc. Session Layer (OSI Layer 5) Session Layer (OSI Layer 5) UDP Socket Transport Layer (TCP/IP Layer 3) Transport Layer (TCP/IP Layer 3) UDP Socket TCP Socket Transport Layer (OSI Layer 4) Transport Layer (OSI Layer 4) TCP Socket Raw Socket Internet Layer (TCP/IP Layer 2) Internet Layer (TCP/IP Layer 2) Raw Socket Network Layer (OSI Layer 3) Network Layer (OSI Layer 3) NDIS Network Access Layer (TCP/IP Network Access Layer (TCP/IP NDIS Layer 1) Layer 1) Data Link Layer (OSI Layer 2) Data Link Layer (OSI Layer 2) Physical Layer (OSI Layer 1) Physical Layer (OSI Layer 1) LAN / MAN / WAN
  15. 15.  Raw Sockets  Zugriff auf Protokolle der Netzwerkschicht (Layer 3)  Beispiel: IP  Datagram Sockets  Verschicken Daten paketweise  Beispiel: UDP  Stream Sockets  Zugriff auf Datenstrom  Beispiel: TCP
  16. 16.  Socket selber arbeitet zwar auf dem jeweiligen Layer, Applikation kann aber nur auf Daten des um eins höheren Layers zugreifen  Um Informationen des Socketlayers zu erhalten ist der Zugriff auf die Socketeigenschaften notwendig
  17. 17.  System.Net  Bietet Schnittstellen für einfache Netzwerkkommunikation auf Applikationsebene  DNS  WebClient  IPAddress, IPEndpoint  System.Net.Sockets  Bietet Schnittstellen für einfachen Zugriff auf Windows Sockets  Socket Object  TCPClient, TCPListener, UDPClient
  18. 18.  IP Adresse repräsentiert durch IPAddress Objekt  Konvertieren von Strings in IPAddress mit IPAddress.Parse()  IPEndPoint beinhaltet IPAddress und Portnummer um eindeutigen Endpunkt zu identifizieren  Dns.GetHostEntry() um Hostnamen zugeordnete IP Adresse zu finden
  19. 19. String to IP Conversion Adressen ermitteln IPAddress ExampleAddress = IPAddress.Parse(quot;192.168.1.1quot;); foreach (IPAddress HostIPAddress in Dns.GetHostEntry(quot;www.microsoft.comquot;).AddressList) { Console.WriteLine(HostIPAddress.ToString()); }
  20. 20.  Konstruktor erfordert 3 Parameter  AddressFamily – spezifiert das Adressierungsschema, z.B. IPv4 oder IPv6  SocketType – Typ des Sockets, z.B. Datagram, Stream, oder Raw  ProtocolType – Protokolltyp, TCP, UDP, IP
  21. 21.  Vorteil  Hohe Anpassung möglich  Raw Sockets möglich  Nachteil  Keine einfache Handhabung  Normalerweise ist direktes Arbeiten mit Sockets nicht erforderlich
  22. 22.  Client  Fordert einen Service an  Muss die Adresse des Servers kennen (z.B. IP Adresse + Port)  Fordert mit Request an  Server  Stellt einen Service bereit  Antwortet mit Response
  23. 23.  Client und Server nicht getrennt  Peers können Dienste sowohl anfordern als auch bereitstellen
  24. 24.  Ziel: Kommunikation zwischen Client und Server Applikation  Implementierung mit TCP  Server lauscht über Sockets auf einem dedizierten Port  Client sendet Nachricht an den Server  Server antwortet mit Hallo  Wichtig! Termination Message
  25. 25.  Möglichst einfacher Server  Nur ein Client gleichzeitig verbunden  Ein Socket für Clientannahme bindet einen Port mit Socket.Bind() und lauscht dann auf Port & Adresse mit Socket.Listen()  Erstellt Socket für Clientkommunikation mit Socket.Accept()  Socket für Clientkommunikation empfängt Daten mit Socket.Receive()
  26. 26. Socketparameter Socket Objekt erstellen übermitteln Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(new IPEndPoint(IPAddress.Any, PORT)); listener.Listen(0); Auf Port lauschen Port an Socket binden Console.WriteLine(quot;Waiting for incoming V4 connections on quot; + PORT); Socket socket = listener.Accept(); Neuer Socket aus angenommener listener.Close(); Verbindungsanfrage byte[] b = new byte[100]; Empfangspuffer int len; while ((len = socket.Receive(b)) != 0) Bytes empfangen { System.Console.WriteLine(quot;RXv4: Received Packet with length: quot; + len); Console.WriteLine(quot;Package Content Begin--->quot;); Console.WriteLine(Encoding.ASCII.GetString(b).Trim()); Console.WriteLine(quot;<---Package Content Endquot;); b = new byte[100]; } Bytes senden socket.Send(b); socket.Close(); Verbindung beenden
  27. 27.  Verbinden mit Socket.Connect()  IP Adresse und Port übergeben  IP Parsen mit IPAdress.Parse()  (optional) Dns Auflösung mit DNS.GetHostEntry()  Daten kodieren mit Encoding.GetBytes()  Konvertierung von Plain Text in Bytes erforderlich  Daten senden mit Socket.Send()  Erwartet zu sendendes Bytearray  (optional) SocketFlags  Gibt Anzahl gesendeter Bytes zurück
  28. 28. IP Adresse definieren IP Endpunkt aus IP Adresse + Port definieren IPAddress ipav4 = IPAddress.Parse(IPv4_ADDR); IPEndPoint ipehv4 = new IPEndPoint(ipav4, PORT); Socket connectionv4 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try Verbindung zu Endpunkt { connectionv4.Connect(ipehv4); herstellen byte[] b = Encoding.ASCII.GetBytes(String.Format(quot;This is a message.quot;)); Console.WriteLine(quot;TXv4: Sending Packet with length: quot; + b.Length.ToString()); Console.WriteLine(quot;Package Content Begin--->quot;); Console.WriteLine(Encoding.ASCII.GetString(b).Trim()); Verbindung zu Endpunkt Console.WriteLine(quot;<---Package Content Endquot;); connectionv4.Send(b, SocketFlags.None); herstellen b = new byte[1]; connectionv4.Send(b, SocketFlags.None); } catch { Terminierungsnachricht } Verbindung beenden senden finally { connectionv4.Close(); }
  29. 29.  Praktische Werkzeuge für Diagnose & Netzwerkdebugging  Leider unter Vista stark eingeschränkt  In Produktionsumgebungen kaum einsetzbar  Möglich Unabhängig von TCP/UDP direkt IP Pakete zu manipulieren  Ggf. Notwendig um Protokolle wie ICMP, IGMP, etc. zu implementieren
  30. 30.  Vereinfachen den TCPClient TCPListener UDPClient Umgang mit Sockets  Liefern einfache Socket Schnittstelle zur Kommunikation mit WinSock API TCP & UDP  Verwenden automatisch Sockets
  31. 31.  Stellt Routinen für das Herstellen von TCP Verbindungen bereit  Verbindungsaufbau mit TCPClient.Connect()  NetworkStream Objekt mit TCPClient.GetStream()  Senden von Paketen mit NetworkStream.Write()  Empfang von Paketen mit NetworkStream.Read()
  32. 32. TcpClient tcpClient = null; TCPClient Objekt deklarieren try { Ziel-Endpunkt übergeben tcpClient = new TcpClient(Host, RemotePort); NetworkStream netStream = tcpClient.GetStream(); Byte[] sendBytes = new Byte[1500]; sendBytes[0] = 0x31; Netzwerk Stream erstellen netStream.Write(sendBytes, 0, sendBytes.Length); Bytes senden Byte[] receiveBytes = new Byte[1500]; netStream.Read(receiveBytes, 0, receiveBytes.Length); Console.WriteLine(Encoding.ASCII.GetString(receiveBytes)); } catch Bytes { empfangen } finally { tcpClient.Close(); }
  33. 33.  Lauscht auf eingehende TCP Verbindungen  Gegenstück zum TCPClient  Kann TCPClient Accepten, aber auch Socket  Funktionsweise wie Server Socket
  34. 34. TcpListener tcpListener = null; TCPListener + ClientObjekt TcpClient tcpClient = null; deklarieren try { tcpListener = new TcpListener(IPAddress.Any, 80); tcpListener.Start(0); Zu lauschende tcpClient = tcpListener.AcceptTcpClient(); Adresse + Port Client NetworkStream netStream = tcpClient.GetStream(); annehmen Netzwerk Stream erstellen Byte[] sendBytes = new Byte[1500]; sendBytes[0] = 0x31; netStream.Write(sendBytes, 0, sendBytes.Length); IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); Byte[] receiveBytes = new Byte[1500]; netStream.Read(receiveBytes, 0, receiveBytes.Length); Console.WriteLine(Encoding.ASCII.GetString(receiveBytes)); } finally { tcpClient.Close(); tcpListener.Stop(); }
  35. 35.  Keine Verbindung vor Senden von Daten erforderlich  Kein Listener erforderlich  Einfacher Zugriff auf UDP Paketroutinen  Senden von Daten mit UDPClient.Send()  Empfang von Daten mit UDPClient.Receive()
  36. 36. UDPClient Objekt deklarieren UdpClient udpClient = new UdpClient(LocalPort); try (optional) Host und Port { festlegen udpClient.Connect(Host, RemotePort); Byte[] sendBytes = new Byte[13]; sendBytes[0] = 0x31; udpClient.Send(sendBytes, sendBytes.Length); Bytes IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); senden Console.WriteLine(Encoding.ASCII.GetString(receiveBytes)); } catch { } finally Bytes { empfangen udpClient.Close(); }
  37. 37.  Stellt Routinen für den Abruf von URIs (Uniform Resource Identifier) bereit  Unterstützung von http:, https:, ftp:, file:  Verwendet  HttpWebRequest  HttpWebResponse  FtpWebRequest  FtpWebResponse
  38. 38. WebClient Objekt deklarieren WebClient client = new WebClient(); WebClient Optionen ändern client.Headers.Add(quot;user-agentquot;, quot;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)quot;); client.DownloadFile(quot;http://localhost/IE_T.pngquot;, quot;IE.pngquot;); Datei laden Stream data = client.OpenRead(quot;http://localhost/index.htmlquot;); StreamReader reader = new StreamReader(data); string s = reader.ReadToEnd(); Console.WriteLine(s); data.Close(); reader.Close(); Stream extrahieren
  39. 39.  Ping Klasse im System.Net.NetworkInformation NameSpace  PingOptions erlaubt setzen von Ping Optionen wie DontFragment, TTL, etc.  Ping.Send() gibt PingReplay Objekt zurück das ausgewertet werden kann
  40. 40. Ping Objekt deklarieren Ping myPing = new Ping(); Byte Buffer byte[] buffer = new byte[buffersize]; int timeout = 1000; PingOptions pingOptions = new PingOptions(); Ping Optionen PingReply reply = myPing.Send(host, timeout, buffer, pingOptions); Ping Senden if (reply.Status == IPStatus.Success) { return (quot;Antwort in quot; + reply.RoundtripTime.ToString() + quot;ms erhalten Bytes=quot; + reply.Buffer.Length.ToString()); } else if (reply.Status == IPStatus.TimedOut) { return (quot;Timeoutquot;); Status Checken } else { return reply.Status.ToString(); }
  41. 41.  System.Net.Mail NameSpace enthält Klassen  SmtpClient  Versendet ▪ MailMessage mit ▪ MailAddress ▪ Subject ▪ Body ▪ MailAttachment  Benötigt ggf. ▪ NetworkCredentials
  42. 42. Email Adressen definieren MailAddress from = new MailAddress(quot;qiong.wu@studentpartners.dequot;, quot;Qiong Wuquot;); MailAddress to = new MailAddress(quot;roman.brehm@studentpartners.dequot;, quot;Roman Brehmquot;); MailMessage message = new MailMessage(from, to); Nachricht erstellen message.Subject = quot;FYI: Hot Topicquot;; message.Body = quot;Hi Roman, this is Qiongquot;; message.Attachments.Add(new Attachment(quot;test.htmlquot;)); SmtpClient emailClient = new SmtpClient(quot;smtp.example.comquot;, 587); System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential(quot;Userquot;, quot;Passwordquot;); SMTP Server festlegen emailClient.Credentials = SMTPUserInfo; emailClient.Send(message); Console.WriteLine(quot;Message Sentquot;); Zugangsdaten zuweisen Email senden
  43. 43.  Netzwerkoperationen können oft lange dauern  Oft blockieren Netzwerkoperationen ein Programm für relativ lange Zeit  Lösungen:  Asynchrone Methoden wie ▪ BeginRead ▪ EndRead ▪ BeginConnect ▪ EndConnect  Multithreaded Server / Clients
  44. 44.  Server erstellt für jeden Client der mit Socket.Accept() angenommen wird einen eigenen Thread  Verhindert Blockieren  Erlaubt parallele Abfertigung von Clients -> bessere Skalierbarkeit, mehr Performance, weniger Lag
  45. 45.  Im letzten Kapitel lernten wir etwas über Threads…
  46. 46. Main Thread Client Handler Thread Listener Socket Kommunikation mit Erstellen Client Auf Listener Socket lauschen ClientSocket schließen Bei Clientannahme ClientSocket erstellen Thread erstellen
  47. 47. Socket listener = null; try { listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(new IPEndPoint(IPAddress.Any, PORT)); listener.Listen(10); Console.WriteLine(quot;[ServerThread]: Waiting for incoming V4 connections on quot; + PORT); while (true) { Socket socket = listener.Accept(); Console.WriteLine(quot;[ServerThread]: Client connectedquot;); ThreadPool.QueueUserWorkItem(new WaitCallback(AcceptClient), socket); } } catch { } finally { listener.Close(); }
  48. 48. static void AcceptClient(object ClientSocket) { Socket Client = null; try { Client = (Socket)ClientSocket; byte[] b = new byte[100]; int len; while ((len = Client.Receive(b)) != 0) { System.Console.WriteLine(quot;[ClientThread]: Received Packet with length: quot; + len); Console.WriteLine(quot;[ClientThread]: Package Content Begin--->quot;); Console.WriteLine(quot;[ClientThread]: quot; + Encoding.ASCII.GetString(b).Trim()); Console.WriteLine(quot;[ClientThread]: <---Package Content Endquot;); b = new byte[100]; } Client.Send(b); } catch { } finally { Client.Close(); } }
  49. 49.  Oft ist es wichtig Protokolle zu implementieren, z.B. HTTP, Instant Messenger, etc.  Funktionsweise ist bei Standards oft in Dokumenten hinterlegt z.B. RFCs (Request for Comments)  Für proprietäre und nicht dokumentierte Protokolle wird oft Reverse Engineering verwendet
  50. 50.  Dokumente zum Internet  Beinhalten technische Spezifikationen zu Bestandteilen des Internets  Genaue Funktionsweise von Protokollen wie IP, UDP, TCP, etc. in RFCs Dokumentiert  Durchnummeriert, z.B.:  RFC 1945 HTTP1.0  RFC 768 UDP  RFC 791 IP  Zu finden unter http://www.rfc-editor.org/
  51. 51.  Netzwerksniffer Wireshark, früher Ethereal  Analysiert Netzwerkverkehr  Schlüsselt die meisten Protokolle auf  Sehr nützlich für Reverse Engineering / Debugging
  52. 52.  Normalerweise sind Kommunikationsstandards bekannt  Oft ist für die Nachprogrammierung eines Clients/Servers allerdings Kenntnis über das Netzwerkprotokoll notwendig  Wenn dieses nicht dokumentiert ist kann man Reverse Engineering betreiben  Bedeutet  Kommunikation zwischen Originalserver & Client mitschneiden  Mitschnitt analysieren  Client/Server programmieren sodass Anfragen/Antworten dem originalen Server entsprechen
  53. 53.  Bisher: Programm muss sich um die Kommunikation selber kümmern und übertragene Payloads auswerten  Mit WCF: Serviceorientierte Architektur  Zugriff auf Methoden von Remoteclient aus möglich

×