raw(7)

NUME
raw - socluri Linux IPv4 raw (brute)

SINOPSIS
#include <sys/socket.h>
#include <netinet/in.h>
raw_socket = socket(AF_INET, SOCK_RAW, int protocol);

DESCRIERE
Soclurile brute permit implementarea noilor protocoale IPv4 în spațiul utilizatorului. Un soclu brut primește sau trimite diagrama de date brută, fără a include antetele nivelului/stratului de legătură(conexiune).

Stratul IPv4 generează un antet IP atunci când trimite un pachet, cu excepția cazului în care opțiunea de soclu IP_HDRINCL este activată pe soclu. Atunci când aceasta este activată, pachetul trebuie să conțină un antet IP. Pentru recepție, antetul IP este întotdeauna inclus în pachet.

Pentru a crea un soclu brut, un proces trebuie să aibă capacitatea CAP_NET_RAW în spațiul de nume al utilizatorului care guvernează spațiul său de nume de rețea.

Toate pachetele sau erorile care corespund numărului protocol specificat pentru soclul brut sunt transmise către acest soclu. Pentru o listă a protocoalelor permise, consultați lista IANA de numere de protocol atribuite la http://www.iana.org/assignments/protocol-numbers/ și getprotobyname(3).

Un protocol IPPROTO_RAW implică activarea IP_HDRINCL și poate trimite orice protocol IP care este specificat în antetul transmis. Primirea tuturor protocoalelor IP prin IPPROTO_RAW nu este posibilă utilizând socluri brute.
    Câmpurile antetului IP modificate la trimiterea prin IP_HDRINCL
    IP Checksum | Întotdeauna completat
    Source Address | Completat când este zero
    Packet ID | Completat când este zero
    Lungimea totală | Întotdeauna completat

Dacă IP_HDRINCL este specificat și antetul IP are o adresă de destinație diferită de zero, atunci adresa de destinație a soclului este utilizată pentru direcționarea pachetului. Atunci când se specifică MSG_DONTROUTE, adresa de destinație trebuie să se refere la o interfață locală, altfel se efectuează oricum o căutare în tabela de direcționare, dar rutele gateway (prin poartă de acces) sunt ignorate.

Dacă IP_HDRINCL nu este activat, atunci opțiunile antetului IP pot fi activate pe socluri brute cu setsockopt(2); consultați ip(7) pentru mai multe informații.

Începând cu Linux 2.2, toate câmpurile și opțiunile antetului IP pot fi configurate utilizând opțiunile soclului IP. Aceasta înseamnă că soclurile brute sunt de obicei necesare doar pentru protocoalele noi sau pentru protocoalele fără interfață utilizator (cum ar fi ICMP).

Atunci când se primește un pachet, acesta este transmis tuturor soclurilor brute care au fost asociate protocolului său înainte de a fi transmis altor gestionari de protocol (de exemplu, modulele de protocol ale nucleului).

  Formatul adreselor
Pentru trimiterea și primirea de diagrame de date (sendto(2), recvfrom(2) și altele similare), soclurile brute utilizează structura de adrese standard sockaddr_in definită în ip(7). Câmpul sin_port ar putea fi utilizat pentru a specifica numărul protocolului IP, dar este ignorat pentru trimitere în Linux 2.2 și ulterior și ar trebui să fie întotdeauna stabilit la 0 (a se vedea secțiunea ERORI). Pentru pachetele primite, sin_port este setat la zero.

  Opțiuni de soclu
Opțiunile soclului brut pot fi stabilite cu setsockopt(2) și citite cu getsockopt(2) prin trecerea fanionului familiei IPPROTO_RAW.

ICMP_FILTER
    Activează un filtru special pentru socluri brute asociate protocolului IPPROTO_ICMP. Valoarea are un bit activat pentru fiecare tip de mesaj ICMP care ar trebui să fie filtrat. Valoarea implicită este de a nu filtra niciun mesaj ICMP.

În plus, sunt acceptate toate opțiunile de soclu ip(7) IPPROTO_IP valabile pentru socluri de diagrame de date.

  Gestionarea erorilor
Erorile provenite din rețea sunt transmise utilizatorului numai atunci când soclul este conectat sau fanionul IP_RECVERR este activat. Pentru soclurile conectate, numai EMSGSIZE și EPROTO sunt transmise pentru compatibilitate. Cu IP_RECVERR, toate erorile de rețea sunt salvate în coada de erori.

ERORI-IEȘIRE

EACCES
    Utilizatorul a încercat să trimită la o adresă de difuzare fără a avea fanionul de difuzare activat pe soclu.

