RAW
Section: Manuel de l'administrateur Linux (7) Updated: 25 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
FORMAT D'ADRESSE
OPTIONS DES SOCKETS
NOTES
GESTION D'ERREUR
ERREURS
VERSIONS
BOGUES
AUTEURS
VOIR AUSSI
TRADUCTION
NOM
raw, SOCK_RAW - Sockets brutes (raw) IPv4 sous Linux.
SYNOPSIS
DESCRIPTION
Les sockets brutes (raw) permettent d'implémenter des protocoles IPv4 dans l'espace
utilisateur. Une socket raw reçoit ou envoie des datagrammes sans les en-têtes
de la couche de liaison.
La couche IPv4 génère des en-têtes IP lorsqu'elle envoie un paquet à moins que l'option
IP_HDRINCL
soit activée sur la socket.
Lorsqu'elle est activée, la socket doit contenir l'en-tête IP.
Pour la réception, l'en-tête IP est toujours inclus dans le paquet.
Seuls les processus avec un UID effectif nul ou une capacité
CAP_NET_RAW
sont autorisés à ouvrir des sockets raw.
Tous les paquets ou les erreurs correspondant au numéro de
protocole
spécifié pour la
socket raw sont transmis à cette socket. Pour voir une liste des
protocoles autorisés, consulter les numéros assignés dans la RFC 1700 et
getprotobyname(3).
Un protocole
IPPROTO_RAW
implique l'activation de
IP_HDRINCL
et autorise l'émission suivant n'importe quel protocole IP indiquée dans
l'en-tête. La réception de tous les protocoles IP avec
IPPROTO_RAW
n'est pas possible avec les sockets raw.
IP Champs d'en-tête modifiés en émission par IP_HDRINCL
|
| Checksum IP | Toujours rempli.
|
| Adresse source | Rempli si contient des zéros.
|
| ID Paquet | Rempli si contient des zéros.
|
| Longueur totale | Toujours rempli.
|
Si
IP_HDRINCL
est spécifié et si l'en-tête IP à une adresse non-nulle, alors l'adresse
destination de la socket est utilisée pour router le paquet. Quand
MSG_DONTROUTE
est spécifié, l'adresse de destination devrait toujours viser une interface locale
sinon un examen de la table de routage a quand même lieu, mais les routes avec
une passerelle sont ignorées.
Si
IP_HDRINCL
n'est pas spécifié, alors les options d'en-tête IP peuvent être fixées sur les
sockets raw avec
setsockopt(2);
voir
ip(7)
pour plus d'informations.
Dans Linux 2.2 tous les champs d'en-tête et les options peuvent être fixés en
utilisant les options IP. Ceci signifie que les sockets raw ne servent en général
que pour les nouveaux protocoles ou les protocoles sans interface utilisateur (comme ICMP).
Lorsqu'un paquet est reçu, il est passé à toutes les sockets raw qui ont été attachées
à son protocole avant d'être transmis aux gestionnaires des autres protocoles (par exemple
les modules des protocoles du noyau).
FORMAT D'ADRESSE
Les sockets raw utilisent la structure d'adresse
sockaddr_in
standard, définie dans
ip(7).
Le champ
sin_port
peut être utilisé pour spécifier un numéro de protocole IP, mais il est ignoré pour
l'émission dans Linux 2.2 et devrait être toujours mis à
zéro (voir paragraphe BOGUES).
Pour les paquets entrants
sin_port
est rempli avec le protocole du paquet.
Voir le fichier d'en-tête
<netinet/in.h>
pour les protocoles IP valides.
OPTIONS DES SOCKETS
Les options des sockets raw peuvent être écrites avec
setsockopt(2)
et lues avec
getsockopt(2)
en passant l'attribut de
famille
SOL_RAW.
- ICMP_FILTER
-
Active un filtre spécial sur les sockets raw attachées au protocole
IPPROTO_ICMP.
La valeur a un bit pour chaque type de message ICMP qui doit être
rejeté. La valeur par défaut est de ne filtrer aucun messages ICMP.
De plus, toutes les options
SOL_IP de
ip(7)
valides pour les sockets datagrammes sont supportées.
NOTES
Les sockets raw fragmentent un paquet lorsque sa longueur totale dépasse le
MTU de l'interface (voir toutefois le paragraphe BOGUES).
Une alternative plus rapide et préférable pour le réseau est d'implémenter la recherche
du MTU des chemins comme décrit dans la section
IP_PMTU_DISCOVER
de
ip(7).
Une socket raw peut être attachée à une adresse locale spécifique en utilisant l'appel
bind(2).
Si elle n'est pas attachée, tous les paquets du protocole IP spécifié sont reçus.
De plus une socket raw peut être attachée à un périphérique réseau particulier avec
SO_BINDTODEVICE ;
voir
socket(7).
Une socket
IPPROTO_RAW
ne fonctionne qu'en émission.
Si vous désirez vraiment recevoir tous les paquets IP, utilisez une socket
packet(7)
avec le protocole
ETH_P_IP.
Notez que les sockets packet ne réassemblent pas les fragments IP contrairement aux sockets raw.
Si vous voulez recevoir tous les paquets ICMP pour une socket datagramme, il est souvent
préférable d'utiliser
IP_RECVERR
sur cette socket particulière, voir
ip(7).
Les sockets raw peuvent capturer tous les protocoles sous Linux, même les protocoles comme
ICMP ou TCP qui ont un module dans le noyau. Dans ce cas, le paquet est passé simultanément
au module du noyau et à la socket raw. Ce comportement n'est pas portable, de nombreuses
autres implémentations des sockets BSD ont des limitations ici.
Linux ne modifie jamais les en-têtes fournis par l'utilisateur (sauf pour remplir les
champs ne contenant que des zéros comme cela est décrit pour
IP_HDRINCL).
Ceci diffère de nombreuses autres implémentations des sockets raw.
Les sockets raw sont en général peu portables et devrait être évitées dans les
programmes conçus pour être adaptés sur d'autres systèmes
L'émission sur les sockets raw devrait employer le protocole dans
sin_port ;
ceci a été perdu dans Linux 2.2. Un remède est d'utiliser
IP_HDRINCL.
GESTION D'ERREUR
Les erreurs provenant du réseau ne sont transmise à l'utilisateur que lorsque la socket
est connectée ou si le drapeau
IP_RECVERR
est actif. Pour les sockets connectées, seules
EMSGSIZE
et
EPROTO
sont transmises, pour compatibilité. Avec
IP_RECVERR
toutes les erreurs réseau sont sauvegardées dans la file d'erreurs.
ERREURS
- EMSGSIZE
-
Paquet trop grand. Soit la recherche du MTU des chemins est active (voir l'attribut
IP_PMTU_DISCOVER
de socket) soit la taille du paquet dépasse le maximum autorisé par IPv4
(64 Ko).
- EACCES
-
L'utilisateur essaye d'envoyer sur une adresse broadcast sans avoir le
drapeau broadcast sur la socket.
- EPROTO
-
Une erreur ICMP est arrivé, indiquant un problème de paramétrage.
- EFAULT
-
Une adresse mémoire invalide a été fournie.
- EOPNOTSUPP
-
Un attribut invalide a été transmis à un appel sur la socket (comme
MSG_OOB).
- EINVAL
-
Argument invalide.
- EPERM
-
L'utilisateur n'a pas la permission d'ouvrir des sockets raw. Seuls les
processus avec un UID effectif nul ou la capacité
CAP_NET_RAW
peuvent le faire.
VERSIONS
IP_RECVERR
et
ICMP_FILTER
sont nouveaux dans Linux 2.2. Ce sont des extensions Linux et ne doivent pas être
employés dans des programmes portables.
Linux 2.0 assurait une compatibilité bogue-à-bogue avec le code des sockets raw de
BSD lorsque l'attribut SO_BSDCOMPAT était utilisé. Ceci a été supprimé dans 2.2.
BOGUES
Les extensions de Proxy transparent ne sont pas décrites.
Lorsque l'option
IP_HDRINCL
est active, les datagrammes ne seront pas fragmentés et sont limités au MTU de l'interface.
C'est une limitation de Linux 2.2.
Utiliser en émission le protocole IP indiqué dans
sin_port
a été supprimé dans Linux 2.2. On utilise toujours le protocole auquel la socket a été attachée
avec bind(2) ou celui de l'appel
socket(2)
initial.
AUTEURS
Cette page de manuel a été écrite par Andi Kleen.
VOIR AUSSI
TRADUCTION
Christophe Blaess, 2001-2003.
|