Provided by: manpages-fr_4.26.0-1_all bug

NOM

       raw – Sockets 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  raw  (bruts,  sans  protocole)  permettent  d'implémenter  de nouveaux protocoles IPv4 dans
       l'espace utilisateur. Un socket raw reçoit ou envoie des datagrammes bruts sans les en-têtes de 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  de
       socket ne soit activée sur le socket. Lorsqu'elle est activée, le socket doit contenir l'en-tête IP. Pour
       la réception, l'en-tête IP est toujours inclus dans le paquet.

       Dans le but de créer un socket raw, un processus doit avoir la capacité CAP_NET_RAW dans l’espace de noms
       utilisateur qui régit son espace de noms réseau.

       Tous  les  paquets  ou  les  erreurs correspondant au numéro de protocole indiqué pour le socket raw sont
       transmis à ce socket. Pour voir une liste des protocoles autorisés, consultez les numéros  assignés  dans
       http://www.iana.org/assignments/protocol-numbers/ et getprotobyname(3).

       Un  protocole  IPPROTO_RAW  implique  l'activation de IP_HDRINCL et autorise l'émission suivant n'importe
       quel protocole IP indiqué dans l'en-tête. La réception de tous les protocoles IP avec  IPPROTO_RAW  n'est
       pas possible avec les sockets raw.
              ┌─────────────────────────────────────────────────────────┐
              │ Champs d'en-tête IP modifiés en émission par IP_HDRINCL │
              ├──────────────────────────┬──────────────────────────────┤
              │ Somme de contrôle d’IP   │ Toujours rempli              │
              ├──────────────────────────┼──────────────────────────────┤
              │ Adresse de socket        │ Rempli si composé de zéros   │
              ├──────────────────────────┼──────────────────────────────┤
              │ ID de paquet             │ Rempli si composé de zéros   │
              ├──────────────────────────┼──────────────────────────────┤
              │ Longueur totale          │ Toujours rempli              │
              └──────────────────────────┴──────────────────────────────┘

       Si  IP_HDRINCL  est  indiqué  et  si  l'en-tête IP a une adresse de destination différente de zéro, alors
       l'adresse de destination du socket est utilisée pour router le paquet. Quand MSG_DONTROUTE  est  indiqué,
       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 indiqué, les options d'en-tête IP peuvent être définies sur les sockets raw  avec
       setsockopt(2) ; consultez ip(7) pour plus d'informations.

       Depuis  Linux  2.2  tous  les  champs  d'en-tête  IP et les options peuvent être définis en utilisant les
       options IP de socket. Cela 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é à tous les sockets raw qui ont été attachés à son protocole avant
       d'être  transmis  aux  gestionnaires  des  autres  protocoles  (par exemple les modules des protocoles du
       noyau).

   Formats d'adresse
       Pour envoyer et recevoir  des  datagrammes  (sendto(2),  recvfrom(2)  et  similaires),  les  sockets  raw
       utilisent  la  structure  d'adresse  sockaddr_in standard, définie dans ip(7). Le champ sin_port pourrait
       être utilisé pour indiquer un numéro de protocole IP, mais il est ignoré pour l'émission dans  Linux  2.2
       et  les versions suivantes et devrait être toujours mis à zéro (voir paragraphe BOGUES). Pour les paquets
       entrants sin_port est réglé à zéro.

   Options de socket
       Les options des sockets raw peuvent être écrites avec setsockopt(2) et lues avec getsockopt(2) en passant
       l'attribut de famille IPPROTO_RAW.

       ICMP_FILTER
              Activer un filtre spécial sur les sockets raw liés au protocole IPPROTO_ICMP. La valeur a  un  bit
              défini  pour  chaque  type  de  message  ICMP qui doit être rejeté. La valeur par défaut est de ne
              filtrer aucun message ICMP.

       De plus, toutes les options IPPROTO_IP de ip(7) valables pour les  sockets  datagrammes  sont  prises  en
       charge.

   Traitement des erreurs
       Les  erreurs provenant du réseau ne sont transmises à l'utilisateur que lorsque le socket est connecté ou
       si le drapeau IP_RECVERR est actif. Pour les sockets connectés, 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

       EACCES L'utilisateur essaye d'envoyer sur une adresse broadcast sans avoir le drapeau  broadcast  sur  le
              socket.

       EFAULT Une adresse mémoire incorrecte a été fournie.

       EINVAL Argument incorrect.

       EMSGSIZE
              Paquet  trop  grand.  Soit la recherche du MTU d’un chemin donné (Path MTU discovery — PMTUd)) est
              active (voir l'attribut IP_MTU_DISCOVER de socket), soit la taille du paquet  dépasse  le  maximum
              autorisé par IPv4 (64 Ko).

       EOPNOTSUPP
              Un attribut incorrect a été transmis à un appel de socket (comme MSG_OOB).

       EPERM  L'utilisateur  n'a  pas  la  permission  d'ouvrir des sockets raw. Seuls les processus avec un UID
              effectif égal à zéro ou ayant la capacité CAP_NET_RAW peuvent le faire.

       EPROTO Une erreur ICMP est arrivée, indiquant un problème de paramétrage.

VERSIONS

       IP_RECVERR et ICMP_FILTER sont nouveaux dans Linux 2.2. Ce sont des extensions Linux qui ne  doivent  pas
       être employées dans des programmes portables.

       Linux  2.0  assurait une compatibilité bogue-à-bogue avec le code des sockets raw de BSD lorsque l’option
       SO_BSDCOMPAT de socket était utilisée. Cela a été supprimé depuis Linux 2.2.

NOTES

       Par défaut, les sockets bruts utilisent la détection du  MTU  (« Maximum  Transmission  Unit »)  pour  le
       chemin.  Cela  signifie  que  le  noyau  garde  en mémoire le MTU vers une adresse IP cible spécifique et
       renvoie EMSGSIZE lorsqu'un paquet raw dépasse cette taille. Dans ce cas, l'application doit  diminuer  la
       taille  du  paquet.  La  détection du MTU d’un chemin peut aussi être désactivée 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
       détails.  Lorsque  cette  option  est  désactivée, les sockets raw fragmenteront les paquets sortants qui
       dépassent le MTU de l'interface. C’est cependant  découragé,  pour  des  raisons  de  performance  et  de
       fiabilité.

       Un  socket raw peut être attaché à une adresse locale spécifique en utilisant l'appel bind(2). S’il n'est
       pas attaché, tous les paquets du protocole IP indiqué sont reçus.  De  plus,  un  socket  raw  peut  être
       attaché à un périphérique réseau particulier avec SO_BINDTODEVICE ; consultez socket(7).

       Un  socket  IPPROTO_RAW  ne fonctionne qu'en émission. Si vous désirez vraiment recevoir tous les paquets
       IP, utilisez un 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  un  socket  datagram,  il  est  souvent  préférable
       d'utiliser IP_RECVERR sur ce socket particulier, consultez ip(7).

       Les  sockets  raw  peuvent exploiter tous les protocoles IP sous Linux, même les protocoles comme ICMP ou
       TCP qui ont un module de protocole dans le noyau. Dans ce cas, les paquets  sont  passés  à  la  fois  au
       module  du  noyau  et  au(x)  socket(s)  raw.  Ce  comportement  n'est pas portable, de nombreuses autres
       implémentations des sockets BSD ont leurs propres limites à ce sujet.

       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). Ça diffère de nombreuses autres implémentations des
       sockets raw.

       Les sockets raw sont en général peu portables et devraient être évités dans  les  programmes  destinés  à
       être portables.

       L'émission  sur  les sockets raw devrait employer le protocole IP dans sin_port ; cette possibilité a été
       perdue dans Linux 2.2. Une solution est d'utiliser IP_HDRINCL.

