C# Workshop - Networking

Preview:

DESCRIPTION

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

Citation preview

Netzwerkprogrammierungmit C#

Netzwerke, Sockets und Server

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

Wieso Networking?

Kommunikation zwischen Applikationen

Bereitstellen von Services Server Applikationen Client Applikationen Anbindung an das Internet

Netzwerke in der echten Welt

Kommunikationsnetze sind das A und O heutiger Computerapplikationen

Ohne Kommunikationsnetze wäre IT heutzutage nicht IT

Netzwerkprotokolle

TCPUDP

IPv4

IPX

SIP RTP

HTTP

SCTP

RTSP

RSVP

FTP

SMTP

POP

IPv6

Ethernet

Token Ring

Telnet

DNS

NTP

SSHICMP

IGMP

RIP

PPP

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

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

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

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

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

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

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

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

Sockets

Schnittstelle zur Netzwerkkommunikation

Berkeley Sockets / Microsoft Winsock Verschiedene Sockettypen

Raw Sockets Datagram Sockets Stream Sockets

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

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

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

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

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

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

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

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

Servers?

What is a Server?

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

Peer-To-Peer Architektur

Client und Server nicht getrennt

Peers können Dienste sowohl anfordern als auch bereitstellen

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

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

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

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

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

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

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

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

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

TCPListener

Lauscht auf eingehende TCP Verbindungen

Gegenstück zum TCPClient Kann TCPClient Accepten, aber auch

Socket Funktionsweise wie Server Socket

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

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

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

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

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

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

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

Email Versand

System.Net.Mail NameSpace enthält Klassen

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

Benötigt ggf.▪ NetworkCredentials

Beispiel: Email Versand

MailAddress from = new MailAddress("qiong.wu@studentpartners.de", "Qiong Wu"); MailAddress to = new MailAddress("roman.brehm@studentpartners.de", "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

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

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

Threads?

Im letzten Kapitel lernten wir etwas über Threads…

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

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

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

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

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/

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

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

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

Recommended