0% ont trouvé ce document utile (0 vote)
30 vues15 pages

Cours 4

Le document traite des sockets en réseau, en expliquant leur rôle dans les communications client-serveur et les modes de transmission (stream et datagram). Il présente également l'API Java pour la gestion des sockets, ainsi que des exemples de code pour la création de serveurs et de clients. Enfin, il aborde le protocole BGP pour le routage entre systèmes autonomes et les protocoles de routage internes comme RIP et OSPF.

Transféré par

YOYOFRX
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
30 vues15 pages

Cours 4

Le document traite des sockets en réseau, en expliquant leur rôle dans les communications client-serveur et les modes de transmission (stream et datagram). Il présente également l'API Java pour la gestion des sockets, ainsi que des exemples de code pour la création de serveurs et de clients. Enfin, il aborde le protocole BGP pour le routage entre systèmes autonomes et les protocoles de routage internes comme RIP et OSPF.

Transféré par

YOYOFRX
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Propriétés

✦ sockets= BSD sockets (plusieurs types


historiques mais victoire de l’API BSD)

Sockets ✦ représentation d’une connexion entre 2


applications réseau, sur des machines ≠
✦ applications peuvent utiliser plusieurs sockets
✦ sockets sont bidirectionnelles, i.e. chaque coté de
la connexion peut émettre et recevoir.

Client-serveur Pour le programmeur


134.59.9.54:34321

134.59.9.96:45321
✦ contrôle total du coté applicatif
✦ très peu de contrôle du coté de la couche de
transport; seuls choix:
✦ Applis client-serveur utilisent des sockets
✦ fournissent interface entre applis et réseau (TCP ou UDP)
✦ désignent l’extrémité d’une connexion coté émetteur ou
1.protocole de transport (tcp/udp)
récepteur en l'associant à un port
✦ Quand la cnx (bidirectionnelle) est établie via des sockets, client
2.paramètres (taille buffers et segments)
et serveur peuvent communiquer par lectures/écritures

3 5
L’API “java.net” getByName
✦ public static InetAdress getByName (String nom_hote)
✦ utilise DNS pour construire une instance de InetAdress
✦ après importation de java.net.InetAddress:
✦ InetAddress adr = InetAddress.getByName(“www.unice.fr”)
✦ si échec req. DNS, levée de l’exception UnknownHostException

getAllByName
✦ public static InetAdress [] getAllByName (String nom_hote)
✦ renvoie toutes les IP@ de la machine “nom_hote”
✦ Vous connaissez des machines avec plusieurs IP@?

Classe “InetAdress” getLocalHost


✦ représentation IP@ par (hostName,address) de type (chaîne,
tableau octets)
✦ public static InetAddress getLocalHost ()
✦ hostName: nom de l’hôte: www.unice.fr
✦ renvoie instance de InetAddress avec IP@ de
✦ address: l’adresse IP machine locale
✦ Pas de constructeur public; création objets par: ✦ pratique pour tests sur une même machine
✦ getByName

✦ getAllByName
✦ équivaut à getByName (“localhost”)

✦ getLocalHost

8 10
Mode “Stream” Mode “Stream”
Classes Classe Socket: opérations principales
§ 2 classes:
§ ServerSocket (pour le serveur)
§ Socket dit “de service”
sur lequel le serveur attend des demandes de connexions client

§ Socket (pour le client)


§ Socket associé à un client spécifique,
retourné à chaque nouvelle demande de connexion
§ Permet le dialogue entre le serveur et le client unique

13

Mode “Stream” Mode “Stream”


Classe ServerSocket: principales opérations Séquence d’opérations
serveur

ss = new ServerSocket ()

ss.bind ()
client
sc = ss.accept ()

s = new Socket ()

bloque jusqu’à demande établissement


de la connexion s.connect ()
de connexion client

requête
read () write ()

traitement
de la requête
réponse
write () read ()

sc.close () close ()

ss.close ()
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception {
if (args.length != 1) {
System.out.println("Usage: java Server port");
System.exit(0);
}

int port;
port = Integer.parseInt(args[0]);
ServerSocket ss = new ServerSocket(port); // socket de service
Socket cs = ss.accept(); // Socket client

// Un BufferedReader permet de lire par ligne.


BufferedReader br = new BufferedReader(
Serveur

new InputStreamReader(cs.getInputStream())

Mode datagramme
);

// Un PrintWriter possède toutes les opérations print classiques.


// En mode auto-flush, le tampon est vidé (flush) à l'appel de println.
PrintWriter pw = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(cs.getOutputStream())),
true);

