1. Netzwerke, Sockets und Server
C# Workshop, TU Darmstadt 2008,
Präsentation von Qiong Wu (Microsoft Student Partner)
2. Kommunikation zwischen Applikationen
Bereitstellen von Services
Server Applikationen
Client Applikationen
Anbindung an das Internet
3. Kommunikationsnetze sind das A und O
heutiger Computerapplikationen
Ohne Kommunikationsnetze wäre IT
heutzutage nicht IT
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. • 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. 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. 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. 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. 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. 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. 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. 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. Schnittstelle zur Netzwerkkommunikation
Berkeley Sockets / Microsoft Winsock
Verschiedene Sockettypen
Raw Sockets
Datagram Sockets
Stream Sockets
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. 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. 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. 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. 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. 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. 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. Vorteil
Hohe Anpassung möglich
Raw Sockets möglich
Nachteil
Keine einfache Handhabung
Normalerweise ist direktes Arbeiten mit
Sockets nicht erforderlich
22.
23. 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
24. Client und Server nicht
getrennt
Peers können Dienste
sowohl anfordern als
auch bereitstellen
25. 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
26. 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()
27. 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
28. 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
29. 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();
}
30. 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
31. Vereinfachen den
TCPClient TCPListener UDPClient
Umgang mit Sockets
Liefern einfache
Socket
Schnittstelle zur
Kommunikation mit WinSock API
TCP & UDP
Verwenden
automatisch Sockets
32. 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()
34. Lauscht auf eingehende TCP Verbindungen
Gegenstück zum TCPClient
Kann TCPClient Accepten, aber auch Socket
Funktionsweise wie Server Socket
36. 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()
37. 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();
}
38. Stellt Routinen für den Abruf von URIs
(Uniform Resource Identifier) bereit
Unterstützung von http:, https:, ftp:, file:
Verwendet
HttpWebRequest
HttpWebResponse
FtpWebRequest
FtpWebResponse
39. 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
40. 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
41. 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();
}
43. 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
44. 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
45. 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
46. Im letzten Kapitel lernten wir etwas über
Threads…
47. Main Thread Client Handler Thread
Listener Socket Kommunikation mit
Erstellen Client
Auf Listener Socket
lauschen ClientSocket schließen
Bei Clientannahme
ClientSocket erstellen
Thread erstellen
49. 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();
}
}
50. 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
51. 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/
52. Netzwerksniffer
Wireshark, früher
Ethereal
Analysiert
Netzwerkverkehr
Schlüsselt die meisten
Protokolle auf
Sehr nützlich für
Reverse Engineering /
Debugging
53.
54.
55.
56. 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
57. 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