1 où trouver des informations sur les protocoles?
Les RFC (Request For Comments) sont des documents qui spécifient totalement un protocole, vous pouvez les obtenir en tappant simplement RFC + nom_du_protocole dans un moteur de recherche.
la RFC est un document indispensable pour le développement réseau, c'est le respect de sa spécification qui garantiras le fonctionnement de votre logiciel avec les autres applications implémentant le protocole.
2 opter pour TCP ou UDP?
il faut d’abord comprendre la différence entre un protocole orienté connexion et
un protocole non connecté. Une manière simple de voir le problème pourrait se
poser sous forme d’une question unique: que doit-il se passer lorsque un paquet
est perdu/endommagé?
TCP:
-le paquet doit-être re-émis automatiquement (ex: les messageries
instantanées, transfert de fichiers...)
UDP:
-le paquet est jeté, ce qui compte c’est le flux de donnée, ce paquet
perdu est déjà obsolète et ne ferais qu’encombrer la liaison (ex: VoIP,
flux audio/videos en général, jeux vidéo...)
3 gérer plusieurs clients?
il existe plusieurs écoles, chacune avec ses avantages et inconvénients:
• threading: consiste à créer un thread, voir un processus complet (fork)
pour chaque nouveau client.
avantage: simple à coder
inconvénient: peu performant
• mode non bloquant: les sockets sont paramétrés en mode non bloquant,
les opérations de lecture/écriture retournent immédiatement une valeur
caractéristique pour indiquer qu’elles auraient du bloquer.
avantage: -
inconvénient: utilisation CPU élevée.
• signaux : le signal SIGIO seras levé lorsque qu'un socket seras prêt en lecture/écriture et le flux du processus dérouté sur notre gestionnaire de signaux
avantage: gestion dynamique des IO.
inconvénient: programmation interruptible
• multiplexage: on confie notre ”pool” de sockets à une fonction tel que
select ou poll qui vont se charger d’indiquer sur quels sockets on est capable d’effectuer une action non-bloquante.
avantage: centralisation des fonctions bloquantes
inconvénient: code plus complexe
dans la plupart des cas, des hybrides mélangeant ces techniques de base sont utilisés.
pour la FAQ linux? ou mériterais un petit article plus complet?
4 envois de fichiers en mode Zero Copy
si vous devez envoyer des fichiers dans un socket, vous pouvez utiliser sous linux
l’appel système sendfile() qui copie directement d’un descripteur à l’autre. plus
de buffer à se trimballer et surtout, tout se fait au niveau du kernel, vous ne
passez plus par l’espace utilisateur. si vous avez besoin d’ajouter une entête au
fichier (taille,nom,encodage...), utilisez le mode TCP CORK qui permet de ne
pas envoyer les trames partielles, afin de garantir un meilleur rendement de la
liaison. exemple de code:
1 2 3 4 5 6 7 8 9 10 11 12
|
int mf = open ("filename.ext", O_RDONLY);
off t len = lseek (mf, 0, SEEK_END);
lseek (mf, 0, SEEK_SET);
int state = 1;
setsockopt (client->fd, IPPROTO_TCP, TCP_CORK, &state, sizeof
(state));
sendheader(client->fd,"filename.ext",len);
sendfile(client->fd,mf,NULL,len);
state = 0;
setsockopt (client->fd, IPPROTO_TCP, TCP_CORK, &state, sizeof
(state)); |
5 Modèle OSI? couches? Je suis perdu !
le Modèle OSI as été créé par l’ISO afin de fournir une démarche garantissant
l’inter-opérabilité des réseaux ouverts entre eux. c’est un modèle très théorique
et abstrait duquel dérive d’autres modèles.
les plus connu sont: TCP/IP et ATM
le modèle OSI ne concerne pas le développeur applicatif qui utilise le réseau de
manière transparente via des APIs (ex: sockets)
6 comment débugguer mon application réseau?
dans le cas d'un protocole texte, netcat est tout indiqué pour faire des tests unitaires de toutes les (séquences d')opérations possibles.
pour des protocoles plus élaborés, Scapy permettras, à ceux qui auront pris le temps de l'apprivoiser, de forger n'importe quels paquets et de l'envoyer
pour ceux que Scapy rebutent, wireshark (anciennement ethereal) permet déjà pas mal de choses.
Partager