Vous êtes sur la page 1sur 19

CSS490 Message Passing

Textbook Ch2 - 3
Instructor: Munehiro Fukuda

These slides were compiled from the course textbook, the reference books, and
the instructors original materials.

Winter, 2004

CSS490 Message Pass

OSI 7 Layers
Site
A
7

Application

Presentation

Session

Transport

Network

Data link

Physical

Site
B
Application protocol
Presentation protocol
Session protocol
Transport protocol
Network protocol
Data link protocol
Physical protocol

Application
Presentation
Session

rsh, ftp, Telnet

Dealing with heterogeneit


And cryptography
Dialog control
(rarely supported)

Transport

UDP, TCP

Network

IP

Data link

IEEE802.2
connection or connectionle

Ethernet
Physical

Network

Winter, 2004

CSS490 Message Pass

Physical/Data Link Layer


Example: CSMA/CD and Token Ring

1 listen

3. detect

2 transmit

1. Free token

2. Attach
3. busy token

Winter, 2004

IEEE802.3: CSMA/CD (Carrier sense


multiple access with collision detection)
1.
Listening to the shared medium
2.
Transmitting a data packet
3.
Detecting collision on the medium
4.
Deferring and retransmitting a
packet in 2ktime base collision
window
IEEE802.5: Token Ring
1.
Receiving a free token from my (left)
neighbor
2.
Attaching a data packet to the token
3.
Forwarding the token to my (right)
neighbor
4.
Detaching a packet from the token if
it is addressed here

4. Detach

CSS490 Message Pass

Network Layer
Example: IP
Transportation layer
Datagram
Class A
fragmentation
SDL

reassembly

SDL
IP packet ID and size
Destination IP address
Source IP address

0 Net #
Octet 1
0-127

Host #
Octet 2 4
(1,677,716)

Class B

IP packet ID and size 1 0


Net #
Destination IP address Octet 1
Octet 2
Source IP address
128-191

Host #
Octet 3 4
(65,536)

Class C
110

Data link layer


Best-effort deliver semantics

Octet 1
128-191

Net #

Host#

Octet 2 3

Octet 4
(256)

Class D: for broadcasting

Winter, 2004

CSS490 Message Pass

Transport Layer:
Example1: UDP
client
socket()
bind()

sendto()

User Datagram Protocol


Connectionless
Create a sock descriptorsocket()
May be lost
Bind it to an IP address bind()
No FIFO order
Multicast feature
recvfrom()
Unix datagram
Blocks until data received Example: TFTP, rwho

recvfrom()

Winter, 2004

server

sendto()

CSS490 Message Pass

Transport Layer:
Example2: TCP
client

server

Transport Control Protocol


Connection-oriented
Reliable
Bind it to an IP address bind()
FIFO order
liseten()
Declare this is connection-oriented
No Multicast feature
Unix stream socket
Wait for a connection accept()
Example: ftp, http, rsh
Connection established
connect()
all major applications
Blocks until connection established
socket()

Create a sock descriptorsocket()

write()

read()

read()

wrte()

Winter, 2004

CSS490 Message Pass

Application Layer
Example: RSH
Client

Server

shell

TCP connection
request

Command
rsh ls- l

inetd

rshd

TCP connection
Inherited all the way
To a child

shell

Command
ls -l

Winter, 2004

CSS490 Message Pass

Socket Programming:
Socket.h
#include <iostream>

extern "C"
{
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <string.h>
}

// for sockets

// for gethostbyname( )
// for close( )
// for bzero( )

#define NULL_FD -1
#define MAXSIZE 20
class Socket {
public:
Socket( int );
~Socket( );
int getClientSocket( char[] );
int getServerSocket( );
private:
int port;
int clientFd;
int serverFd;
};

Winter, 2004

CSS490 Message Pass