EFAULT
    A fost furnizată o adresă de memorie nevalidă.

EINVAL
    Argument nevalid.

EMSGSIZE
    Pachet prea mare. Fie Descoperirea MTU a rutei este activată (fanionul de soclu IP_MTU_DISCOVER), fie dimensiunea pachetului depășește dimensiunea maximă permisă a pachetului IPv4 de 64 ko.

EOPNOTSUPP
    Un fanion nevalid a fost pasat unui apel de soclu (cum ar fi MSG_OOB).

EPERM
    Utilizatorul nu are permisiunea de a deschide socluri brute. Numai procesele cu un ID utilizator efectiv de 0 sau atributul CAP_NET_RAW pot face acest lucru.

EPROTO
    A sosit o eroare ICMP care raportează o problemă de parametru.

VERSIUNI
IP_RECVERR și ICMP_FILTER sunt introduse nou în Linux 2.2. Acestea sunt extensii Linux și nu ar trebui să fie utilizate în programe portabile.

Linux 2.0 a activat o anumită compatibilitate bug-to-bug cu BSD în codul de soclu brut atunci când opțiunea de soclu SO_BSDCOMPAT a fost activată; începând cu Linux 2.2, această opțiune nu mai are acest efect.

NOTE
În mod implicit, soclurile brute descoperă ruta MTU (Maximum Transmission Unit). Aceasta înseamnă că nucleul va ține evidența MTU către o anumită adresă IP țintă și va returna EMSGSIZE atunci când scrierea unui pachet brut o depășește. Atunci când se întâmplă acest lucru, aplicația ar trebui să reducă dimensiunea pachetului. Descoperirea MTU a rutei poate fi, de asemenea, dezactivată utilizând opțiunea de soclu IP_MTU_DISCOVER sau fișierul /proc/sys/net/ipv4/ip_no_pmtu_disc, consultați ip(7) pentru detalii. Atunci când sunt dezactivate, soclurile brute vor fragmenta pachetele de ieșire care depășesc MTU-ul interfeței. Cu toate acestea, dezactivarea nu este recomandată din motive de performanță și fiabilitate.

Un soclu brut poate fi legat la o anumită adresă locală utilizând apelul bind(2). Dacă nu este legată, sunt primite toate pachetele cu protocolul IP specificat. În plus, un soclu brut poate fi legat la un anumit dispozitiv de rețea utilizând SO_BINDTODEVICE; consultați socket(7).

Un soclu IPPROTO_RAW este numai de trimitere. Dacă doriți cu adevărat să primiți toate pachetele IP, utilizați un soclu packet(7) cu protocolul ETH_P_IP. Rețineți că soclurile de pachete nu reasamblează fragmentele IP, spre deosebire de soclurile brute.

Dacă doriți să primiți toate pachetele ICMP pentru un soclu de diagrame de date, este adesea mai bine să utilizați IP_RECVERR pe acel soclu; consultați ip(7).

Soclurile brute pot atinge toate protocoalele IP în Linux, chiar și protocoale precum ICMP sau TCP, care au un modul de protocol în nucleu. În acest caz, pachetele sunt transmise atât modulului din nucleu, cât și soclului (soclurilor) brut(e). Nu ar trebui să vă bazați pe acest lucru în programele portabile, multe alte implementări de soclu BSD au limitări aici.

Linux nu modifică niciodată antetele transmise de utilizator (cu excepția completării unor câmpuri cu zero, așa cum este descris pentru IP_HDRINCL). Acest lucru diferă de multe alte implementări ale soclurilor brute.

Soclurile brute sunt, în general, destul de neportabile și ar trebui evitate în programele destinate să fie portabile.

Trimiterea pe socluri brute ar trebui să preia protocolul IP din sin_port; această capacitate a fost pierdută în Linux 2.2. Soluția este de a utiliza IP_HDRINCL.

ERORI
Extensiile proxy transparente nu sunt descrise.

Atunci când opțiunea IP_HDRINCL este activată, diagramele de date nu vor fi fragmentate și sunt limitate la MTU-ul interfeței.

Definirea protocolului IP pentru trimitere în sin_port s-a pierdut în Linux 2.2. Protocolul la care a fost asociat soclul sau care a fost specificat în apelul inițial socket(2) este întotdeauna utilizat.

CONSULTAȚI ȘI
recvmsg(2), sendmsg(2), capabilities(7), ip(7), socket(7)

RFC 1191 pentru descoperirea MTU a rutei. RFC 791 și fișierul de antet <linux/ip.h> pentru protocolul IP.

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.