while (true) {
String str = br.readLine(); // lecture du message
if (str.equals("END")) break;
System.out.println("ECHO = " + str); // trace locale
pw.println("ECHO " +str); // renvoi d'un echo
}
br.close();
pw.close();
ss.close();
cs.close();
}
}

15

import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception {
Mode “Datagram”
Classes
if (args.length != 2) {
System.out.println("Usage: java Client serverAddress serverPort");
System.exit(0);
}

int port;
port = Integer.parseInt(args[1]);
Socket socket = new Socket(args[0], port);
§ 2 classes:
System.out.println("SOCKET = " + socket);

BufferedReader br = new BufferedReader(


§ DatagramPacket
new InputStreamReader(socket.getInputStream())
); § Contient les données utiles à transmettre
Client

PrintWriter pw = new PrintWriter( § Contient aussi la destination (@IP + port)


new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);

String strRq = "bonjour"; § DatagramSocket


String strRsp;
for (int i = 0; i < 10; i++) {
pw.println(strRq); // envoi d'un message
§ Représente l’interface de transmission et de réception
strRsp = br.readLine(); // lecture de l'echo
System.out.println(strRsp); // message de terminaison
}

System.out.println("END"); // message de terminaison


pw.println("END") ;
pw.close();
br.close();
socket.close();
}
}

16
L’API “java.net” Mode “Datagram”
sockets UDP Séquence d’opérations
§ Socket serveur client
DatagramSocket socket = new DatagramSocket();
DatagramSocket socket = new DatagramSocket(4445); s = new DatagramSocket () s = new DatagramSocket ()

§ Address s.bind (…)

InetAddress address = InetAddress.getByName(hostname);


DatagramPacket PR = new DatagramPacket (…);

s.send (new DatagramPacket (…))


§ Packet requête

DatagramPacket packet; bloque jusqu’à réception


s.receive (PR)
d’un datagramme
DatagramPacket PR = new DatagramPacket (…);
packet = new DatagramPacket(buf, buf.length, address, 4445);
socket.send(packet); s.send (new DatagramPacket (…)) réponse

s.receive (PR)

packet = new DatagramPacket(buf, buf.length);


socket.receive(packet);

Mode “Datagram”
Principales opérations
import java.net.*;
import java.io.*;

class SendData
{
public static void main(String argv[])
throws SocketException, IOException,
UnknownHostException
{

Emetteur
String message = "Bonjour le monde!";
byte[] tampon = message.getBytes();
InetAddress adresse = null;
DatagramSocket socket;
// recupère l’adresse IP de la machine
adresse = InetAddress.getByName("localhost");
// crée l’objet contenant les données du datagramme à envoyer
DatagramPacket envoi=
new DatagramPacket(tampon,tampon.length,adresse,50000);
// crée un socket UDP (le port est choisi par le système)
socket=new DatagramSocket();
// envoie le datagramme UDP
socket.send(envoi);
}
}

java SendData
22
import java.net.*;
Vocabulaire
import java.io.*;

class RcvData
{
public static void main(String argv[])
Terme Description
throws SocketException, IOException
{ famille de protocoles utilisés par le mécanisme de
byte[] tampon = new byte[1000]; domain
Récepteur

String texte; transport.Constantes de valeurs: AF_INET, AF_UNIX, AF_X25,


// crée un socket UDP qui attend des datagrammes sur le port 50000
DatagramSocket socket =new DatagramSocket(50000);
etc...
type de communication entre deux hôtes, mode stream
// crée un objet pour stocker les données du datagramme attendu
DatagramPacket reception = new DatagramPacket(tampon, tampon.length);
type SOCK_STREAM ou datagram SOCK_DGRAM
// attend puis récupère les données du datagramme
socket.receive(reception); usuellement zéro, mais peut être utilisé pour identifier une variante de
// récupère la chaîne de caractère reçue
// Note: reception.getLength() contient le nombre d’octets reçus
protocol protocole un domaine et type donnés
texte=new String(tampon, 0, reception.getLength());
System.out.println("Reception de la machine "+
reception.getAddress().getHostName()+
" sur le port "
hostname nom de l’hôte
+reception.getPort()+" :\n"+
Chaque serveur est en écoute sur un ou plusieurs ports. Un port est
texte );
port un entier
}
}

java RcvData sockaddr regroupe dans un tuple (hostname, port) les informations
Réception de la machine localhost sur le port 49290
Bonjour le monde!
23
http://docs.python.org/3.2/library/socket.html

