57
Netzwerkprogrammierung mit C# Netzwerke, Sockets und Server C# Workshop, TU Darmstadt 2008, Präsentation von Qiong Wu (Microsoft Student Partner)

C# Workshop - Networking

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: C# Workshop - Networking

Netzwerkprogrammierungmit C#

Netzwerke, Sockets und Server

C# Workshop, TU Darmstadt 2008, Präsentation von Qiong Wu (Microsoft Student Partner)

Page 2: C# Workshop - Networking

Wieso Networking?

Kommunikation zwischen Applikationen

Bereitstellen von Services Server Applikationen Client Applikationen Anbindung an das Internet

Page 3: C# Workshop - Networking

Netzwerke in der echten Welt

Kommunikationsnetze sind das A und O heutiger Computerapplikationen

Ohne Kommunikationsnetze wäre IT heutzutage nicht IT

Page 4: C# Workshop - Networking

Netzwerkprotokolle

TCPUDP

IPv4

IPX

SIP RTP

HTTP

SCTP

RTSP

RSVP

FTP

SMTP

POP

IPv6

Ethernet

Token Ring

Telnet

DNS

NTP

SSHICMP

IGMP

RIP

PPP

Page 5: C# Workshop - Networking

OSI Modell

Logische Aufteilung der Netzwerkkommunikation in Layer

7 Layer durch OSI Standard definiert

Relevant für .net Programmierung hauptsächlich Layer 3-7

OSI Protokolle kaum verwendet

•Schnittstelle von Anwendung zum Netzwerk

Application•Da

rstellung von Daten, Komprimierung & Verschlüsselung

Presentation

•Prozesskommunikation

Session

•Ende-zu-Ende Verbindung

Transport

•Paketvermittlung, Wegeermittlung (Routing)

Network

•MAC & LLC, Physikalische Adressierung

Data Link

•Medium, Signal & Bitübertragung

Physical

Page 6: C# Workshop - Networking

TCP/IP Modell

Auf Internetprotokolle zugeschnitten

TCP/IP Protokolle heute enorm wichtig

•Austausch anwendungsspezifischer Daten

Application

•Ende-zu-Ende Verbindung

Transport

•Paketvermittlung, Wegeermittlung (Routing) & Adressierung (IP)

Internet

•Physikalische Adressierung, Bitübertragung, Medium & Signal

Link

Page 7: C# Workshop - Networking

TCP/IP Protokolle

De Facto Standards für Internetkommunikation

Nutzung durch Sockets

•DNS, DHCP, HTTP, FTP, IMAP, SMTP

Application

•TCP, UDP, SCTP

Transport

•IP (IPv4, IPv6)

Internet

•Ethernet, Token Bus, Token Ring, FDDI

Link

Page 8: C# Workshop - Networking

Internet Protocol

Network Layer Wichtigstes Protokoll

für heutige Datenkommunikation

2 Standards IPv4▪ Derzeit nahezu überall

ausgebaut IPv6▪ Noch nicht großflächig

produziert▪ Größerer Adressraum

•DNS, DHCP, HTTP, FTP, IMAP, SMTP

Application

•TCP, UDP, SCTP

Transport

•IP (IPv4, IPv6)

Internet

•Ethernet, Token Bus, Token Ring, FDDI

Link

Page 9: C# Workshop - Networking

Transmission Control Protocol Transport Layer Nutzt IP als

Netzwerkprotokoll zuverlässiges,

Verbindungs- und Stream-orientiertes Punkt-zu-Punkt-Protokoll

Daten erreichen das Ziel sicher

•DNS, DHCP, HTTP, FTP, IMAP, SMTP

Application

•TCP, UDP, SCTP

Transport

•IP (IPv4, IPv6)

Internet

•Ethernet, Token Bus, Token Ring, FDDI

Link

Page 10: C# Workshop - Networking

User Datagram Protocol

Transport Layer Nutzt IP als

Netzwerkprotokoll unzuverlässiges

Punkt-zu-Punkt-Protokoll

Schneller als TCP, weniger Overhead

•DNS, DHCP, HTTP, FTP, IMAP, SMTP

Application

•TCP, UDP, SCTP

Transport

•IP (IPv4, IPv6)

Internet

•Ethernet, Token Bus, Token Ring, FDDI

Link

Page 11: C# Workshop - Networking