BOGUES

       Les extensions de mandataire 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.

       Utiliser  le  protocole  IP indiqué dans sin_port en émission a été supprimé dans Linux 2.2. Le protocole
       auquel le socket a été lié ou celui indiqué dans l'appel socket(2) initial est toujours utilisé.

VOIR AUSSI

       recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7)

       RFC 1191 pour la recherche du MTU de chemin.  RFC 791  et  le  fichier  d'en-tête  <linux/ip.h>  pour  le
       protocole IP.

TRADUCTION

       La   traduction   française   de   cette   page   de   manuel   a   été   créée   par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,   Stéphan   Rafin   <stephan.rafin@laposte.net>,   Thierry   Vignaud
       <tvignaud@mandriva.com>,  François  Micaux,  Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
       <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-luc.coulon@wanadoo.fr>,   Julien   Cristau
       <jcristau@debian.org>,      Thomas      Huriaux      <thomas.huriaux@gmail.com>,     Nicolas     François
       <nicolas.francois@centraliens.net>,    Florentin    Duneau    <fduneau@gmail.com>,     Simon     Paillard
       <simon.paillard@resel.enst-bretagne.fr>,     Denis    Barbier    <barbier@debian.org>,    David    Prévot
       <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

       Cette traduction est une documentation libre ; veuillez vous  reporter  à  la  GNU General Public License
       version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si  vous  découvrez  un  bogue  dans la traduction de cette page de manuel, veuillez envoyer un message à
       debian-l10n-french@lists.debian.org.

Pages du manuel de Linux 6.9.1                     2 mai 2024                                             raw(7)