Méthodes

('inari.unice.fr') retourne
API Python

socket.gethostbyname

✦ chaine contenant l’adresse IP: '134.59.9.96'


✦ étendu par socket.gethostbyname_ex() qui fournit
plus d’informations
Classe socket Mode Stream
#!/usr/local/bin/python3 # This is server.py file

import socket # Import socket module

✦ regroupe toutes les sockets s = socket.socket() # Create a socket object


host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
✦ socket.socket(): pour créer une socket s.bind((host, port)) # Bind to the port

Serveur
s.listen(5) # Now wait for client connection.
✦ socket.bind(): liaison à un port while True:
c, addr = s.accept() # Establish connection with client.
print ('Got connection from', addr) Il faut recoder le
✦ socket.connect(): se connecte sur une sockaddr c.send(bytes('Thank you for connecting','UTF-8'))
c.close() # Close the connection texte en flux
✦ socket.listen(): mise en écoute #!/usr/local/bin/python3 # This is client.py file

✦ socket.send(): envoie import socket # Import socket module


msg=''
s = socket.socket() # Create a socket object

Client
✦ socket.recvfrom(): réception host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
✦ socket.close(): fermeture connextion
s.connect((host, port))
print (s.recv(1024).decode('UTF-8'))
s.close # Close the socket when done

Séquence d’opérations Mode «datagramme»


serveur serveur client
s = socket.socket()

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


s.bind( sockaddr )

client
sock.bind()
s.listen( 5 )

s = socket.socket()

bloque jusqu’à demande établissement


c,addr=s.accept() s.connect( sockaddr )
de connexion client de la connexion sock.sendto()
requête

s.send() bloque jusqu’à réception


requête d’un datagramme sock.recvfrom(1024)

c.recv()

traitement sock.sendto() réponse


de la requête

c.send() réponse sock.recvfrom()

s.recv()

c.close() c.close()
#!/usr/local/bin/python3 # This is server.py file

import socket # Import socket module

Serveur UDP_IP = "127.0.0.1"


UDP_PORT = 5005

sock = socket.socket(socket.AF_INET, # Internet


AS
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))

while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print("received message:", data.decode('utf-8'))
sock.sendto(bytes(data.decode(‘utf-8’).upper(),'utf-8'),addr)
✦ Ensemble de rx IP sous le contrôle d’une seule et
# il faut decoder le message recu sous la forme d'un flux d'octets
même entité (eg FAI)
#!/usr/local/bin/python3 # This is server.py file

import socket # Import socket module


✦ Notion administrative caractérisée par l’unité de
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Hello, World!"
décision en son sein qui définit une politique de
print ("UDP target IP:", UDP_IP) routage
Client

print ("UDP target port:", UDP_PORT)


print ("message:", MESSAGE)

sock = socket.socket(socket.AF_INET, # Internet


✦ à l’opposé: Internet; réseau public pouvant
socket.SOCK_DGRAM) # UDP
sock.sendto(bytes(MESSAGE,'utf-8'), (UDP_IP, UDP_PORT))
rep,add=sock.recvfrom(1024)
prendre des décisions contradictoires
print("received message:", rep.decode('utf-8'))

# il faut encoder le message en flux d'octets

33

épine dorsale BGP interconnectant les AS


AS

Systèmes routeur
zone
routeur
autonomes interne fédérateur
routeur
interzones
même IGP
exécuté
dans un AS IGP=interior gateway proto
routeur
34
inter AS
Inter AS Routage par DV
✦ BGP: Border Gateway Protocol
✦ structure de données minimale: destination/next hop/ distance
✦ standard de facto ✦ Exemple de mise à jour: routeur transmet couples (dest,dist)
✦ protocole à vecteur de distances

✦ permet à chaque système autonome:

✦ d’obtenir la liste d’accessibilité des AS voisins

✦ de propager la liste aux routeurs internes

✦ de calculer les bonnes routes

✦ permet à tout SR de signaler son existence

35 37

BGP (rfc 4271) Intra AS


✦ prend en compte des politiques de routage
✦ géopolitiques, économiques, sécurité

✦ selon catégorie AS ✦ IGP: interior gateway protocol


✦ sans issue, multiconnectés, de transit

✦ fournisseur, client ✦ RIP: routing information protocol (BSD)


