Chapitre 11
Vue d'ensemble sur
l'implementation du sous-systeme
reseau de Linux
Commenousl'avonsditdanslaprefae,nousn'allonspasnousinteresserdansetouvrageau
sous-systemereseaude Linuxdans sonintegralitemaisuniquemental'envoid'un datagramme
UDPetasareeptionparunordinateurd'extremite.
La struturation en ouhes devrait nous permettre d'etudier l'envoi et la reeption pour
haune desouhes.L'experienemontre queei n'est paspedagogique, aumoins pourl'im-
plementationLinux.
La logique voudrait qu'on s'interesse d'abord a l'envoi d'un datagramme UDP puis a sa
reeption.Enfaitl'experienemontrequ'ilvautmieux,toujourspourdesraisonspedagogiques,
leontraire.
11.1 Reeption de donnees via un datagramme UDP
Lorsqu'unutilisateurenvoiedesdonneesvialeprotooleUDP,elles-isontenapsuleesdans
un datagramme UDP, puis dans un paquet IP puis dans une trame. Nous supposerons que
l'ordinateurreepteurest relieaureseauparunearteEthernet.
11.1.1 Reeption de la trame Ethernet par la arte reseau
Latramevoyagesurlesupportphysiqueatraverslereseau.Ilyatroispossibilites:
{ elleseperdlorsdesesperegrinations;
{ ellearriveorrompuesurlaarteEthernetdudestinataire;
{ ellearrivedanssonintegritesurlaarteEthernetdudestinataire.
Nous n'avons vu que le protoole Ethernet exige qu'un minuteur soit delenhe lors de
l'emission d'une trame. Dans lepremier as, la mahine emettrie ne reevra pas d'ausede
reeption. Au bout d'un ertain delai, elle enverra a nouveau la trame (en iterant un ertain
nombredefois).
Dansleseondas,sieiestdetetegr^aeauCRC,laartereseaudelamahinereeptrie
eartelatrame.Lamahineemettrienereevradonpasd'ausedereeptionetonseretrou-
veradanslasituationdupremieras.
Dansleseondas,siein'estpasdeteteparleCRC,etdansletroisiemeas,leontr^oleur
de la arte reseau ompare l'adresse materielle du destinataire de la trame ave elle de la
artereseaude lamahine reeptriesurlaquelle estarriveelatrame.Si elles-ionordent,il
delenhe une interruption materielle pour annoner aumiroproesseur de l'ordinateurqu'un
paquet estdisponibledans lamemoiredelaartereseau.Illaisse lepilotedeette arteagira
saguise.
Si lesdeuxadressesneonordentpas,il yatroisasdanslesquelsleontr^oleurdelaarte
aquandm^emeunomportementanalogue: dansleasd'unetramedediusion generale,dans
elui d'unetrame de multidiusiondontl'adresse est aepteepar laarteet dans leas d'un
mode speial, dit mode de promisuite. Nous ne nous ouperons pas de es as dans et
ouvrage.
Lemodedepromisuite,ommesonnomlelaisseentendre,indiquealaartereseaud'aepter
touteslestramesquiparviennentaelles-i.Ceiestutilepourlesrenieurs,quianalysenttout
equipassesurlereseau,soitdansunbutavouabledeontr^ole,soitdansunbutd'espionnage.
Danslesautresas,latrameestrejeteeparleontr^oleur.
11.1.2 Reuperation du paquet par l'ordinateur
Nous venonsde voirque lorsqu'une trame arriveen bonetat sur la artereseau de l'ordi-
nateur qui luiest destine,le ontr^oleurde laartedelenheune interruption.Le gestionnaire
de ette interruption, qui est une partie du pilote de la arte reseau, alloue un emplaement
enmemoirevivepourepaquet,appeletampon de soket(voirhapitres12 et13), eetue
quelques veriations sur e paquet et, si elles sont onluantes, le plae dans e tampon de
soket,ainsi qu'unepartie de l'en-t^etede trame, omprenant lesadresses materielles soure et
dedestinationainsiqueletypedupaquet.Ilalloueegalementundesripteur de tampon de
soketontenantdesinformationssur elui-i(debut desonemplaement, sataille,sonheure
d'arrivee...).
Suivantletypedupaquet,legestionnairefaitappelaunefontiondetraitementdeelui-i,
ayantpourseulparametrel'adressedudesripteurdetampondesoket.Dansleasd'unpaquet
11.1.3 Traitement du paquet par la ouhe reseau
Dansleasd'unetramedestineeaIPv4,laouhereseautraitelepaquetgr^aealafontion
iprv(). Celle-i verie d'abord s'il s'agit d'un paquet entier ou d'un sous-paquet d^u a une
fragmentation.Dansedernieras,elleplaelesous-paquetdansuneled'attenteetdelenhe
unminuteuren attendantde reevoirtousles sous-paquets ontituantle paquet originel.Si le
delais'eoulesansquetouslessous-paquetssoientarrives,elledetruitlessous-paquetsarrivesse
trouvantdanslaled'attente etenvoieunmessageICMPalamahineemettriepourindiquer
derenvoyerlepaquet.Sinonellereassemblelessous-paquetspourobtenirlepaquet originelqui
sera plae dans un seul tampon de soket puis demultiplexie la ouhe de transport gr^ae au
hamponernantelle-i del'en-t^ete IP.Cei onsisteatransmettreledesripteurdetampon
desoketalafontionudprv()dansleasdeUDP.
11.1.4 Traitement du datagramme par la ouhe de transport
DansleasdeUDP,laouhedetransportexeuteuneveriationminimalepuistransmet
lemessageal'appliationonernee.
On ommene parverierlalongueurdu datagramme.Si elle-iest inferieureaelle d'un
en-t^ete UDP, on se ontente d'aÆher un message noyau et de detruire le tampon de soket.
Sinon,si la longueurdudatagrammeest superieure aelle indiquee dans l'en-t^ete UDP, on se
ontente egalementd'aÆherunmessagenoyauet dedetruireletampondesoket.Onalule
ensuitela somme deontr^ole dudatagramme. Si ellene onordepas ave elle speiee dans
l'en-t^ete UDP, on seontenteegalement d'aÆherunmessage noyauet de detruire le tampon
desoket.
Si touteslesveriationssontonluantes,onplaeletampondesoket(enfaitunnouveau
desripteur,elui de ouhede transport) dans lale d'attente dereeption des datagrammes
UDP.
11.1.5 Reuperation par l'utilisateur
L'utilisateur ree une soket de la faonvue auhapitre 6et lit, dans le as nononnete,
atraverselle-i gr^ae ala fontionrevfrom(). Celle-i fait appel ala fontionde reeption
speiquealafamilledeprotooles,asavoirsokommonrevmsg()dansleasdeIPv4.Cette
derniereseontentededemultiplexersuivantlaouhedetransport:ellefaitappelalafontion
udprevmsg()dansleasdeUDP.
Lafontionudprevmsg()essaiedereupereruntampondesoketdanslaled'attentede
reeptionUDP,enfaisantappelaskb revdatagram()etenattendantquelebontamponde
soketarrives'ilnes'ytrouvepasdeja.Onlitalorslenombredearateresvoulu,quel'onplae
dansl'espaeutilisateur.
11.2 Envoi de donnees via un datagramme UDP
11.2.1 Envoi par l'utilisateur
L'utilisateurreeunesoketdelafaonvueauhapitre6etenvoie,dansleasnononnete,
atraverselle-i gr^ae ala fontion sendto(). Celle-i ree un messagea partirdes donnees,
omprenantenpartiulierunen-t^etedemessage,puisfaitappelalafontionsoksendmsg(),
elle-m^eme faisant appel a la fontion soksendmsg(), qui fait appel a la fontion d'envoi
attribue unnumerodeport aumessagepuisdemultiplexie suivant laouhedetransport:elle
faitappelalafontionudpsendmsg()dansleas deUDP.
11.2.2 Traitement du datagramme par la ouhe de transport
Lafontion udpsendmsg()ommeneparonstituerle datagrammeUDP apartirdumes-
sage.Silatailledesdonneesestsuperieurea65535otets,elles-inepeuventpastenirdansun
datagramme;ons'arr^etedonpurementetsimplement.Ilenestdem^emesionessaied'envoyer
des donnees urgentes (gr^aea un positionnement des drapeaux), puisque ei n'est pas prevu
dansleasdeUDP.Onreuperel'adresseetlenumerodeportpourrenseignerl'en-t^eteUDP.On
essaied'initialiseruneentreedeahederoutage;onest s^urd'yparvenirsilatablederoutage
possedeuneadressepardefaut.Onfaitennappelalafontionudpflushpendingframes()
pouronstituer le datagramme UDPpuis a lafontion udppushpending frames() pour en-
voyerledatagrammealaouhereseau.Iln'yapasbeoindedemultiplexerdansesens,puisque
laouhereseauestneessairementIPv4.
11.2.3 Envoi des paquets ordinaires sous IPv4
Lapremierepartie onsistearouter lepaquetgr^aealafontioniprouteoutputflow(),
hargeedefournirune entreedeahederoutage.Onremarqueraquel'onadejaparledeette
ation dans la sous-setionpreedente; ei est d^u au fait que Linux ne tient pas ompte des
ouhesdefaon strite.L'entreedeahederoutagepreiseenpartiulierquelepaquetdevra
^
etretransmis,dansleasd'unpaquetordinaire,alafontionip output().
LaseondeetapeonsisteaonstituerlepaquetIP.Pourelaonessaiedereupererlepremier
desripteur de tampon de soket de la le d'attente en eriture du desripteur de ouhe de
transportpasseenargumentalafontionippush pendingframes().Onreupereensuitetous
lesdesripteurs de ettele d'attente et on lesplae dans lalistedes fragments. Onrenseigne
les hamps d'un nouvel en-t^ete IP puis on fait appel a la fontion ip output() determinee
preedemment.
Latroisiemeetapeonsisteatransfererlepaquetdelaouhereseaualaouheinferieure.
Pour ela, on fragmenteventuellement le paquet, on positionne le type dupaquet de la sous-
ouhe 2b a ETHP IP et on transmet ala fontion ip finishoutput2(), qui fait appel a la
fontiondevqueuexmit()d'envoid'unetrame.
11.2.4 Envoi de la trame
La fontiondevqueuexmit(),ouskbdesignele desripteurdetamponde soket,indique
alaartereseauqu'ilyadesdonneesaenvoyeret leuremplaementenmemoirevive.Laarte
s'oupedureste,utilisantl'aesdiret alamemoire(DMA)pourreupererlesdonnees.
A la
ndel'emission,laarteleveuneinterruptionpourprevenirlenoyauquelatrameaeteenvoyee
avesuesouqueledelais'esteoule.
Les donnees onsistent en un paquet de la ouhe reseau. La arte s'oupe d'enapsuler
elui-ipourobtenirunetrame.
11.3 Historique
Une implementationUUCP atournesousLinuxpresquedesledebut. L'implementationde
TCP/IP a ommene en 1992 lorsque Ross Biro et d'autres ont reee qui fut ensuite onnu
Ross Biro ne s'oupa plus du developpement de Linux a partir de mai 1993. Fred van
Kempen ommena alors a travailler sur une nouvelle implementation, qui sera onnue sous
ladenominationdeNet-2.Lapremiereversionpublique,Net-2d,apparutdanslenoyau0.99.10
del'ete1993.AlanCoxommenaas'interesserauprojet,onevantNet-2Debugged,puispassa
alaversionNet-3pourLinux1.2et Linux2.0.Lenoyau2.2utiliseNet-4.