Interprocess Communication (IPC) The characteristics of protocols for communication between processes in a distributed system
Exploring the Middleware Layers Applications, services RMI and RPC and Request Reply Protocol Marshalling and External Data Representation UDP and TCP Operating System
Characteristics of IPC ● Message passing between a pair of processes supported by SEND and RECEIVE operations ● Synchronous - sending and receiving processes synchronize every message, and BLOCK ● Asynchronous - sending is NON-BLOCKING, receiving can be both BLOCKING and NON- BLOCKING ● Non-blocking receives are complex, so most systems employ the blocking form of receive
Other IPC Characteristics ● Message destinations - typically specified as address/port pairs (end-points) ● Reliability - both reliable and unreliable IPCs are possible ● Ordering - often, applications require SENDER ORDERING to be maintained
Example IPC Mechanism - Sockets agreed port any port socket socket message client server other ports Internet address = 138.37.94.248 Internet address = 138.37.88.249
UDP Datagram Communication ● Datagrams sent without ACKs or retries ● Message sizes are often pre-negotiated ● Fragmentation can occur ● Blocking sends and receives are common - timeouts can be used, but these can be tricky ● Datagram discarding occurs when no receiving process is waiting
UDP's Failure Model ● Omission Failures - messages dropped, checksum errors, lack of buffer space ● Both send-omissions and receive-omissions can occur ● Ordering - messages can arrive out-of-order ● Applications that use UDP need to provide their own checks
Usages of UDP ● Applications that do not suffer from the overheads associated with guaranteed message delivery ● DNS ● VoIP
Example UDP Client in Java import java.net.*; import java.io.*; public class UDPClient{ public static void main(String args[]){ // args give message contents and server hostname DatagramSocket aSocket = null; try { aSocket = new DatagramSocket(); byte [] m = args[0].getBytes(); InetAddress aHost = InetAddress.getByName(args[1]); int serverPort = 6789; DatagramPacket request = new DatagramPacket(m, args[0].length(), aHost, serverPort); aSocket.send(request); byte[] buffer = new byte[1000]; DatagramPacket reply = new DatagramPacket(buffer, buffer.length); aSocket.receive(reply); System.out.println("Reply: " + new String(reply.getData())); }catch (SocketException e){System.out.println("Socket: " + e.getMessage()); }catch (IOException e){System.out.println("IO: " + e.getMessage());} }finally {if(aSocket != null) aSocket.close();} } }
Example UDP Server in Java import java.net.*; import java.io.*; public class UDPServer{ public static void main(String args[]){ DatagramSocket aSocket = null; try{ aSocket = new DatagramSocket(6789); byte[] buffer = new byte[1000]; while(true){ DatagramPacket request = new DatagramPacket(buffer, buffer.length); aSocket.receive(request); DatagramPacket reply = new DatagramPacket(request.getData(), request.getLength(), request.getAddress(), request.getPort()); aSocket.send(reply); } }catch (SocketException e){System.out.println("Socket: " + e.getMessage()); }catch (IOException e) {System.out.println("IO: " + e.getMessage());} }finally {if(aSocket != null) aSocket.close();} } }
TCP Streamed Communication ● Stream of bytes transferred from sender to receiver ● Characteristics of the network are hidden/transparent to applications ● Messages sizes can be small or large ● An ACK scheme deals with lost messages ● Flow control mechanisms throttle fast senders ● Message duplication is handled, ordering is maintained ● Message destinations are "stream end-points"
More of TCP ● When establishing communication, one side is the client, the other is the server ● Thereafter, both can operate as peers, if needs be ● Pairs of sockets are connected by pairs of streams, one for input, the other for output
TCP's Failure Model ● Checksums detect and reject corrupt packets ● Sequence numbers detect and reject duplicate packets ● Timeouts and retransmissions deal with lost packets ● TCP is not totally reliable, as it does not guarantee delivery of messages in the face of all possible difficulties
TCP's Unreliability ● When a connection is broken, a process is notified if it attempts to read or write ● Has the network failed or has the process at the other end-point failed? ● Where are previous sent messages actually received?
Example TCP Client in Java import java.net.*; import java.io.*; public class TCPClient { public static void main (String args[]) { // arguments supply message and hostname of destination Socket s = null; try{ int serverPort = 7896; s = new Socket(args[1], serverPort); DataInputStream in = new DataInputStream( s.getInputStream()); DataOutputStream out = new DataOutputStream( s.getOutputStream()); out.writeUTF(args[0]); // UTF is a string encoding see Sn 4.3 String data = in.readUTF(); System.out.println("Received: "+ data) ; }catch (UnknownHostException e){ System.out.println("Sock:"+e.getMessage()); }catch (EOFException e){System.out.println("EOF:"+e.getMessage()); }catch (IOException e){System.out.println("IO:"+e.getMessage());} }finally {if(s!=null) try {s.close();}catch (IOException e) {System.out.println("close:"+e.getMessage());}} } }
Example TCP Server in Java import java.net.*; import java.io.*; public class TCPServer { public static void main (String args[]) { try{ int serverPort = 7896; ServerSocket listenSocket = new ServerSocket(serverPort); while(true) { Socket clientSocket = listenSocket.accept(); Connection c = new Connection(clientSocket); } } catch(IOException e) {System.out.println("Listen :"+e.getMessage());} } } class Connection extends Thread { DataInputStream in; DataOutputStream out; Socket clientSocket; public Connection (Socket aClientSocket) { try { clientSocket = aClientSocket; in = new DataInputStream( clientSocket.getInputStream()); out =new DataOutputStream( clientSocket.getOutputStream()); this.start(); } catch(IOException e) {System.out.println("Connection:"+e.getMessage());} } public void run(){ try { // an echo server String data = in.readUTF(); out.writeUTF(data); } catch(EOFException e) {System.out.println("EOF:"+e.getMessage()); } catch(IOException e) {System.out.println("IO:"+e.getMessage());} } finally{ try {clientSocket.close();}catch (IOException e){/*close failed*/}} } }
IPC and Data External Data Representation and Marshalling
The Problem ● Running programs (processes) are represented as (binary) data structures ● Information in messages is represented as a sequence of bytes ● How do we transform one into the other and vice- versa?
Flattening ● Data structures must be flattened into a sequence of bytes before transmission and rebuilt on receipt ● Byte-ordering (little- or big-endian?) is an issue ● Character encodings (ASCII, Unicode) are an issue, too
Exchanging Binary Data ● Values are converted to an agreed external format ● Values are transmitted in the sender's format; the recipient converts that values if necessary ● An agreed standard for the representation of data structures and primitive values is called an "external data representation"
Marshalling and Unmarshalling ● Marshalling - taking a collection of data items and assembling them into a form suitable for transmission in a message ● Unmarshalling - disassembling a message on arrival to produce an equivalent collection of data items at the destination
Three Alternative Approaches ● CORBA's Common Data Representation (CDR) - can be used with a variety of programming technologies ● Java's Object Serialization - works only within the Java environment ● XML (Extensible Markup Language) - a textual format for representing structured data that works with any programming technology
CORBA's CDR ● CDR can represent 15 primitive types and a range of composite types ● Both little- and big-endian support is provided - senders indicate in which ordering the message is transmitted ● Floating-point numbers use the IEEE standard ● Characters are represented in a code-set agreed between the sender and receiver ● Data type information is NOT transmitted
CORBA CDR's Composite Types Type Representation length (unsigned long) followed by elements in order sequence length (unsigned long) followed by characters in order (can also string can have wide characters) array elements in order (no length specified because it is fixed) array in the order of declaration of the components struct unsigned long (the values are specified by the order declared) enumerated type tag followed by the selected member union
CORBA CDR - Example Message notes index in on representation 4 bytes sequence of bytes 5 length of string 0–3 "Smit" 4–7 ‘Smith’ "h___" 8–11 6 12–15 length of string "Lond" 16–19 ‘London’ "on__" 20-23 1934 24–27 unsigned long The flattened form represents a Person struct with value: {‘Smith’, ‘London’, 1934}
Recommend
More recommend