Provided by:
manpages-fr_3.32d0.2p4-1_all 
NOM
raw, SOCK_RAW - Sockets brutes (raw) IPv4 sous Linux
SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, int protocole);
DESCRIPTION
Les sockets brutes (raw) permettent d'implementer des protocoles IPv4
dans l'espace utilisateur. Une socket raw recoit ou envoie des
datagrammes sans les en-tetes de la couche de liaison.
La couche IPv4 genere des en-tetes IP lorsqu'elle envoie un paquet a
moins que l'option IP_HDRINCL soit activee sur la socket. Lorsqu'elle
est activee, la socket doit contenir l'en-tete IP. Pour la reception,
l'en-tete IP est toujours inclus dans le paquet.
Seuls les processus avec un UID effectif nul ou une capacite
CAP_NET_RAW sont autorises a ouvrir des sockets raw.
Tous les paquets ou les erreurs correspondant au numero de protocole
specifie pour la socket raw sont transmis a cette socket. Pour voir une
liste des protocoles autorises, consultez les numeros assignes dans la
RFC 1700 et getprotobyname(3).
Un protocole IPPROTO_RAW implique l'activation de IP_HDRINCL et
autorise l'emission suivant n'importe quel protocole IP indiquee dans
l'en-tete. La reception de tous les protocoles IP avec IPPROTO_RAW
n'est pas possible avec les sockets raw.
+--------------------------------------------------------+
|IP Champs d'en-tete modifies en emission par IP_HDRINCL |
+--------------------+-----------------------------------+
|Checksum IP | Toujours rempli. |
+--------------------+-----------------------------------+
|Adresse source | Rempli si contient des zeros. |
+--------------------+-----------------------------------+
|ID Paquet | Rempli si contient des zeros. |
+--------------------+-----------------------------------+
|Longueur totale | Toujours rempli. |
+--------------------+-----------------------------------+
Si IP_HDRINCL est specifie et si l'en-tete IP a une adresse non-nulle,
alors l'adresse destination de la socket est utilisee pour router le
paquet. Quand MSG_DONTROUTE est specifie, l'adresse de destination
devrait toujours viser une interface locale. Sinon, un examen de la
table de routage a quand meme lieu, mais les routes avec une passerelle
sont ignorees.
Si IP_HDRINCL n'est pas specifie, les options d'en-tete IP peuvent etre
fixees sur les sockets raw avec setsockopt(2); consultez ip(7) pour
plus d'informations.
Dans Linux 2.2 tous les champs d'en-tete et les options peuvent etre
fixes en utilisant les options IP. Ceci signifie que les sockets raw ne
servent en general que pour les nouveaux protocoles ou les protocoles
sans interface utilisateur (comme ICMP).
Lorsqu'un paquet est recu, il est passe a toutes les sockets raw qui
ont ete attachees a son protocole avant d'etre 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,
definie dans ip(7). Le champ sin_port pourrait etre utilise pour
specifier un numero de protocole IP, mais il est ignore pour l'emission
dans Linux 2.2 et devrait etre toujours mis a zero (voir paragraphe
BOGUES). Pour les paquets entrants sin_port est rempli avec le
protocole du paquet. Consultez le fichier d'en-tete <netinet/in.h> pour
les protocoles IP valides.
Options de sockets
Les options des sockets raw peuvent etre ecrites avec setsockopt(2) et
lues avec getsockopt(2) en passant l'attribut de famille IPPROTO_RAW.
ICMP_FILTER
Active un filtre special sur les sockets raw attachees au
protocole IPPROTO_ICMP. La valeur a un bit pour chaque type de
message ICMP qui doit etre rejete. La valeur par defaut est de
ne filtrer aucun messages ICMP.
De plus, toutes les options IPPROTO_IP de ip(7) valides pour les
sockets datagrammes sont prises en charge.
Traitement des erreurs
Les erreurs provenant du reseau ne sont transmises a l'utilisateur que
lorsque la socket est connectee ou si le drapeau IP_RECVERR est actif.
Pour les sockets connectees, seules EMSGSIZE et EPROTO sont transmises,
pour compatibilite. Avec IP_RECVERR, toutes les erreurs reseau sont
sauvegardees dans la file d'erreurs.
ERREURS
EACCES L'utilisateur essaye d'envoyer sur une adresse broadcast sans
avoir le drapeau broadcast sur la socket.
EFAULT Une adresse memoire invalide a ete fournie.
EINVAL Argument invalide.
EMSGSIZE
Paquet trop grand. Soit la recherche du MTU des chemins est
active (voir l'attribut IP_MTU_DISCOVER de socket), soit la
taille du paquet depasse le maximum autorise par IPv4 (64 Ko).
EOPNOTSUPP
Un attribut invalide a ete transmis a un appel sur la socket
(comme MSG_OOB).
EPERM L'utilisateur n'a pas la permission d'ouvrir des sockets raw.
Seuls les processus avec un UID effectif nul ou la capacite
CAP_NET_RAW peuvent le faire.
EPROTO Une erreur ICMP est arrivee, indiquant un probleme de
parametrage.
VERSIONS
IP_RECVERR et ICMP_FILTER sont nouveaux dans Linux 2.2. Ce sont des
extensions Linux et ne doivent pas etre employes dans des programmes
portables.
Linux 2.0 assurait une compatibilite bogue-a-bogue avec le code des
sockets raw de BSD lorsque l'attribut SO_BSDCOMPAT etait utilise. Ceci
a ete supprime dans 2.2.
NOTES
Par defaut, les sockets brutes utilisent la detection du MTU
(<< Maximum Transmission Unit >>) pour le chemin. Cela signifie que le
noyau garde en memoire le MTU vers une adresse IP cible specifique, et
renvoie EMSGSIZE lorsqu'un paquet brut depasse cette taille. Dans ce
cas, l'application doit diminuer la taille du paquet. La detection du
MTU par chemin peut aussi etre desactivee en utilisant l'option de
socket IP_MTU_DISCOVER ou le fichier
/proc/sys/net/ipv4/ip_no_pmtu_disc, consultez ip(7) pour plus de
details. Lorsque cette option est desactivee, les sockets brutes
fragmenteront les paquets sortants qui depassent le MTU de l'interface.
Ceci est cependant decourage, pour des raisons de performance et de
fiabilite.
Une socket raw peut etre attachee a une adresse locale specifique en
utilisant l'appel bind(2). Si elle n'est pas attachee, tous les paquets
du protocole IP specifie sont recus. De plus, une socket raw peut etre
attachee a un peripherique reseau particulier avec SO_BINDTODEVICE ;
consultez socket(7).
Une socket IPPROTO_RAW ne fonctionne qu'en emission. Si vous desirez
vraiment recevoir tous les paquets IP, utilisez une socket packet(7)
avec le protocole ETH_P_IP. Notez que les sockets packet ne
reassemblent pas les fragments IP contrairement aux sockets raw.
Si vous voulez recevoir tous les paquets ICMP pour une socket
datagramme, il est souvent preferable d'utiliser IP_RECVERR sur cette
socket particuliere, consultez ip(7).
Les sockets raw peuvent capturer tous les protocoles IP sous Linux,
meme les protocoles comme ICMP ou TCP qui ont un module dans le noyau.
Dans ce cas, le paquet est passe simultanement au module du noyau et a
la socket raw. Ce comportement n'est pas portable, de nombreuses autres
implementations des sockets BSD ont des limitations ici.
Linux ne modifie jamais les en-tetes fournis par l'utilisateur (sauf
pour remplir les champs ne contenant que des zeros comme cela est
decrit pour IP_HDRINCL). Ceci differe de nombreuses autres
implementations des sockets raw.
Les sockets raw sont en general peu portables et devrait etre evitees
dans les programmes destines a etre portables.
L'emission sur les sockets raw devrait employer le protocole dans
sin_port ; ceci a ete perdu dans Linux 2.2. Un remede est d'utiliser
IP_HDRINCL.
BOGUES
Les extensions de Proxy transparent ne sont pas decrites.
Lorsque l'option IP_HDRINCL est active, les datagrammes ne seront pas
fragmentes et sont limites au MTU de l'interface.
Utiliser en emission le protocole IP indique dans sin_port a ete
supprime dans Linux 2.2. On utilise toujours le protocole auquel la
socket a ete attachee avec bind(2) ou celui de l'appel socket(2)
initial.
VOIR AUSSI
recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7).
RFC 1191 pour la recherche du MTU du chemin.
RFC 791 et le fichier d'en-tete <linux/ip.h> pour le protocole IP.
COLOPHON
Cette page fait partie de la publication 3.32 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003),
Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Julien
Cristau et l'equipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.