IP Adressen

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

Page 12: C# Workshop - Networking

Ports

Bereitstellung mehrerer Services auf einem Hosts

Adressierung von Protokollen der Anwendungsschicht

Getrennte TCP und UDP Ports

Well-Known Ports

0-1023

Registered Ports

1024- 4915

1

Dynamic / Private

Ports

49152-

65535

Page 13: C# Workshop - Networking

Sockets

Schnittstelle zur Netzwerkkommunikation

Berkeley Sockets / Microsoft Winsock Verschiedene Sockettypen

Raw Sockets Datagram Sockets Stream Sockets

Page 14: C# Workshop - Networking

Computer 1Computer 1

Anwendung

Raw Socket

UDP Socket

TCP Socket

HTTPWebRequest, FTPWebRequest, etc.

Anwendung

Raw Socket

UDP Socket

TCP Socket

HTTPWebRequest, FTPWebRequest, etc.

LAN / MAN / WAN

Application Layer (TCP/ IP Layer 4)

Session Layer (OSI Layer 5)

Presentation Layer (OSI Layer 6)

Application Layer (OSI Layer 7)

Transport Layer (TCP/ IP Layer 3)

Transport Layer (OSI Layer 4)

Internet Layer (TCP/ IP Layer 2)

Network Layer (OSI Layer 3)

Network Access Layer (TCP/ IP Layer 1)

Data Link Layer (OSI Layer 2)

Physical Layer (OSI Layer 1)

Application Layer (TCP/ IP Layer 4)

Session Layer (OSI Layer 5)

Presentation Layer (OSI Layer 6)

Application Layer (OSI Layer 7)

Transport Layer (TCP/ IP Layer 3)

Transport Layer (OSI Layer 4)

Internet Layer (TCP/ IP Layer 2)

Network Layer (OSI Layer 3)

Network Access Layer (TCP/ IP Layer 1)

Data Link Layer (OSI Layer 2)

Physical Layer (OSI Layer 1)

NDIS NDIS

Page 15: C# Workshop - Networking

Socket Typen

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

Page 16: C# Workshop - Networking

Wichtig

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

Page 17: C# Workshop - Networking

Networking Assemblies in C# 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

Page 18: C# Workshop - Networking

IP Adressierung & Domain Name Services

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

Page 19: C# Workshop - Networking

Beispiel: IP Adressierung & Domain Name Services

IPAddress ExampleAddress = IPAddress.Parse("192.168.1.1");

foreach (IPAddress HostIPAddress in Dns.GetHostEntry("www.microsoft.com").AddressList) { Console.WriteLine(HostIPAddress.ToString()); }

Adressen ermittelnString to IP Conversion

Page 20: C# Workshop - Networking

Socket Klasse

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

Page 21: C# Workshop - Networking

Direktes Arbeiten mit Sockets

Vorteil Hohe Anpassung möglich Raw Sockets möglich

Nachteil Keine einfache Handhabung

Normalerweise ist direktes Arbeiten mit Sockets nicht erforderlich

Page 22: C# Workshop - Networking

Servers?

What is a Server?

Page 23: C# Workshop - Networking

Client-Server Architektur 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

Page 24: C# Workshop - Networking

Peer-To-Peer Architektur

Client und Server nicht getrennt

Peers können Dienste sowohl anfordern als auch bereitstellen

Page 25: C# Workshop - Networking

Beispiel: Hello World im Netzwerk (Client-Server Architektur)

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

Page 26: C# Workshop - Networking

Server Applikation

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()

Page 27: C# Workshop - Networking

Beispiel: Server Socket

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(new IPEndPoint(IPAddress.Any, PORT));

listener.Listen(0);

Console.WriteLine("Waiting for incoming V4 connections on " + PORT);

Socket socket = listener.Accept(); listener.Close();

byte[] b = new byte[100]; int len; while ((len = socket.Receive(b)) != 0) { System.Console.WriteLine("RXv4: Received Packet with length: " + len); Console.WriteLine("Package Content Begin--->"); Console.WriteLine(Encoding.ASCII.GetString(b).Trim()); Console.WriteLine("<---Package Content End"); b = new byte[100]; }

socket.Send(b); socket.Close();

Socket Objekt erstellenSocketparameter

übermitteln

Port an Socket bindenAuf Port lauschen

