Contournement du kernel pour UDP et TCP sous Linux – en quoi consiste-t-il?

Selon http://www.solacesystems.com/blog/kernel-bypass-revving-up-linux-networking :

[…] un pilote réseau appelé OpenOnload qui utilise des techniques de «contournement du kernel» pour exécuter simultanément l’application et le pilote réseau dans l’espace utilisateur et, ainsi, contourner le kernel. Cela permet au côté application de la connexion de traiter beaucoup plus de messages par seconde avec une latence plus faible et plus cohérente.

[…]

Si vous êtes un développeur ou un architecte qui a lutté avec le changement de contexte pendant des années, contourner le kernel peut donner l’impression de sortingcher, mais heureusement, il respecte totalement les règles.

Quelles sont les fonctions nécessaires pour effectuer ce contournement du kernel?

Un moteur de déchargement TCP “fonctionnera simplement”, aucune programmation d’application spéciale n’est requirejse. Il ne contourne pas le kernel entier, il déplace simplement une partie de la stack TCP / IP du kernel vers la carte réseau, de sorte que le pilote est légèrement plus puissant. L’API du kernel est la même.

Le moteur de déchargement TCP est pris en charge par la plupart des interfaces gigabit modernes.

Alternativement, si vous voulez dire “exécuter du code sur le” Moteur d’application sur charge “de la carte réseau SolarFlare / processeur intégré”, alors … c’est spécifique à la carte. En principe, vous écrivez du code pour un système intégré, vous devez donc indiquer le type de carte que vous utilisez.

Bon, la question n’est donc pas simple de répondre sans savoir comment le kernel gère la stack réseau.

En général, la stack réseau est composée de nombreuses couches, la plus basse étant le matériel réel. Ce matériel est généralement pris en charge à l’aide de pilotes (un pour chaque interface réseau). Les interfaces réseau fournissent généralement des interfaces très simples, pensez-vous et envoyer des données brutes.

En plus de cette connexion physique, avec la possibilité de recevoir et d’envoyer des données se trouvent de nombreux protocoles, qui sont également superposés. Près du bottem se trouve le protocole IP, qui vous permet essentiellement de spécifier le destinataire de vos informations, tandis En haut, vous trouverez TCP qui supporte des connexions stables.

Donc, pour répondre à votre question, vous devez tout d’abord déterminer quelle partie de la stack réseau vous devez remplacer et ce que vous devez faire. D’après ce que j’ai compris de votre question, il semble que vous souhaitiez conserver la stack réseau d’origine, puis utiliser parfois la vôtre. Dans ce cas, vous devriez simplement mettre en œuvre le modèle de stratégie et permettre de définir les paquets qui devraient être utilisés. être manipulé par quel niveau de la stack de réseau.

En fonction de la manière dont la stack réseau est implémentée dans Linux, vous pourrez ou non y parvenir, sans modifications du kernel. Dans une architecture de micro-kernel, dans laquelle chaque partie de la stack réseau est implémentée dans son propre service, ce serait sortingvial, car vous dirigeriez simplement les parties inférieures de la stack réseau vers votre modèle de stratégie et que vous dirigeriez cette entrée vers les éléments requirejs. couches de niveau réseau.

Voulez-vous peut-être envoyer et recevoir des paquets IP bruts?

Fondamentalement, vous devrez renseigner les en-têtes et les données dans un ip-packet. Il y a quelques exemples ici sur la façon d’envoyer des paquets Ethernet bruts:: http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c- sur linux /

Pour gérer vous-même le protocole TCP / IP, je pense que vous devrez peut-être désactiver le pilote TCP dans un kernel personnalisé, puis écrire votre propre serveur d’espace utilisateur lisant une adresse IP brute.

Ce n’est probablement pas si efficace que ça …