✦ communication entre routeurs BGP
✦ fiabilité par sessions TCP
✦ OSPF: open shortest path first (recommandé)
✦ détail rx traversés dissimulés ✦ IS-IS: intermediate system to IS (ISO)
✦ algorithme de type vecteur de distance
✦ communique chemins complets et coûts ✦ IGRP: interior gateway routing protocol (cisco)
✦ suppression boucles

36 38
Bellman-Ford
✦ Cherche PCC d’origine A
✦ donne arbre couvrant AB 10
1 AE 5
B C

RIP 10
Bellman_Ford( G, s)
BC 1
3 6
initialisation ( G, s) // poids des sommets mis à +infini
// poids du sommet initial à 0 ;
BE 2

9
pour i=1 à Nombre de sommets -1 faire
|
|
pour chaque arc (u, v) de G faire
| paux = poids(u) + poids(arc(u, v)); A CD 4
|
|
| si paux <poids(v) alors
| | pred(v) = u DC 6

5
| | | poids(v) = paux
pour chaque arc (u, v) de G faire 2 4 DA 7
| si poids(u) + poids(arc(u, v)) < poids(v) alors
2 EB 3
| retourner faux
retourner vrai
7 E D EC 9
ED 2

41

RIP Bellman_Ford( G, s)
Bellman-Ford
initialisation ( G, s) // poids des sommets mis à +infini
// poids du sommet initial à 0 ;
pour i=1 à Nombre de sommets -1 faire
| pour chaque arc (u, v) de G faire
| | paux = poids(u) + poids(arc(u, v));
| | si paux <poids(v) alors

✦ Basé sur algorithme DV (Bellman-Ford) |


|
|
|
| pred(v) = u
| poids(v) = paux
pour chaque arc (u, v) de G faire
1 AB 10
| si poids(u) + poids(arc(u, v)) < poids(v) alors
B C AE 5
nombre de hop comme poids des arcs 10
| retourner faux
✦ retourner vrai
BC 1
3 6 BE 2
(nb de SR traversés dont la destination) A B C D E

9
A CD 4
0 ∞ ∞ ∞ ∞ DC 6
limité à 15 hops

5

2 4 DA 7
0 10A 11B 15C 5A 2 EB 3
✦ échange DV avec voisins toutes les 30s 7 E D EC 9
ED 2
d’au plus 25 destinations 0 8E 9B 7E 5A
0 poids(A)+poids(AE)= 5
40 poids(B)+poids(BE)=10
49
Fonctionnement Limitations
Routeur D
SR dest rout. svt # hops
w A 1 prend seulement en compte
w AX x DX B

10

ps
y B 1 X le nombre de hops

kb

M
z B 7

bp
y

56
C ne considère pas l’état de

s

x - 0 X liaison pour améliorer la 10 Mbps
Routeur A bande passante
z
SR dest rout. svt # hops notification X
✦ corrigé dans OSPF
w - 0
z C 4
x - 0 50 52

Fonctionnement OSPF
Routeur D
SR dest rout. svt # hops
mise à jour

✦ basé sur algo d’état de lien (Dijkstra man dijkstra)


w A 1
w AX x DX B ✦ diffuse paquets d’état de liens
y B 1 X ✦ connaît le graphe à chaque nœud

z A 5 y fonctionne par des annonces OSPF


C ✦

x - 0 X ✦ portant une entrée pour chaque routeur voisin

Routeur A ✦ diffusés sur tout AS par inondation


z ✦ encapsulés dans messages OSPF sur IP
SR dest rout. svt # hops X ✦ http://www.cisco.com/en/US/docs/internetworking/
w - 0 technology/handbook/OSPF.html
z C 4
x - 0 51 54
Caractéristiques OSPF Dijsktra
✦ sécurité: tous messages authentifiés A B C D E B C
9
0 ∞ ∞ ∞ ∞ 8
✦ multi-chemins: multiplicité des chemins de même A
coût et équilibrage de charge  10A ∞ ∞ 5A 0

 8E 14E 7E 
✦ TOS: association de métriques fonction TOS
 8E 13D   5 7
✦ Xcast avec MOPSF   9B  
E D
✦ hiérarchique: décompose grands AS en zones     

55 62

Dijsktra Algorithme en O(|V|2)