Neuer Socket aus angenommener

Verbindungsanfrage

Bytes empfangen

Empfangspuffer

Bytes senden

Verbindung beenden

Page 28: C# Workshop - Networking

Client Applikation

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

Page 29: C# Workshop - Networking

Beipiel: Client Socket

IPAddress ipav4 = IPAddress.Parse(IPv4_ADDR); IPEndPoint ipehv4 = new IPEndPoint(ipav4, PORT); Socket connectionv4 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { connectionv4.Connect(ipehv4); byte[] b = Encoding.ASCII.GetBytes(String.Format("This is a message.")); Console.WriteLine("TXv4: Sending Packet with length: " + b.Length.ToString()); Console.WriteLine("Package Content Begin--->"); Console.WriteLine(Encoding.ASCII.GetString(b).Trim()); Console.WriteLine("<---Package Content End"); connectionv4.Send(b, SocketFlags.None); b = new byte[1]; connectionv4.Send(b, SocketFlags.None); } catch { } finally { connectionv4.Close(); }

IP Adresse definieren IP Endpunkt aus IP Adresse + Port definieren

Verbindung zu Endpunkt herstellen

Verbindung zu Endpunkt herstellen

Terminierungsnachricht sendenVerbindung beenden

Page 30: C# Workshop - Networking

Raw Socket

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

Page 31: C# Workshop - Networking

TCPClient, TCPListener & UDPClient

Vereinfachen den Umgang mit Sockets

Liefern einfache Schnittstelle zur Kommunikation mit TCP & UDP

Verwenden automatisch Sockets

TCPClientTCPListen

erUDPClien

t

Socket

WinSock API

Page 32: C# Workshop - Networking

TCPClient

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()

Page 33: C# Workshop - Networking

Beispiel: TCPClient

TcpClient tcpClient = null; try { tcpClient = new TcpClient(Host, RemotePort);

NetworkStream netStream = tcpClient.GetStream(); Byte[] sendBytes = new Byte[1500]; sendBytes[0] = 0x31;

netStream.Write(sendBytes, 0, sendBytes.Length);

Byte[] receiveBytes = new Byte[1500]; netStream.Read(receiveBytes, 0, receiveBytes.Length); Console.WriteLine(Encoding.ASCII.GetString(receiveBytes)); } catch { } finally { tcpClient.Close(); }

TCPClient Objekt deklarieren

Ziel-Endpunkt übergeben

Netzwerk Stream erstellen

Bytes senden

Bytes empfang

en

Page 34: C# Workshop - Networking

TCPListener

Lauscht auf eingehende TCP Verbindungen

Gegenstück zum TCPClient Kann TCPClient Accepten, aber auch

Socket Funktionsweise wie Server Socket

Page 35: C# Workshop - Networking

Beispiel: TCPListener

TcpListener tcpListener = null; TcpClient tcpClient = null; try { tcpListener = new TcpListener(IPAddress.Any, 80); tcpListener.Start(0); tcpClient = tcpListener.AcceptTcpClient();

NetworkStream netStream = tcpClient.GetStream();

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(); }

TCPListener + ClientObjekt deklarieren

Zu lauschende Adresse +

PortClient annehm

enNetzwerk Stream

erstellen

Page 36: C# Workshop - Networking

UDPClient

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()

Page 37: C# Workshop - Networking

Beispiel: UDPClient

UdpClient udpClient = new UdpClient(LocalPort); try { udpClient.Connect(Host, RemotePort); Byte[] sendBytes = new Byte[13]; sendBytes[0] = 0x31; udpClient.Send(sendBytes, sendBytes.Length); IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); Console.WriteLine(Encoding.ASCII.GetString(receiveBytes)); } catch { } finally { udpClient.Close(); }

UDPClient Objekt deklarieren

(optional) Host und Port festlegen

Bytes senden

Bytes empfang

en

Page 38: C# Workshop - Networking

WebClient

Stellt Routinen für den Abruf von URIs (Uniform Resource Identifier) bereit

Unterstützung von http:, https:, ftp:, file:

Verwendet HttpWebRequest HttpWebResponse FtpWebRequest FtpWebResponse

Page 39: C# Workshop - Networking

Beispiel: WebClient

WebClient client = new WebClient(); client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

client.DownloadFile("http://localhost/IE_T.png", "IE.png");

