9 votes

Comment envoyer des paquets de plus de 1500 octets par pcap_sendpacket ?

En fait, j'ai deux questions connexes.

Je capture le trafic réseau filtré par libpcap sur Debian. J'ai ensuite besoin de rejouer ce trafic sur un serveur Win2k3. Parfois, je capture des paquets, TCP et UDP, beaucoup plus grands que 1500 octets (taille MTU par défaut pour Ethernet). Par exemple, 2000+ octets. Je n'ai pas fait de changements spécifiques à la taille MTU sur ce Linux. Donc, question n°1 :

Quelle est la raison de ces paquets beaucoup plus grands que le MTU par défaut ? Cadres Jumbo ? Cet article de Wikipedia indique que "les cartes d'interface réseau capables de trames jumbo nécessitent une configuration explicite pour utiliser les trames jumbo", mais je ne suis pas au courant d'une telle configuration. Voir aussi ifconfig m'indique "MTU:1500". Cela peut-il être lié d'une manière ou d'une autre à la technique de "combinaison d'interruptions" (ou "coalescence d'interruptions", comme dans la version anglaise) ? cet article ) ? Puis-je supprimer ces paquets ?

Alors, question n°2 :

Comment puis-je envoyer de tels paquets en pcap_sendpacket sur Windows ? Je reçois le message d'erreur "send error : PacketSendPacket failed" uniquement pour les paquets de plus de 1500 octets. Il semble que je ne puisse pas utiliser de trames jumbo car j'envoie des données à un "net tap" personnalisé directement connecté comme une carte pci et je ne suis pas sûr de pouvoir configurer sa NIC. Quoi d'autre ? Devrais-je fragmenter ces paquets selon les règles du protocole ?

EDIT :

J'ai vérifié la fragmentation par la NIC comme Guy Harris l'a suggéré :

~# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: off
large-receive-offload: off
ntuple-filters: off
receive-hashing: off

Il en va de même pour eth1 y br0 - pont de réseau entre eth0 y eth1 que je suis en train de renifler.

Et je reçois toujours de gros paquets UDP.

7voto

Votre carte réseau effectue probablement le délestage de la segmentation/désgmentation TCP et de la fragmentation/réassemblage IP :

  • Les paquets UDP envoyés par votre machine, dont la taille est supérieure à celle d'une seule trame Ethernet, sont transmis à la carte réseau sans être fragmentés, la carte réseau se chargeant de la fragmentation, et ces paquets sont également transmis à libpcap avant d'être fragmentés ;
  • Les fragments UDP reçus par votre carte réseau, dont la taille est supérieure à celle d'une seule trame Ethernet, sont réassemblés par la carte réseau avant d'être transmis à l'hôte, et sont transmis à libpcap après avoir été réassemblés ;
  • les morceaux de données du flux TCP envoyés par votre machine qui sont trop gros pour tenir dans une seule trame Ethernet sont transmis à l'adaptateur réseau, qui les découpe en segments TCP plus petits, et le morceau complet est transmis à libpcap ;
  • Les segments TCP reçus par votre carte réseau sont réassemblés en plus gros morceaux de données TCP et les morceaux sont transmis à l'hôte puis à libpcap ;

Donc, ce que libpcap voit, c'est no paquets Ethernet et sont no limitée à la taille de la trame Ethernet.

(C'est-à-dire que Nikolai Fetissov avait probablement raison ; ce que vous recevez peut être ressembler à Les trames Ethernet, mais c'est parce que la carte réseau et le pilote leur donnent cette apparence. En fait, ce ne sont pas des trames Ethernet transmises sur ou reçues de l'Ethernet).

Vous ne pouvez les supprimer qu'en désactivant toute forme de segmentation/désegmentation/fragmentation/réassemblage effectuée sur votre carte réseau à l'aide de la commande ethtool Désactivez les options telles que TCP Segmentation Offload, UDP Fragmentation Offload, General Segmentation Offload, Large Receive Offload et Generic Receive Offload.

Une fois que vous avez désactivé ces options, vous ne devriez plus avoir ces gros paquets, et vous devriez donc pouvoir les rejouer sans problème. Il y a est pas de moyen facile de rejouer les paquets réassemblés/non fragmentés ou segmentés que vous avez capturés jusqu'à présent - vous devriez écrire votre propre code pour les fragmenter, et il n'y a aucune garantie qu'ils seront re-fragmentés/re-segmentés de la même manière qu'ils ont été fragmentés/segmentés à l'origine sur le fil.

4voto

¿Est-ce que vous utilisez le wireshark pour capturer ?

C'est important car par défaut, Wireshark réassemble les datagrammes fragmentés (et les stocke dans un fichier pcap comme des paquets uniques réassemblés sans fragmentation). A désactiver :

Editer->préférences->Protocoles->ipV4-> et décocher "Réassembler les datagrammes IPv4 fragmentés".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X