1.i=0, S ={u =s}, L(u )=0, L(v)=∞
0 0 0
∀ v≠u si |V|=1 alors arrêt sinon aller en 2
0
2.∀ v ∈ V\S i
✦ Cherche PCC d’origine A ✦ L(v):=min{L(v)+d(ui ,v)}
✦ si L(v) remplacé, mémoriser (L(v),ui) sur v
✦ donne arbre couvrant
3.ui+1=minv {L(v): v ∈ V\Si}
4.Si+1=Si ∪ {ui+1}
5.i++
si i=|V|-1 alors arrêt sinon aller en 2
56 63
BF vs Dijkstra Interfaces connexion
routeur
✦ Plusieurs possibilités:
✦ BF au lieu de faire un choix glouton du sommet
adjacent de poids min fait une relaxation de tous ✦ CLI: terminal
les arcs et le fait V-1 fois ✦ sur le port série
✦ Les répétitions propagent les plus courts chemins ✦ via l’adresse IP d’une des interfaces
✦ Il fonctionne en temps O(VE) ✦ via navigateur web

64 66

Modes d’utilisation
✦ Organisé autour du principe de modes d’utilisation
✦ non privilégié vs privilégié

✦ Pour déterminer si le routeur est ou non configuré:


✦ Router>

IOS ✦
✦ hostname of router>

Si le routeur demande si on veut initier une configuration initiale


répondre NON
✦ Mode non privilégié, aussi appelé EXEC mode
✦ Permet d’exécuter ensemble commandes par CLI:
✦ ping, telnet et rlogin

✦ accès limité aux commandes show opt

✦ ?

✦ version

67
Mode privilégié Configuration interfaces
✦ permet de configurer le routeur
✦ passage au mode privilégié par enable ✦ interfaces référencées par la convention
✦ changement du prompt
✦ Router>
✦ media type slot#/port#
✦ Router#
✦ media type est p.e. ethernet, fast ethernet, fddi, serial,...
✦ sous-modes du mode privilégié accessibles
✦ changent le prompt en Router(argument)# ✦ slot# disponible seulement sur routeurs avec slots qui
✦ augmente la fonctionnalité des commandes, p.e. permettent insertion modules; pour accéder à interface
✦ Router#show interfaces slot6 port2: ethernet 6/2
✦ Router#ip protocols ✦ MonRouteur# show interface ethernet 6/2
✦ Router#ip route
✦ Router#ip arp ✦ MonRouteur# show interface serial 0
✦ affichent les informations essentielles de la configuration du routeur
68 70

Configuration globale Exemple


✦ par passage au mode de configuration depuis le mode privilégié par commande
config ou conf t ✦ MonRouteur# show interface serial 1/1
✦ retour au mode normal par ctrl-z
✦ changement prompt:
✦ MonRouteur#conf t
✦ Router# ✦ MonRouteur(config)#interface serial 1/1
✦ Router(config)#
✦ changement du nom du routeur ✦ MonRouteur(config-if)#ip address 192.168.155.2
✦ Router(config)#hostname MonRouteur 255.255.255.0
✦ désignation du serveur dns à utiliser (comme le up de
✦ MonRouteur(config-if)#no shutdown
✦ Router(config)#ip name-server aa.bb.cc.dd ifconfig)
✦ ajout mot de passe pour mode privilégié ✦ MonRouteur(config-if)#ctrl-z
✦ Router(config)#enable secret mot2pass
✦ commande effective après validation par ctrl-z
✦ MonRouteur#show interface serial 1/1

69 71
Retirer une commande Routage statique

✦ il suffit de la faire précéder d’un no ✦ Routage statique est limité aux réseaux simples
✦ no shutdown ✦ défini par la commande ip route
✦ MonRouteur(config)#interface serial 1/1 ✦ MonRouteur#config
MonRouteur(config-if)#no ip address 192.168.155.2 255.255.255.0 MonRouteur(config)#ip route 172.16.0.0 255.255.255.0 192.168.150.1
MonRouteur(config-if)ctrl-Z MonRouteur(config)#ctrl-z
MonRouteur#show interface serial 1/1 MonRouteur#show ip route
réseau routeur
suivant

72 74

Configurer le routage Sauvegarde


✦ routage activé par défaut. ✦ Une fois la configuration terminée (interfaces et
Si désactivé, le réactiver par: routage), le routeur peut fonctionner et remplir
✦ MonRouteur(config)#ip routing
MonRouteur(config)#ctrl-z
ses tables de routage et ses tables arp.
✦ show ip route et show ip arp
✦ deux modes de routage: ✦ si on éteint le routeur, la running-config est perdue
✦ statique ✦ pour la voir show running-config
✦ dynamique (par rip ou ospf) ✦ pour la sauver copy running-config startup-config

73 75

Vous aimerez peut-être aussi