Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Per P Madsen AAU1 Del 3 : Transportlaget - Protokoller. UDP. TCP - Pålidelig kommunikation og PAR-princippet - Wireless TCP - Socket-API’en.

Lignende præsentationer


Præsentationer af emnet: "Per P Madsen AAU1 Del 3 : Transportlaget - Protokoller. UDP. TCP - Pålidelig kommunikation og PAR-princippet - Wireless TCP - Socket-API’en."— Præsentationens transcript:

1 Per P Madsen AAU1 Del 3 : Transportlaget - Protokoller. UDP. TCP - Pålidelig kommunikation og PAR-princippet - Wireless TCP - Socket-API’en

2 Per P Madsen AAU2 OSI modellen Network Fysisk Data link Transport Session Presentation Applikation Skabe forbindelse mellem to programmer/processer. Håndtering af integritet fx TCP og UDP protokollerne Connection Reliabel Sekvens Flow Control Buffering Stream Congestion control

3 Per P Madsen AAU3 Transportlag Problem: Hvordan skabes der kontakt mellem to programmer, når der kan køre mange programmer på både sender maskinen og modtager maskinen. Løsning: Portnumre. 1 2.. 80.. http://www.iana.org/assignments/port-numbers 1 2. 21... PortmapProgrammer

4 Per P Madsen AAU4 Transportlag Administration af portnumre: http://www.iana.org/assignments/port-numbers IANA standard porte: 0 – 1023 Fx: 7 – echo 11 – systat 21 – ftp 80 – WWW IANA registrering: 1024 – 49151 Fx 26000 – Quake For dynamisk og privat brug: 49152 til 65535

5 Per P Madsen AAU5 Transportlag: UDP User Datagram Protokol: Kun håndtering af porte. Dvs: Connectionless. Unreliabel. Ingen sekvens håndtering. Ingen Flow Control. Ingen Congestion Control. Men effektiv.

6 Per P Madsen AAU6 Transportlag: UDP DatalinkNetværkUDP-headerData Samlet dataframe med UDP transportprotokol. Anvendelse: Voice over IP, Proceskontrol, semi-RealTime, Eksperimental protokol.

7 Per P Madsen AAU7 Transportlag: TCP Transport Control Protokol: Etablering af en sikker kanal mellem to programmer. Dvs: Connection-oriented. Reliabel. Sekvens håndtering. Flow Control. Congestion control. Fuld duplex. Streaming. Buffering. Kræver to-vejs kommunikation med acknowledged og handshake.

8 Per P Madsen AAU8 Transportlag: TCP Connection-oriented. Dvs: Punkt til punkt forbindelse med: Reliable connection startup. Graceful connection shutdown. Metode: The 3-way handshake Host 1 Host 2 Hej! Jeg vil snakke med dig Hej! Jeg har forstået og er klar. Jeg er også klar.

9 Per P Madsen AAU9 Transportlag: TCP Reliabel? Metode: Positive Acknowledgement with Retransmission (PAR) Modtager Sender positiv Ack. Sender Timer Sender data og starter timer Sender positiv Ack. Sender data og starter timer Timer

10 Per P Madsen AAU10 Transportlag: TCP Fejl: Datagram loss, fejl i data, forsinkelser. Modtager Sender data og starter timer Sender Timer Sender positiv Ack. Timer

11 Per P Madsen AAU11 Transportlag: TCP Timer: Kort tid => bedre effektivitet. For kort tid => for mange retransmissioner, dermed dårligere effektivitet. Timer estimering: RTT: Middel Round-trip time. M: Målt Round-trip time. RTT= a*RTT+(1-a)*M. Timer fx: Time = 1,5 * RTT

12 Per P Madsen AAU12 Transportlag: TCP D= D*b+(1-b)*|RTT-M| Dvs D er et estimat af spredningen. Time = RTT + 4 * D

13 Per P Madsen AAU13 Transportlag: TCP Sekvens håndtering. Flow Control. Streaming. Buffering. Løsning: Brug af Window management.

14 Per P Madsen AAU14 Transportlag: TCP Window management.

