Title: Socket UDP
1Socket UDP
2UDP
3Socket programming with UDP
- UDP no connection between client and server
- no handshaking
- sender explicitly attaches IP address and port of
destination to each segment - OS attaches IP address and port of sending socket
to each segment - Server can extract IP address, port of sender
from received segment
Note the official terminology for a UDP packet
is datagram. In this class, we instead use
UDP segment.
4Running example
- Client
- User types line of text
- Client program sends line to server
- Server
- Server receives line of text
- Capitalizes all the letters
- Sends modified line to client
- Client
- Receives line of text
- Displays
5Client/server socket interaction UDP
Server (running on hostid)
create socket, port x.
serverSocket DatagramSocket()
6Example Java client (UDP)
Client process
Input receives packet (recall thatTCP received
byte stream)
Output sends packet (recall that TCP sent byte
stream)
client UDP socket
7Example Java client (UDP)
import java.io. import java.net. class
UDPClient public static void main(String
args) throws Exception
BufferedReader inFromUser new
BufferedReader(new InputStreamReader(System.in))
DatagramSocket clientSocket new
DatagramSocket() InetAddress IPAddress
InetAddress.getByName("hostname")
byte sendData new byte1024 byte
receiveData new byte1024 String
sentence inFromUser.readLine() sendData
sentence.getBytes()
Create input stream
Create client socket
Translate hostname to IP address using DNS
8Example Java client (UDP), cont.
Create datagram with data-to-send, length, IP
addr, port
DatagramPacket sendPacket new
DatagramPacket(sendData, sendData.length,
IPAddress, 9876) clientSocket.send(send
Packet) DatagramPacket receivePacket
new DatagramPacket(receiveData,
receiveData.length) clientSocket.receiv
e(receivePacket) String
modifiedSentence new
String(receivePacket.getData())
System.out.println("FROM SERVER"
modifiedSentence) clientSocket.close()
Send datagram to server
Read datagram from server
9Example Java server (UDP)
import java.io. import java.net. class
UDPServer public static void main(String
args) throws Exception
DatagramSocket serverSocket new
DatagramSocket(9876) byte
receiveData new byte1024 byte
sendData new byte1024 while(true)
DatagramPacket
receivePacket new
DatagramPacket(receiveData, receiveData.length)
serverSocket.receive(receivePacket)
Create datagram socket at port 9876
Create space for received datagram
Receive datagram
10Example Java server (UDP), cont
String sentence new
String(receivePacket.getData())
InetAddress IPAddress receivePacket.getAddress()
int port receivePacket.getPort()
String
capitalizedSentence sentence.toUpperCase()
sendData capitalizedSentence.getBytes()
DatagramPacket sendPacket
new DatagramPacket(sendData,
sendData.length, IPAddress,
port) serverSocket.send(s
endPacket)
Get IP addr port , of sender
Create datagram to send to client
Write out datagram to socket
End of while loop, loop back and wait for another
datagram
11UDP observations questions
- Both client server use DatagramSocket
- Dest IP and port are explicitly attached to
segment. - What would happen if change both clientSocket and
serverSocket to mySocket? - Can the client send a segment to server without
knowing the servers IP address and/or port
number? - Can multiple clients use the server?
-
12DatagramPacket
- Un paquet contient au plus 65,507 bytes
- Pour construire les paquet
- public DatagramPacket(byte buffer, int length)
- public DatagramPacket(byte buffer, int offset,
int length) - Pour construire et envoyer
- public DatagramPacket(byte data, int length,
InetAddress destination, int port) - public DatagramPacket(byte data, int offset,
int length, InetAddress destination, int port) - public DatagramPacket(byte data, int length,
SocketAddress destination, int port) - public DatagramPacket(byte data, int offset,
int length, SocketAddress destination, int port)
13Exemple
- String s "On essaie"
- byte data s.getBytes("ASCII")
- try
- InetAddress ia InetAddress.getByName("www.li
afa.jussieu.fr") - int port 7// existe-t-il?
- DatagramPacket dp new DatagramPacket(data,
data.length, ia, port) -
- catch (IOException ex)
-
14Méthodes
- Adresses
- public InetAddress getAddress( )
- public int getPort( )
- public SocketAddress getSocketAddress( )
- public void setAddress(InetAddress remote)
- public void setPort(int port)
- public void setAddress(SocketAddress remote)
15Méthodes (suite)
- Manipulation des données
- public byte getData( )
- public int getLength( )
- public int getOffset( )
- public void setData(byte data)
- public void setData(byte data, int offset, int
length ) - public void setLength(int length)
16Exemple
- import java.net.
- public class DatagramExample
- public static void main(String args)
- String s "Essayons."
- byte data s.getBytes( )
- try
- InetAddress ia InetAddress.getByName("www.
liafa.jussieu.fr") - int port 7
- DatagramPacket dp new DatagramPacket(data,
data.length, ia, port) - System.out.println(" Un packet pour"
dp.getAddress( ) " port " dp.getPort( )) - System.out.println("il y a "
dp.getLength( ) - " bytes dans le packet")
- System.out.println(
- new String(dp.getData( ), dp.getOffset(
), dp.getLength( ))) -
- catch (UnknownHostException e)
- System.err.println(e)
-
-
17DatagramSocket
- Constructeurs
- public DatagramSocket( ) throws SocketException
- public DatagramSocket(int port) throws
SocketException - public DatagramSocket(int port, InetAddress
interface) throws SocketException - public DatagramSocket(SocketAddress interface)
throws SocketException - (protected DatagramSocket(DatagramSocketImpl
impl) throws SocketException)
18Exemple
- java.net.
- public class UDPPortScanner
- public static void main(String args)
-
- for (int port 1024 port lt 65535 port)
- try
- // exception si utilisé
- DatagramSocket server new
DatagramSocket(port) - server.close( )
-
- catch (SocketException ex)
- System.out.println("Port occupé" port
".") - // end try
- // end for
-
19Envoyer et recevoir
- public void send(DatagramPacket dp) throws
IOException - public void receive(DatagramPacket dp) throws
IOException
20Un exemple Echo
- UDPServeur
- UDPEchoServeur
- UDPEchoClient
- SenderThread
- ReceiverThread
21Echo UDPServeur
- import java.net.
- import java.io.
- public abstract class UDPServeur extends Thread
- private int bufferSize
- protected DatagramSocket sock
- public UDPServeur(int port, int bufferSize)
- throws SocketException
- this.bufferSize bufferSize
- this.sock new DatagramSocket(port)
-
- public UDPServeur(int port) throws
SocketException - this(port, 8192)
-
- public void run()
- byte buffer new bytebufferSize
- while (true)
- DatagramPacket incoming new
DatagramPacket(buffer, buffer.length) - try
- sock.receive(incoming)
22UDPEchoServeur
- public class UDPEchoServeur extends UDPServeur
- public final static int DEFAULT_PORT 2222
- public UDPEchoServeur() throws
SocketException - super(DEFAULT_PORT)
-
- public void respond(DatagramPacket packet)
- try
- byte data new bytepacket.getLengt
h() - System.arraycopy(packet.getData(), 0,
data, 0, packet.getLength()) - try
- String s new String(data,
"8859_1") - System.out.println(packet.getAddre
ss() " port " - packet.getPort() "
reçu " s) - catch (java.io.UnsupportedEncodingEx
ception ex) - DatagramPacket outgoing new
DatagramPacket(packet.getData(), - packet.getLength(),
packet.getAddress(), packet.getPort()) - sock.send(outgoing)
- catch (IOException ex)
- System.err.println(ex)
23Client UDPEchoClient
- public class UDPEchoClient
- public static void lancer(String hostname, int
port) - try
- InetAddress ia InetAddress.getByName(hostn
ame) - SenderThread sender new SenderThread(ia,
port) - sender.start()
- Thread receiver new ReceiverThread(sender.
getSocket()) - receiver.start()
-
- catch (UnknownHostException ex)
- System.err.println(ex)
-
- catch (SocketException ex)
- System.err.println(ex)
-
- // end lancer
-
24ReceiverThread
- class ReceiverThread extends Thread
- DatagramSocket socket
- private boolean stopped false
- public ReceiverThread(DatagramSocket ds)
throws SocketException - this.socket ds
-
- public void halt()
- this.stopped true
-
- public DatagramSocket getSocket()
- return socket
-
- public void run()
- byte buffer new byte65507
- while (true)
- if (stopped) return
- DatagramPacket dp new
DatagramPacket(buffer, buffer.length) - try
- socket.receive(dp)
25SenderThread
- public class SenderThread extends Thread
- private InetAddress server
- private DatagramSocket socket
- private boolean stopped false
- private int port
- public SenderThread(InetAddress address, int
port) - throws SocketException
- this.server address
- this.port port
- this.socket new DatagramSocket()
- this.socket.connect(server, port)
-
- public void halt()
- this.stopped true
-
- //
-
26SenderThread
- //
- public DatagramSocket getSocket()
- return this.socket
-
- public void run()
-
- try
- BufferedReader userInput new
BufferedReader(new InputStreamReader(System.in)) - while (true)
- if (stopped) return
- String theLine
userInput.readLine() - if (theLine.equals(".")) break
- byte data theLine.getBytes()
- DatagramPacket output
- new DatagramPacket(data,
data.length, server, port) - socket.send(output)
- Thread.yield()
-
- // end try
27Autres méthodes
- public void close( )
- public int getLocalPort( )
- public InetAddress getLocalAddress( )
- public SocketAddress getLocalSocketAddress( )
- public void connect(InetAddress host, int port)
- public void disconnect( )
- public void disconnect( )
- public int getPort( )
- public InetAddress getInetAddress( )
- public InetAddress getRemoteSocketAddress( )
28Options
- SO_TIMEOUT
- public synchronized void setSoTimeout(int
timeout) throws SocketException - public synchronized int getSoTimeout( ) throws
IOException - SO_RCVBUF
- public void setReceiveBufferSize(int size) throws
SocketException - public int getReceiveBufferSize( ) throws
SocketException - SO_SNDBUF
- public void setSendBufferSize(int size) throws
SocketException - int getSendBufferSize( ) throws SocketException
- SO_REUSEADDR (plusieurs sockets sur la même
adresse) - public void setReuseAddress(boolean on) throws
SocketException - boolean getReuseAddress( ) throws SocketException
- SO_BROADCAST
- public void setBroadcast(boolean on) throws
SocketException - public boolean getBroadcast( ) throws
SocketException
29Multicast
30Broadcast Routing
- Deliver packets from srce to all other nodes
- Source duplication is inefficient
- Source duplication how does source determine
recipient addresses
31In-network duplication
- Flooding when node receives brdcst pckt, sends
copy to all neighbors - Problems cycles broadcast storm
- Controlled flooding node only brdcsts pkt if it
hasnt brdcst same packet before - Node keeps track of pckt ids already brdcsted
- Or reverse path forwarding (RPF) only forward
pckt if it arrived on shortest path between node
and source - Spanning tree
- No redundant packets received by any node
32Spanning Tree
- First construct a spanning tree
- Nodes forward copies only along spanning tree
33Spanning Tree Creation
- Center node
- Each node sends unicast join message to center
node - Message forwarded until it arrives at a node
already belonging to spanning tree
3
4
2
5
1
- Stepwise construction of spanning tree
(b) Constructed spanning tree
34Multicast
- Groupe adresse IP de classe D
- Un hôte peut joindre un groupe
- Protocole pour établir les groupes (IGMP)
- Protocole et algorithme pour le routage
35IGMP
- IGMP (internet Group Management Protocol
- Entre un hôte et son routeur (multicast)
- Membership_query du routeur vers tous les hôtes
pour déterminer quels hôtes appartiennent à quels
groupe - Membership_report des hôtes vers le routeur
- Membership_leave pour quitter un groupe
(optionnel)
36Multicast Routing Problem Statement
- Goal find a tree (or trees) connecting routers
having local mcast group members - tree not all paths between routers used
- source-based different tree from each sender to
rcvrs - shared-tree same tree used by all group members
Shared tree
37Approaches for building mcast trees
- Approaches
- source-based tree one tree per source
- shortest path trees
- reverse path forwarding
- group-shared tree group uses one tree
- minimal spanning (Steiner)
- center-based trees
we first look at basic approaches, then specific
protocols adopting these approaches
38Shortest Path Tree
- mcast forwarding tree tree of shortest path
routes from source to all receivers - Dijkstras algorithm
S source
LEGEND
R1
R4
router with attached group member
R2
router with no attached group member
R5
link used for forwarding, i indicates order
link added by algorithm
R3
R7
R6
39Reverse Path Forwarding
- rely on routers knowledge of unicast shortest
path from it to sender - each router has simple forwarding behavior
- if (mcast datagram received on incoming link on
shortest path back to center) - then flood datagram onto all outgoing links
- else ignore datagram
40Reverse Path Forwarding example
S source
LEGEND
R1
R4
router with attached group member
R2
router with no attached group member
R5
datagram will be forwarded
R3
R7
R6
datagram will not be forwarded
- result is a source-specific reverse SPT
- may be a bad choice with asymmetric links
41Reverse Path Forwarding pruning
- forwarding tree contains subtrees with no mcast
group members - no need to forward datagrams down subtree
- prune msgs sent upstream by router with no
downstream group members
LEGEND
S source
R1
router with attached group member
R4
router with no attached group member
R2
P
P
R5
prune message
links with multicast forwarding
P
R3
R7
R6
42Shared-Tree Steiner Tree
- Steiner Tree minimum cost tree connecting all
routers with attached group members - problem is NP-complete
- excellent heuristics exists
- not used in practice
- computational complexity
- information about entire network needed
- monolithic rerun whenever a router needs to
join/leave
43Center-based trees
- single delivery tree shared by all
- one router identified as center of tree
- to join
- edge router sends unicast join-msg addressed to
center router - join-msg processed by intermediate routers and
forwarded towards center - join-msg either hits existing tree branch for
this center, or arrives at center - path taken by join-msg becomes new branch of tree
for this router
44Center-based trees an example
Suppose R6 chosen as center
LEGEND
R1
router with attached group member
R4
3
router with no attached group member
R2
2
1
R5
path order in which join messages generated
R3
1
R7
R6
45Internet Multicasting Routing DVMRP
- DVMRP distance vector multicast routing
protocol, RFC1075 - flood and prune reverse path forwarding,
source-based tree - RPF tree based on DVMRPs own routing tables
constructed by communicating DVMRP routers - no assumptions about underlying unicast
- initial datagram to mcast group flooded
everywhere via RPF - routers not wanting group send upstream prune
msgs
46DVMRP continued
- soft state DVMRP router periodically (1 min.)
forgets branches are pruned - mcast data again flows down unpruned branch
- downstream router reprune or else continue to
receive data - routers can quickly regraft to tree
- following IGMP join at leaf
- odds and ends
- commonly implemented in commercial routers
- Mbone routing done using DVMRP
47Tunneling
- Q How to connect islands of multicast routers
in a sea of unicast routers?
logical topology
physical topology
- mcast datagram encapsulated inside normal
(non-multicast-addressed) datagram - normal IP datagram sent thru tunnel via regular
IP unicast to receiving mcast router - receiving mcast router unencapsulates to get
mcast datagram
48PIM Protocol Independent Multicast
- not dependent on any specific underlying unicast
routing algorithm (works with all) - two different multicast distribution scenarios
- Dense
- group members densely packed, in close
proximity. - bandwidth more plentiful
- Sparse
- networks with group members small wrt
interconnected networks - group members widely dispersed
- bandwidth not plentiful
49Consequences of Sparse-Dense Dichotomy
- Dense
- group membership by routers assumed until routers
explicitly prune - data-driven construction on mcast tree (e.g.,
RPF) - bandwidth and non-group-router processing
profligate
- Sparse
- no membership until routers explicitly join
- receiver- driven construction of mcast tree
(e.g., center-based) - bandwidth and non-group-router processing
conservative
50PIM- Dense Mode
- flood-and-prune RPF, similar to DVMRP but
- underlying unicast protocol provides RPF info for
incoming datagram - less complicated (less efficient) downstream
flood than DVMRP reduces reliance on underlying
routing algorithm - has protocol mechanism for router to detect it is
a leaf-node router
51PIM - Sparse Mode
- center-based approach
- router sends join msg to rendezvous point (RP)
- intermediate routers update state and forward
join - after joining via RP, router can switch to
source-specific tree - increased performance less concentration,
shorter paths
R1
R4
join
R2
join
R5
join
R3
R7
R6
all data multicast from rendezvous point
rendezvous point
52PIM - Sparse Mode
- sender(s)
- unicast data to RP, which distributes down
RP-rooted tree - RP can extend mcast tree upstream to source
- RP can send stop msg if no attached receivers
- no one is listening!
R1
R4
join
R2
join
R5
join
R3
R7
R6
all data multicast from rendezvous point
rendezvous point
53Multicast
- Géré par les routeurs
- Pas de garantie
- Importance du ttl
- (Évaluation)
- Local0
- Sous-réseau local1
- Pays48
- Continent64
- Le monde255
54Multicast
- Un groupe est identifié par une adresse IP
(classe D) entre 224.0.0.0 et 239.255.255.255 - Une adresse multicast peut avoir un nom
- Exemple ntp.mcast.net 224.0.1.1
55Sockets multicast
- Extension de DatagramSocket
- public class MulticastSocket extends
DatagramSocket - Principe
- Créer une MulticastSocket
- Rejoindre un group joinGroup()
- Créer DatagramPacket
- Receive()
- leaveGroup()
- Close()
56Création
- try
- MulticastSocket ms new MulticastSocket( )
- // send datagrams...
- catch (SocketException se)System.err.println(se)
- -------
- try
- SocketAddress address new
InetSocketAddress("192.168.254.32", 4000)
MulticastSocket ms new MulticastSocket(address)
- // receive datagrams...
- catch (SocketException ex) System.err.println(ex
)
57Création
- try
- MulticastSocket ms new MulticastSocket(null)
- ms.setReuseAddress(false)
- SocketAddress address new InetSocketAddress(4
000) - ms.bind(address)
- // receive datagrams...
- catch (SocketException ex) System.err.println(
ex)
58Rejoindre
- try
- MulticastSocket ms new MulticastSocket(4000)
- InetAddress ia InetAddress.getByName("224.2.2.2
") ms.joinGroup(ia) - byte buffer new byte8192
- while (true)
- DatagramPacket dp new DatagramPacket(buffer,
buffer.length) - ms.receive(dp)
- String s new String(dp.getData( ), "8859_1")
- System.out.println(s)
-
- catch (IOException ex) System.err.println(ex)
59send
- try
- InetAddress ia InetAddress.getByName("experime
nt.mcast.net") - byte data "un packet\r\n".getBytes( )
- int port 4000
- DatagramPacket dp new DatagramPacket(data,
data.length, ia, port) - MulticastSocket ms new MulticastSocket( )
- ms.send(dp,64)
- catch (IOException ex) System.err.println(ex)