Anatomia unei stive de rețea în Linux

Introducere în Protocoale

In timp ce introducerile formale la rețele de obicei se referă la modelul Open Systems Interconnection (OSI - Open Systems interconectare), o introducere în stiva de bază de rețea în Linux utilizează patru modelul cunoscut sub numele de (modelul de Internet) Internet (a se vedea figura 1) .

Figura 1. Modelul de Internet al unei stive de rețea

În partea de jos a stivei este stratul de legătură. Stratul de legătură de date se referă la driverele de dispozitiv, oferind acces la stratul fizic, care poate consta din mai multe medii, cum ar fi canalele secvențiale sau dispozitive Ethernet. Deasupra canalului este stratul de rețea. care este responsabil pentru trimiterea pachetelor la destinație. Nivelul următor se numește transportul este responsabil pentru peer (peer-to-peer) de comunicare (de ex, într-o gazdă). Controalele de strat de rețea de comunicații între gazde și transportul - interacțiunea dintre punctele finale din cadrul acestor gazde. În final, există stratul de aplicație. care este de obicei deplasat și își dă seama de date semantice. De exemplu, Hypertext Transfer Protocol (HTTP - Hypertext Transfer Protocol) se mută cereri și răspunsuri pentru conținutul Web între server și client.

Arhitectura de rețea Core

Ne întoarcem acum la arhitectura stiva de rețea Linux și modul în care pune în aplicare modelul de pe Internet. Figura 2 oferă o vedere la nivel înalt al stivei de rețea Linux. In partea de sus este stratul de utilizator spațiu sau o aplicație. care definește utilizatorii stiva de rețea. În partea de jos sunt dispozitivele fizice. care permit conectarea cu rețelele (rețele de serie sau de mare viteză, cum ar fi Ethernet). În centru, sau în spațiul nucleu. - subsistemul de rețea, care este punctul central al acestui articol. Prin stiva de rețea în interiorul tampoanelor soclu testate (sk_buffs), care se deplasează pachete de date între surse și receptori. Pe scurt va fi afișată structura sk_buff.

Figura 2. Arhitectura de nivel înalt al stivei de rețea Linux

În primul rând, aici este o scurtă trecere în revistă a principalelor elemente ale subsistemului de rețea cu Linux în detaliu în următoarele secțiuni. La partea de sus (a se vedea figura 2) este un sistem numit interfața de apel de sistem. Acesta oferă doar o modalitate de a aplicațiilor din spațiul utilizator pentru a avea acces la nucleul subsistemului de rețea. Următorul este un (protocol agnostic) la nivel de protocol independent, care oferă un mod comun de a lucra cu protocoalele de strat de transport care stau la baza. În continuare sunt protocoalele reale, care în Linux includ construit protocoale TCP, UDP, si, desigur, PA. În continuare - un alt strat independent, care oferă o interfață comună pentru driverele individuale pentru dispozitive disponibile, și de la ei, a urmat la sfârșitul ei înșiși aceste drivere.

Interfață apel sistem

interfață de apel de sistem poate fi descrisă în două moduri. Când apelul de rețea făcută de către utilizator, este multiplexat printr-un apel de sistem pentru kernel-ul. Se sfarseste ca o provocare pentru sys_socketcall ./net/socket.c, care este apoi de-multiplexuri ținta de apel. O altă vedere al interfeței sistemului de apel - folosind operațiunile normale de fișier pentru intrare / ieșire de rețea (I / O). De exemplu, operațiile tipice de citire și scriere pot fi efectuate la priza de rețea (care este reprezentat de un descriptor de fișier ca imagine normală). Deci, în timp ce există operațiuni care sunt specifice pentru rețea (crearea unui soclu prin apelarea la priza. Legându-l să se ocupe de o conectare de apel, și așa mai departe), există și o serie de operațiuni de fișier standard, care sunt aplicate entităților de rețea, ca fișiere obișnuite. În cele din urmă, interfața sistemului de apel oferă mijloacele de a transfera controlul între spațiul utilizator și kernel-ul.

interfață protocol independent (protocol interfață Agnostic)

Sockets strat este un (protocol agnostic) interfață protocol independent, care oferă un set de caracteristici standard pentru a sprijini o serie de protocoale diferite. Acest strat nu numai că suportă TCP convenționale - și UDP-protocoale, dar, de asemenea, IP, Ethernet prime și alte protocoale de transport, cum ar fi fluxuri de date Transmission Control Protocol (SCTP - Stream Transmission Control Protocol).