Socket Programming:
Socket.cpp (Client)
// Fill in the structure "sendSockAddr" with the server address.
sockaddr_in sendSockAddr;
bzero( (char*)&sendSockAddr, sizeof( sendSockAddr ) );
sendSockAddr.sin_family
= AF_INET; //Address Family Internet
sendSockAddr.sin_addr.s_addr =
inet_addr( inet_ntoa( *(struct in_addr*)*host->h_addr_list ) );
sendSockAddr.sin_port
= htons( port );

#include "Socket.h"
Socket::Socket( int port )
: port( port ), clientFd( NULL_FD ),
serverFd( NULL_FD ) {
}
Socket::~Socket( ) {
if ( clientFd != NULL_FD )
close( clientFd );
if ( serverFd != NULL_FD )
close( serverFd );
}

// Open a TCP socket (an Internet strem socket).


if( ( clientFd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
cerr << "Cannot open a client TCP socket." << endl;
return NULL_FD;
}

int Socket::getClientSocket( char ipName[] ) {

// Connect to the server.


while ( connect( clientFd, (sockaddr*)&sendSockAddr,
sizeof( sendSockAddr ) ) < 0 );

// Get the host entry corresponding to ipName


struct hostent* host = gethostbyname( ipName );
// Connected
if( host == NULL ) {
return clientFd;
cerr << "Cannot find hostname." << endl;
}
return NULL_FD;
}

Winter, 2004

CSS490 Message Pass

Socket Programming:
Socket.cpp (Server)
int Socket::getServerSocket( ) {
if ( serverFd == NULL_FD ) { // Server not ready
sockaddr_in acceptSockAddr;

// Open a TCP socket (an internet stream socket).


if( ( serverFd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
cerr << "Cannot open a server TCP socket." << endl;
return NULL_FD;
}
// Bind our local address so that the client can send to us
bzero( (char*)&acceptSockAddr, sizeof( acceptSockAddr ) );
acceptSockAddr.sin_family
= AF_INET; // Address Family Internet
acceptSockAddr.sin_addr.s_addr = htonl( INADDR_ANY );
acceptSockAddr.sin_port
= htons( port );
if( bind( serverFd, (sockaddr*)&acceptSockAddr,
sizeof( acceptSockAddr ) ) < 0 ) {
cerr << "Cannot bind the local address to the server socket." << endl;
return NULL_FD;
}
}

listen( serverFd, 5 );

// Read to accept new requests


int newFd = NULL_FD;
sockaddr_in newSockAddr;
socklen_t newSockAddrSize = sizeof( newSockAddr );

if( ( newFd =
accept( serverFd, (sockaddr*)&newSockAddr, &newSockAddrSize ) ) < 0 ) {
cerr << "Cannot accept from another host." << endl;
return NULL_FD;
}
return newFd;

Winter, 2004

CSS490 Message Pass

10

Socket Programming: Main


#include "Socket.h"
#define PORT 10000 // You are given a specific pot from the instructor
int main( int argc, char *argv[] ) {
Socket sock( PORT );
int fd;
if ( argc == 1 ) { // I'm a server
while ( true ) {
if ( ( fd = sock.getServerSocket( ) ) == NULL_FD )
return -1;
char recvMessage[MAXSIZE];
read( fd, recvMessage, MAXSIZE );
cout << recvMessage << endl;
close( fd );
}
}
if ( argc == 2 ) { // I'm a client
if ( ( fd = sock.getClientSocket( argv[1] ) ) == NULL_FD )
return -1;
char sendMessage[MAXSIZE];
cin >> sendMessage;
write( fd, sendMessage, MAXSIZE );
}
return 0;

}
Winter,
2004

CSS490 Message Pass

11

Blocking/Non-Blocking
Communication
Blocking communication

TCP, UDP, and other communication packages

Rendezvous

Client: blocked only when the destination buffer is full


Server: blocked if no message has arrived from the client.
Client: blocked for a server to receive a message
Server: blocked if no message has arrived from the client.

Non-blocking communication

Server does not want to be blocked when

It may receive a message from a different client.


It has another jobs to be done such as computation or
message transmission.

Some synchronization is necessary later.

Winter, 2004

CSS490 Message Pass

12

Synchronization in NonBlocking Communication

Polling

Periodically check if a socket is ready to read data:

Example:

sd = socket( AF_INET, SOCKET_STREAM, 0);

set_fl(sd, O_NONBLOCK);
// set the socket as non-blocking

struct pollfd pfd;

pfd.fd = sd;

poll( &pfd, 1, timeout )


// poll the socket status
Interrupt

Notified from the system when a socket is ready to read data;

Example:

sd = socket(AF_INET, SOCKET_STREAM, 0);

signal(SIGIO, sigio_func);
// set a future interrupt to call
sigio_func( )

fcntl(sd, F_SETOWN, getpid( )); // ask OS to deliver this fd interrupt to me

fcntl(sd, F_SETFL, FASYNC);


// set this fd asynchronous

int sigio_func( ) { // invoked upon an interrupt }

Winter, 2004

CSS490 Message Pass

13

Buffering

message

message

message
message

message
message

Winter, 2004

No Buffering

A message remains on the sender until the


receiver issues receive( ).

Rendezvous

Performance drawback
Single Message Buffer

The sender can send at most one message


even if the receiver has not issued
receive( ).

Stop-and-wait protocol

A message can be kept read in advance.

What if the sender has multiple messages?


Finite-Bound Buffer

Unsuccessful communication
- GoBack-N Technique

Flow-controlled communication
sliding window in TCP

Socket: capable of changing its buffer size


with setsockopt( )

CSS490 Message Pass

14

Process Addressing

Explicit address
machine id + local id
Example: TCP/IP and UDP/IP use IP + port

Demerit: No process migration allowed


machine id + local id + the last machine id
Process migration allowed
Messages forwarded along links to the final
destination
Receiver informing sender of its last machine id
Sender using this info from the following messages
Implicit addressing
System-wide id (function name)
Example: RPC
Name server required

Winter, 2004

CSS490 Message Pass

15

Failure Handling
client

ack

server

client

server
request

request
timeout

request 2
response

response

response 2
request

timeout

request

ack
response

ack
timeout

Winter, 2004

request 2

Loss of request
message
Loss of response
message
Unsuccessful
execution of
request
Do we really need
acknowledgment
messages?

CSS490 Message Pass

16

Idempotency
client

server

request

server
client
request
Timeout
request 2

response

Timeout
request 3

A pair of request and


response is enough to
handle faults
Idempotency
assumed:

Timeout

response
request 4

At-least one semantics


Last-one semantics

reesponse 2

Winter, 2004

CSS490 Message Pass

17

Exactly-One Semantics

Withdraw $100

Withdraw995 $100

$1000-$100
= $900
Not received
Withdraw $100

$1000-$100

= $900 for Trans995

Not received
Withdraw995 $100
Trans995 completed
No subtraction

$900-$100
=$800!

$100 received

$100 received

Winter, 2004

CSS490 Message Pass

What if errors
in the banking
system
New semantics
required:
Exactly-one
semantics
Server must
keep track of
the request
sequence
18

Exercises (No turn-in)


1.
2.

3.

4.

5.

Why do we need layered network protocols?


When implementing TCP with datagram, what do we have to
take care of?
Consider the pros and cons of polling and interrupt in nonblocking communication.
Consider an example inducing an accidental system hang-up
(named a deadlock) in no-buffering communication.
Which of the following operations are idempotent?
1.
cin >> data;
2.
ifstream infile(input.txt); infile.seek( );
3.
cout << data;
4.
int a = 1, b = 2, c; c = a + b;
5.
int c = 1; c++;

Winter, 2004

CSS490 Message Pass

19

Vous aimerez peut-être aussi