Stream data = client.OpenRead("http://localhost/index.html"); StreamReader reader = new StreamReader(data); string s = reader.ReadToEnd(); Console.WriteLine(s);

data.Close(); reader.Close();

WebClient Objekt deklarieren

WebClient Optionen ändern

Datei laden

Stream extrahieren

Page 40: C# Workshop - Networking

ICMP Ping

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

Page 41: C# Workshop - Networking

Beispiel: ICMP Ping

Ping myPing = new Ping(); byte[] buffer = new byte[buffersize]; int timeout = 1000; PingOptions pingOptions = new PingOptions(); PingReply reply = myPing.Send(host, timeout, buffer, pingOptions); if (reply.Status == IPStatus.Success) { return ("Antwort in " + reply.RoundtripTime.ToString() + "ms erhalten Bytes=" + reply.Buffer.Length.ToString()); } else if (reply.Status == IPStatus.TimedOut) { return ("Timeout"); } else { return reply.Status.ToString(); }

Ping Objekt deklarieren

Byte Buffer

Ping Optionen

Ping Senden

Status Checken

Page 42: C# Workshop - Networking

Email Versand

System.Net.Mail NameSpace enthält Klassen

SmtpClient Versendet▪ MailMessage mit▪ MailAddress▪ Subject▪ Body▪ MailAttachment

Benötigt ggf.▪ NetworkCredentials

Page 43: C# Workshop - Networking

Beispiel: Email Versand

MailAddress from = new MailAddress("[email protected]", "Qiong Wu"); MailAddress to = new MailAddress("[email protected]", "Roman Brehm");

MailMessage message = new MailMessage(from, to); message.Subject = "FYI: Hot Topic"; message.Body = "Hi Roman, this is Qiong"; message.Attachments.Add(new Attachment("test.html"));

SmtpClient emailClient = new SmtpClient("smtp.example.com", 587); System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("User", "Password");

emailClient.Credentials = SMTPUserInfo; emailClient.Send(message); Console.WriteLine("Message Sent");

Email Adressen definieren

Nachricht erstellen

SMTP Server festlegen

Email senden

Zugangsdaten zuweisen

Page 44: C# Workshop - Networking

Blocking Networks

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

Page 45: C# Workshop - Networking

Multithreaded Server

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

Page 46: C# Workshop - Networking

Threads?

Im letzten Kapitel lernten wir etwas über Threads…

Page 47: C# Workshop - Networking

Schema eines Multithreaded Servers

Main Thread

Listener Socket Erstellen

ClientSocket erstellen

Client Handler Thread

Auf Listener Socket lauschen

Kommunikation mit Client

Bei Clientannahme

ClientSocket schließen

Thread erstellen

Page 48: C# Workshop - Networking

Beispiel: Multithreaded Server (Main Thread)

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("[ServerThread]: Waiting for incoming V4 connections on " + PORT); while (true) { Socket socket = listener.Accept(); Console.WriteLine("[ServerThread]: Client connected"); ThreadPool.QueueUserWorkItem(new WaitCallback(AcceptClient), socket); } } catch { } finally { listener.Close(); }

Page 49: C# Workshop - Networking

Beispiel: Multithreaded Server (ClientThread)

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("[ClientThread]: Received Packet with length: " + len); Console.WriteLine("[ClientThread]: Package Content Begin--->"); Console.WriteLine("[ClientThread]: " + Encoding.ASCII.GetString(b).Trim()); Console.WriteLine("[ClientThread]: <---Package Content End"); b = new byte[100]; } Client.Send(b); } catch { } finally { Client.Close(); } }

Page 50: C# Workshop - Networking

Protokolle implementieren

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

Page 51: C# Workshop - Networking

Request for Comments (RFC) 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/

Page 52: C# Workshop - Networking

Netzwerke unter der Lupe Netzwerksniffer

Wireshark, früher Ethereal

Analysiert Netzwerkverkehr

Schlüsselt die meisten Protokolle auf

Sehr nützlich für Reverse Engineering / Debugging

Page 53: C# Workshop - Networking
Page 54: C# Workshop - Networking
Page 55: C# Workshop - Networking
Page 56: C# Workshop - Networking

Reverse Engineering

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

Page 57: C# Workshop - Networking

Ausblick: Windows Communications Foundation

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