Reacția are loc prin stiva de rețea printr-o priză. Structura de soclu în Linux - struct ciorap. definite în Linux / include / net / sock.h. Această structură mare conține toate starea necesară a unui singur socket, inclusiv un protocol specific utilizat de soclu, iar operațiile care pot fi efectuate pe ea.

Subsistemul de rețea este conștient de protocoalele disponibile dintr-o structură specială, care definește capacitățile sale. Fiecare protocol conține o structură numită proto (este în linux / include / net / sock.h). Această structură definește un soclu operații separate, care pot fi realizate din stratul prize la stratul de transport (cum ar fi creați soclu, conectați atât priza ca priza este închisă, etc.).

protocoale de rețea

Secțiunea definește anumite protocoale de rețea protocoale de rețea disponibile (cum ar fi TCP, UDP, și așa mai departe). Ele sunt inițializate la începutul zilei în funcția inet_init în Linux / net / ipv4 / af_inet.c (deoarece TCP și UDP sunt o familie de protocol inet). Funcția inet_init înregistrează fiecare dintre protocoalele încorporate folosind funcția proto_register. Această funcție este definită în linux / net / core / sock.c, și, în plus față de adăugarea la lista protocolul existent, dacă este necesar, se pot aloca unul sau mai multe dale-cache-uri.

Puteți vedea modul în care protocoalele individuale se identifică prin intermediul structurii Proto în fișiere tcp_ipv4.c, udp.c și raw.c, în Linux / net / ipv4 /. Fiecare dintre aceste structuri de protocol sunt mapate în funcție de tipul de protocol și în inetsw_array. care atribuie protocoale încorporate operațiunilor lor. Structura Inetsw_array și conexiunea sa sunt prezentate în Figura 3. Fiecare dintre protocoalele din această matrice este inițializată la începutul zilei în inet_register_protosw provocare inetsw a inet_init. Funcția inet_init inițializează, de asemenea, diverse module inet. cum ar fi ARP, ICMP, IP-module și TCP-și UDP-in-uri.

Figura 3. Internet-protocol Structura matrice

Corelarea soclu și protocolul

Notă în figura 3 că structura proto definește metodele de transport ale soclului, în timp ce structura proto_ops - general. Protocoale adiționale pot fi adăugate la comutatorul de protocol inetsw folosind inet_register_protosw apel. De exemplu, SCTP se adaugă la provocare sctp_init în Linux / net / SCTP / protocol.c. Pentru mai multe informații despre SCTP pot fi găsite în secțiunea Resurse.

Mutarea datelor pentru prize are loc prin intermediul structurii de bază tamponul numit soclu (sk_buff). În sk_buff conține date sub formă de pachete de date și de stat, care se întind pe mai multe niveluri ale stivei de protocol. Fiecare pachet trimis sau primit reprezentat sk_buff. Structura sk_buff este definită în linux / include / linux / skbuff.h și este prezentat în figura 4.

Figura 4. tampon Socket și relația sa cu alte structuri