15 Per P Madsen AAU15 Transportlag: TCP Congestion control. Problem: Der kan være flaskehalse i et WAN net. Timeout skyldes oftest for megen trafik og ikke fejl. Retransmission forøger trafikken. Løsning: Der retransmiteres ved timeout, dog med mindre datamængder.

16 Per P Madsen AAU16 Transportlag: TCP Congestion control. Init: Threshold= 32 Kbyte CW= 1500 byte (Ethernet) If Not timeout If CW < Threshold. CW= 2 * CW Else CW= CW + 1K If timeout Threshold = ½* CW CW= 1500 byte

17 Per P Madsen AAU17 Transportlag: TCP Header. Source port og Dest. Port: Portnumre på hhv. sender og modtager siden. Sequence number: Adressen på den første byte i data. Ack. number: Piggybacket Ack. adressen på korrekt modtaget datamængde. TCP header length: Headerlængde.

18 Per P Madsen AAU18 Transportlag: TCP Header. URG bit samt Urgent pointer: Special besked, der sendes direkte igennem. ACK bit: Ack. nummeret er validt. PSH bit: Spring input buffer over. RET bit: Resetter forbindelse ved fejl. SYN og FIN: Bruges til oprettelse og nedlæggelse af en connection.

19 Per P Madsen AAU19 Transportlag: TCP Header. Window size: Buffer plads i senderens input buffer. Checksum: 1. kompliment af header + pseudoheader + data.

20 Per P Madsen AAU20 En løsning: WireLess TCP Fastnet: Manglende Ack. skyldes congestion og ikke fejl. WireLess: Manglende Ack. skyldes som regel fejl i data eller pakke tab. Så hvis manglende Ack. Så send pakken igen. fysisk Datalink Netværk fysisk Datalink Netværk Base station Transp.

21 Per P Madsen AAU21 API – Application Program Interface Fysisk Data Link Network Transport Session Presentation Application Socket RPC, RMI og CORBA

22 Per P Madsen AAU22 Socket int sock; sock=socket(,, ); bind(sock,, ); listen(sock, ); newsock=accept(sock,, ) sock=socket(,, ); bind(sock,, ); connect(sock,, )

23 Per P Madsen AAU23 Clinet-Server 1 2..... 1 2..... Client Server Socket Connect Send Req. Recive Reply. Socket Bind Listen Wait for Req. Read req. Serve req. Send Reply. En fuld forbindelse: (Client adr, Client port, Server adr, Server port, Protokol)

