Professional Documents
Culture Documents
1.3 Configuration IP
Hypothése de travail
Les protocoles d'Internet
L'adressage IP
Exemple d'adresse
Résolution d'adresse (DHCP)
Paquet DHCP
2 Protocoles TCP/IP
2.1 Protocole réseau IP
Format des paquets IP
Fragmentation des paquets
Adressage UDP
Les caractéristiques d'UDP
Format des datagrammes
Exemple de datagramme
Adressage TCP
Les caractéristiques de TCP
Format des datagrammes
Options TCP
Fiabilité
Adaptabilité
Quelques types d'attaques
Exemple de datagramme
Présentation
Caractéristiques des sockets
Les familles de sockets
Les modes de connexion
Les adressages
Les adressages
Schéma de principe
Primitives pour le serveur
Primitive pour le client
Exemple de serveur
Exemple de client
Schéma de principe
Primitives de communication
Exemple de serveur
Exemple de client
A Annexes
A.1 Démonstrations
l
T 2 d
v propagation
o longueur maximale du médium l=vpropag× T/2d.
o soit environ 5 km (en pratique 2,5 km).
1.1.4 L'adressage
08:00:20:10:E5:C5
préfixe constructeur
00:00:1B Novell
10:00:5A IBM
08:00:09 Hewlett Packard
AA:00:00,03,04 Digital
Adresse de diffusion
ff:ff:ff:ff:ff:ff
o Par élément, élection d'un port racine (le plus proche de l'élément racine) :
o Par segment, élection d'un élément priviligié :
o Les port non marqués sont désactivés (uniquement réception des BPDU).
Importance du choix de l'élément racine.
Format de la trame :
1.3 Configuration IP
1.3.3 L'adressage IP
unicast
: route normale,
unreachable
: ICMP "destination non atteignable",
blackhole
: rien,
prohibit
: ICMP "communication interdite",
nat
: réécriture de l'adresse destination,
...
unicast
: utiliser la route ad hoc de la table,
unreachable
: ICMP "destination non atteignable",
blackhole
: rien,
prohibit
: ICMP "communication interdite",
nat
: réécriture de l'adresse source,
...
Type de service :
Exemples d'options :
o routage strict ; enregistrement de route ;
o routage lâche ; enregistrement d'horloge.
2.1.2 Fragmentation des paquets
Découpage à l'identique :
Types de message :
Type Description
0 Réponse d'écho
3 Destination inaccessible
4 Limitation du débit de la source
5 Modification de route
8 Demande d'écho
11 Datagramme trop vieux
12 Problème de paramètre
13 Demande d'estampille de temps
14 Réponse d'estampille de temps
17 Demande de masque
18 Réponse de masque
Code Description
0 Réseau inaccessible
1 Machine inaccessible
2 Protocole inaccessible
3 Port inaccessible
4 Fragmentation impossible
5 Route impossible à suivre
Résolution de congestion :
o diversité des liens sur Internet :
o un routeur peut être submergé ;
o émission du paquet Source Quench ;
o la source réduit son débit.
Redirection de paquets :
o origine : une erreur de routage : (M1 route pour M2 par R1)
L'option No operation
o format de l'option :
2.4.5 Fiabilité
Accusé de réception :
o Attendre une confirmation de réception :
o Retransmettre après un délai :
2.4.6 Adaptabilité
- 0
Famille Protocole
PF_UNIX, PF_LOCAL Tubes nommés
PF_INET Protocoles TCP et UDP
PF_INET6 Protocoles IPv6
PF_APPLETALK Protocole AppleTalk
PF_IPX Protocole Novell
PF_X25, PF_CCITT Protocole X25
Unix
: SOCK_DGRAM, SOCK_STREAM ;
IP
: SOCK_DGRAM, SOCK_STREAM, SOCK_RAW ;
X25
: SOCK_SEQPACKET.
Unix
: un nom de fichier ;
IPv4
: adresse IPv4 et numéro de port ;
IPv6
: adresse IPv6, numéro de port, marque et champ d'utilisation ;
X25
: adresse X.121 ;
Connexion au serveur.
Primitive système connect :
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *address,int length);
L'adresse du serveur est dans address.
nboctets=recvfrom(s,tampon1,MAX_TAMPON-1,0,
(struct sockaddr *)&adresseClient,
&taille);
tampon1[nboctets]='\0';
sprintf(tampon2,"%s%s",PREFIXE,tampon1);
sendto(s,tampon2,strlen(tampon2),0,
(struct sockaddr *)&adresseClient,taille);
}
}
fgets(tampon,MAX_TAMPON,stdin);
sendto(s,tampon,strlen(tampon),0,(struct sockaddr *)&adresse,sizeof adresse);
taille=recvfrom(s,tampon,MAX_TAMPON,0,NULL,NULL);
fputs(tampon,stdout);
}
Caractéristiques :
o Processus serveur ordinaire ;
o Processus fils du processus init ;
o Processus du super-utilisateur ;
o Même durée de vie que le système.
Réalisation :
o fork() : pour se lancer en tâche de fond ;
o setsid() : pour se détacher du terminal courant ;
o chdir("/") : évite d'empêcher un démontage ;
o close(0,1,2) : fermer les descripteurs inutiles ;
o umask(022) : pour créer des fichiers non modifiables ;
o openlog,syslog,closelog : avertissements, erreurs.
Nouvelle fonction (4 premières étapes) :
#include <unistd.h>
int daemon (int nochdir, int noclose);
Mode connecté :
A Annexes
A.1 Démonstrations
#
# Quelques constantes
#
NC=/usr/bin/nc
PORT=8080
TTY_PREFIXE=/dev/tty
PTY_PREFIXE=/dev/pty
TTY_NUMERO=q3
REPERTOIRE=${HOME}/Scripts/Web
#
# Boucle principale
# (ecoute sur le port, traitement de la requete, envoi du fichier)
#
while true ; do
#
# On ecoute sur le cote maitre du terminal virtuel
#
${NC} -l -p ${PORT} 4<>${PTY_PREFIXE}${TTY_NUMERO} >&4 2>&4 <&4 &
PID=$!
#
# On lance un sous-shell sur le cote esclave
#
(
stty -echo igncr
#
# Lecture de la requete HTTP
#
read requete
#
# Lecture des entetes (mises a la poubelle)
#
while read line ; do
if [ -z "${line}" ] ; then break ; fi
done
#
# Analyse de la requete
#
set -- ${requete}
commande=$1 ; file=$2 ; protocole=$3
#
# Reponse a la requete
#
if [ "${commande}" != "GET" -o ! -f "${REPERTOIRE}/${file}" ] ; then
echo "${protocole} 400 erreur"
echo
echo "Erreur !!"
else
echo "${protocole} 200 OK"
echo "Content-type: text/html"
echo
cat "${REPERTOIRE}/${file}"
fi
) 4<>${TTY_PREFIXE}${TTY_NUMERO} >&4 2>&4 <&4
#
# On stoppe l'ecoute
#
kill ${PID}
sleep 2
done
<dl>
<dt>
<a href="/fichier1">Premier fichier</a>
<dt>
<a href="/fichier2">Second fichier</a>
</dl>
<p align=right>
Serveur Script
</p>
</body>
</html>
all:
@echo -e "\
Tapez d'abord make generate pour obtenir le fichier d'inclusion .h et\n\
les fichiers C. Modifiez les programmes calc_client.c et calc_server.c\n\
puis lancez la compilation par make compile."
generate: calc.x
rpcgen -a -C $^
# Copie des fichiers modifies a la main sur leurs modeles
copy:
cp calc_client_modified.c calc_client.c
cp calc_server_modified.c calc_server.c
# Regle de nettoyage
clean:
rm -f client server *.o calc.h calc_svc.c calc_clnt.c calc_xdr.c
rm -f calc_client.c calc_server.c
struct operandes {
int x;
int y;
};
program CALC_PROG {
version CALC_VERSION {
int ADD(operandes) = 1;
int SUB(operandes) = 2;
} = VERSION_NUMBER;
} = PROGRAM_NUMBER;
#include "calc.h"
int *
add_1_svc(operandes *argp, struct svc_req *rqstp)
{
int *
sub_1_svc(operandes *argp, struct svc_req *rqstp)
{
return(&result);
}
#include "calc.h"
void
/** MODIFICATION DE CODE : ajout des operandes en parametre **/
calc_prog_1( char* host, int x, int y )
/** FIN DE MODIFICATION DE CODE **/
{
CLIENT *clnt;
int *result_1;
operandes add_1_arg;
int *result_2;
operandes sub_1_arg;
clnt = clnt_create(host, CALC_PROG, CALC_VERSION, "udp");
if (clnt == NULL) {
clnt_pcreateerror(host);
exit(1);
}
/** AJOUT DE CODE : initialisation du parametre de la RPC **/
add_1_arg.x = x ; add_1_arg.y = y ;
/** FIN D'AJOUT DE CODE **/
result_1 = add_1(&add_1_arg, clnt);
if (result_1 == NULL) {
clnt_perror(clnt, "call failed:");
}
/** AJOUT DE CODE : affichage du resultat de la RPC **/
printf("%d + %d = %d\n",add_1_arg.x,add_1_arg.y,*result_1);
/** FIN D'AJOUT DE CODE **/
/** AJOUT DE CODE : initialisation du parametre de la RPC **/
sub_1_arg.x = x ; sub_1_arg.y = y ;
/** FIN D'AJOUT DE CODE **/
result_2 = sub_1(&sub_1_arg, clnt);
if (result_2 == NULL) {
clnt_perror(clnt, "call failed:");
}
/** AJOUT DE CODE : affichage du resultat de la RPC **/
printf("%d - %d = %d\n",sub_1_arg.x,sub_1_arg.y,*result_2);
/** FIN D'AJOUT DE CODE **/
clnt_destroy( clnt );
}