După cum puteți vedea, mai multe structuri sk_buff pentru această conexiune pot fi legate împreună. Fiecare dintre ele identifică structura unui aparat (net_device), un pachet este trimis sau de la care a primit. Pe măsură ce fiecare pachet este prezentat în sk_buff. antetele de pachete sunt situate convenabil printr-un set de indicatori (mii. IPH, și Mac pentru Media Access Control (antet Media Access Control sau MAC). Deoarece sk_buff sunt centrale la informațiile socket pentru managementul a fost creat de către un număr de funcții de sprijin. Există funcții pentru crearea, distrugere, clonarea și secvențierea sk_buff.

Tampoane prize sunt proiectate să comunice unul cu celălalt pentru o anumită priză și să includă o cantitate mare de informații, inclusiv referiri la anteturi de protocol, marcajele de timp (atunci când pachetul a fost trimis sau primit) și dispozitivul corespunzător.

Interfața independentă de dispozitiv (dispozitiv de interfață Agnostic)

Sub stratul de protocoale este un alt strat de interfață agnostic care se conectează protocoale la o varietate de drivere de dispozitiv hardware cu capacități diferite. Acest nivel oferă un set standard de funcții care au folosit drivere de dispozitiv de rețea de nivel scăzut pentru a fi capabil de a interacționa cu un nivel înalt de protocol stivă.

Mai întâi de toate, driverele de dispozitiv se pot înregistra și se anula înregistrarea cu kernel-ul prin apelarea register_netdevice sau unregister_netdevice. Apelantul umple mai întâi net_device structura. și apoi transmite-l să se înregistreze. Nucleul solicită init funcția (dacă există), efectuează o serie de teste de corectitudine, creează o intrare sysfs, și apoi adaugă un nou dispozitiv la lista de dispozitive (o listă de dispozitive conectate, care sunt active în kernel-ul). Structura Net_device pot fi găsite în linux / include / linux / netdevice.h. Unele funcții sunt în Linux / net / core / dev.c.

Pentru a trimite sk_buff de la dispozitivul de protocol dev_queue_xmit funcție este utilizat. Se pune în sk_buff coadă pentru eventuala transmitere de către driverul de dispozitiv (dispozitiv definit prin intermediul unui pointer sau net_device sk_buff-> dev în sk_buff). Structura Dev conține o metodă numită hard_start_xmit. care deține funcția de conducător auto pentru inițierea sk_buff de transmisie.

Pachetul Primirea în mod tradițional realizată folosind netif_rx. Când driverul de dispozitiv de nivel inferior primește un pachet (conținut în sk_buff selectat), sk_buff este deasupra stratului de rețea, folosind netif_rx apel. Această caracteristică sk_buff pune apoi la rândul său, la un protocol de nivel superior pentru prelucrare ulterioară prin mijloace netif_rx_schedule. Funcții dev_queue_xmit și netif_rx sunt în Linux / net / core / dev.c.

În cele din urmă, a fost introdusă o nouă interfață de program de aplicație (NAPI) pentru interacțiunea cu stratul agnostic dispozitiv (dev) în nucleu. Acesta este folosit de unii șoferi, dar marea majoritate încă folosesc interfața de recepție cadru mai vechi (pentru o estimare aproximativă a șase din cele șapte). NAPI poate produce o mai bună performanță sub sarcini grele, evitând întreruperile pentru fiecare cadru de intrare.

drivere de dispozitiv

În partea de jos a stivei de rețea sunt driverele de dispozitiv care gestionează dispozitivele de rețea fizice. Exemple de acest nivel includ dispozitive de driver-ul alunecând șofer serial sau Ethernet prin dispozitiv Ethernet.

În timpul inițializării, driver-ul de dispozitiv alocă spațiu pentru structura net_device. și apoi inițializează cu rutine necesare. Unul dintre ei, numit dev-> hard_start_xmit. determină nivelul superior ar trebui să fie pus în aplicare pentru sk_buff de transfer. Ea a transferat sk_buff. Această funcție depinde de echipament, dar este, de obicei, un pachet descris în sk_buff. este mutat în așa-numitul „inel hardware“ (inel hardware) sau „coadă“ (coadă). Cadru primire, așa cum este descris în stratul agnostic dispozitiv, folosește interfața netif_rx sau netif_receive_skb pentru un driver de rețea NAPI compatibil. conducător auto NAPI pune constrângeri asupra capacității de hardware-ul de bază. Pentru detalii, a se vedea secțiunea Resurse.

După ce driverul de dispozitiv pentru a configura structura lor interfețe dev. register_netdevice apel face disponibil pentru utilizare. În Linux / drivere / net, puteți găsi drivere specifice dispozitivelor de rețea.

continuați

Linux codul sursă - o modalitate foarte bună de a învăța despre proiectarea de drivere pentru o varietate de tipuri de dispozitive, inclusiv drivere de dispozitiv de rețea. Veți găsi diferențe în proiectarea și utilizarea API kernel-ului sunt disponibile, dar fiecare va fi util pentru instruire sau ca punct de plecare pentru un nou șofer. Restul codului din stiva de rețea este standard și este utilizat până când aveți nevoie de un nou protocol. Dar chiar și atunci, punerea în aplicare a TCP (pentru protocolul streaming) sau UDP (mesagerie pe bază de protocol) servi drept modele utile pentru începutul unei noi de dezvoltare.

Obțineți produse și tehnologii

  • Dvs. proiect de dezvoltare viitoare pe Linux cu software-ul de încercare IBM a crea software-ul. disponibil pentru descărcare direct de la developerWorks. (RO)

articole similare