24 Per P Madsen AAU24 TCP-server if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {printf("server: can't open strem socket"); exit(0);} serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(50000); if (bind(sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0) {printf("server: can't bind local add"); exit(0);} listen(sockfd, 5); while (1) {newsockfd = accept(sockfd, (struct sockaddr *) & cli_addr, &cli_size); if (!(childpid = fork())) {close(sockfd); n = read(newsockfd, request_string, MAX_LENGTH); //do service write(newsockfd, reply_string, n); exit(0);} close(newsockfd); }

25 Per P Madsen AAU25 TCP-client serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("130.225.50.10"); serv_addr.sin_port = htons(50000); If ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {printf("client: can't open stream socket\n"); exit(0);} if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) {printf("client: can't connect to server\n"); exit(0);} write(sockfd, request_string, strlen(request_string)); n = read(sockfd, reply_string, MAX_LENGTH); //proces reply. close(sockfd);

26 Per P Madsen AAU26 UDP-server if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {printf("server: can't open datagram socket"); exit(0);} serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(50000); if (bind(sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0) {printf("server: can't bind local add"); exit(0);} while (1) {n = recvfrom(sockfd, request_string, MAX_LENGTH, 0, (struct sockaddr *) & cli_addr, &str_s); //serve request_string. sendto(sockfd, reply_string, strlen(reply_string), 0, (struct sockaddr *) & cli_addr, str_s); }

27 Per P Madsen AAU27 UDP-client if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {printf("client: can't open datagram socket\n"); exit(0);} serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("130.225.50.10"); serv_addr.sin_port = htons(50000); cli_addr.sin_family = AF_INET; cli_addr.sin_addr.s_addr = htonl(INADDR_ANY); cli_addr.sin_port = htons(0); if (bind(sockfd, (struct sockaddr *) & cli_addr, sizeof(cli_addr)) < 0) {printf("client: can't bind local add\n"); exit(0);} sendto(sockfd, request_string, strlen(request_string), 0, (struct sockaddr *) & serv_addr, str_s); //proces reply. n = recvfrom(sockfd, reply_string, MAX_LENGTH, 0, (struct sockaddr *) & rec_addr, &str_s); close(sockfd);

28 import java.io.*; import java.net.*; public class Server extends Thread { public final static int DEFAULT_PORT = 50000; protected int port; protected ServerSocket listen_socket; public static void fail(Exception e, String msg) { System.err.println(msg + ": " + e); System.exit(1); } public Server(int port) { if (port == 0) port = DEFAULT_PORT; this.port = port; try { listen_socket = new ServerSocket(port); } catch (IOException e) { fail(e, "Exception creating server socket"); } System.out.println("Server: listening on port " + port); this.start(); } public void run() { try { while(true) { Socket client_socket = listen_socket.accept(); Connection c = new Connection(client_socket); } } catch (IOException e){fail(e,"Exception while listening for connections");} } public static void main(String[] args) { int port = 0; if (args.length == 1) { try { port = Integer.parseInt(args[0]); } catch (NumberFormatException e) { port = 0; } } new Server(port); }

29 class Connection extends Thread { protected Socket client; protected DataInputStream in; protected PrintStream out; public Connection(Socket client_socket) { client = client_socket; try { in = new DataInputStream(client.getInputStream()); out = new PrintStream(client.getOutputStream()); } catch (IOException e) { try { client.close(); } catch (IOException e2) { ; } System.err.println("Exception while getting socket streams: " + e); return; } this.start(); } public void run() { String line; StringBuffer revline; int len; try { for(;;) { line = in.readLine(); if (line == null) break; len = line.length(); revline = new StringBuffer(len); for(int i= len-1; i>=0; i--) revline.insert(len-1-i, line.charAt(i)); out.println(revline); } } catch (IOException e) { ; } finally { try {client.close();} catch (IOException e2) {;} } }

30 import java.io.*; import java.net.*; public class Client { public static final int DEFAULT_PORT = 50000; public static void main(String[] args) { int port = DEFAULT_PORT; Socket s = null; if (args.length == 1) port = DEFAULT_PORT; else { try { port = Integer.parseInt(args[1]); } catch (NumberFormatException e) { usage(); } } try { s = new Socket(args[0], port); DataInputStream sin=new DataInputStream(s.getInputStream()); PrintStream sout = new PrintStream(s.getOutputStream()); DataInputStream in = new DataInputStream(System.in); System.out.println("Connected to "+s.getInetAddress()+":"+s.getPort()); String line; while(true) { System.out.print("> "); System.out.flush(); line = in.readLine(); if (line == null) break; sout.println(line); line = sin.readLine(); System.out.println(line); } catch (IOException e) { System.err.println(e); } finally { try { if (s != null) s.close(); } catch (IOException e2) { ; } } }

31 import java.io.*; import java.net.*; public class UDPReceive { static final int port = 50001; public static void main(String args[]) throws Exception { byte[] buffer = new byte[1024]; String s; DatagramSocket socket = new DatagramSocket(port); for(;;) { DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); s = new String(buffer, 0, packet.getLength()); System.out.println("UDPReceive: received from " + packet.getAddress().getHostName() + ":" + packet.getPort() + ": " + s); } UDP-server

32 import java.io.*; import java.net.*; public class UDPSend { static final int port = 50001; public static void main(String args[]) throws Exception { if (args.length != 2) { System.out.println("Usage: java UDPSend "); System.exit(0); } InetAddress address = InetAddress.getByName(args[0]); int msglen = args[1].length(); byte[] message = new byte[msglen]; message=args[1].getBytes(); // Initilize the packet with data and address DatagramPacket packet = new DatagramPacket(message, msglen, address, port); // Create a socket, and send the packet through it. DatagramSocket socket = new DatagramSocket(); socket.send(packet); } UDP-client


Download ppt "Per P Madsen AAU1 Del 3 : Transportlaget - Protokoller. UDP. TCP - Pålidelig kommunikation og PAR-princippet - Wireless TCP - Socket-API’en."

Lignende præsentationer


Annoncer fra Google