Upload
qiong-wu
View
2.079
Download
2
Embed Size (px)
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("[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
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