{"id":322,"date":"2024-03-19T00:39:25","date_gmt":"2024-03-18T23:39:25","guid":{"rendered":"https:\/\/thurow.de\/?p=322"},"modified":"2024-04-03T09:30:23","modified_gmt":"2024-04-03T07:30:23","slug":"fehlersuche-in-datenstroemen-mittels-wireshark","status":"publish","type":"post","link":"https:\/\/thurow.de\/?p=322","title":{"rendered":"Fehlersuche in Datenstr\u00f6men mittels Wireshark"},"content":{"rendered":"\n<p>Datenstr\u00f6me sind wie Blutgef\u00e4\u00dfe in einem Organismus, ohne sie l\u00e4uft kein Softwaresystem. Und so ist klar, auch hier geh\u00f6rt die Fehlersuche zum Berufsalltag. Bei Bin\u00e4rstreams scheint das erst einmal nicht so einfach zu sein. An dieser Stelle mag ich sehr <a href=\"https:\/\/www.wireshark.org\" target=\"_blank\" rel=\"noreferrer noopener\">Wireshark<\/a>. Viele kennen das Tool zur Untersuchung von Datenstr\u00f6men im Netzwerkbetrieb oder \u00fcber USB. Wireshark ist ein Analysetool, welches auf <a href=\"https:\/\/de.wikipedia.org\/wiki\/Pcap\" target=\"_blank\" rel=\"noreferrer noopener\">pcap<\/a> aufsetzt. Der Ansatz von pcap ist jedoch so allgemeing\u00fcltig, dass man ihn l\u00e4ngst nicht nur mehr f\u00fcr Netzwerke nutzt. Daraus resultiert dann auch das einfache und vor allem universelle Libpcap File Format <a href=\"https:\/\/wiki.wireshark.org\/Development\/LibpcapFileFormat\" target=\"_blank\" rel=\"noreferrer noopener\">[1]<\/a>, welches zur Speicherung von Mitschnitten von pcap (packet capture) dient.<\/p>\n\n\n\n<p>Eine pcap Datei startet mit einem Global Header, danach folgen beliebig viele mitgeschnittene Bin\u00e4rpakete. Jedes Paket startet mit einem Packet Header, danach folgt das Bin\u00e4rpaket selbst, bezeichnet als Packet Data. Dies noch einmal zum besseren Verst\u00e4ndnis<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Global Header<\/li>\n\n\n\n<li>Packet Header (Paket 1)<\/li>\n\n\n\n<li>Packet Data (Paket 1)<\/li>\n\n\n\n<li>Packet Header (Paket 2)<\/li>\n\n\n\n<li>Packet Data (Paket 2)<\/li>\n\n\n\n<li>Packet Header (Paket 3)<\/li>\n\n\n\n<li>Packet Data (Paket 3)<\/li>\n\n\n\n<li>usw &#8230;<\/li>\n<\/ul>\n\n\n\n<p>Der Global Header ist wie folgt aufgebaut:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\ntypedef struct pcap_hdr_s {\n        guint32 magic_number;   \/* magic number *\/\n        guint16 version_major;  \/* major version number *\/\n        guint16 version_minor;  \/* minor version number *\/\n        gint32  thiszone;       \/* GMT to local correction *\/\n        guint32 sigfigs;        \/* accuracy of timestamps *\/\n        guint32 snaplen;        \/* max length of captured packets, in octets *\/\n        guint32 network;        \/* data link type *\/\n} pcap_hdr_t;\n<\/pre><\/div>\n\n\n<p>Die <code>magic_number<\/code> ist der bekannte Weg, einen Wechsel der Byte Order zwischen dem die Datei schreibenden und dem die Datei lesenden Ger\u00e4t zu erkennen. Beim Schreiben der Datei wird hier 0xa1b2c3d4 geschrieben. Liest nun die Auswertesoftware hier ebenfalls 0xa1b2c3d4, so stimmt die Byte Order \u00fcberein. Wird dagegen 0xd4c3b2a1 gelesen, so m\u00fcssen die folgenden Integer Werte geswappt werden. Bedeutet f\u00fcr uns in der Praxis, wir m\u00fcssen uns beim Schreiben der Datei keine Sorgen um die Byte Order machen. Das Feld <code>network<\/code> sollte, wenn nicht wirklich ein bereits vorhandener Link Type beim Mitschnitt verwendet wird, einen der Werte DLT_USER0 bis DLT_USER15 (Dezimalwerte 147 bis 162) f\u00fcr die private Nutzung erhalten. Das Feld <code>snaplen<\/code> enth\u00e4lt die maximal gespeicherte L\u00e4nge f\u00fcr Pakete. Dieses Feld ist vor allem dann wichtig, wenn Pakete nur gek\u00fcrzt gespeichert werden. F\u00fcr die restlichen Felder verweise ich wieder auf <a href=\"https:\/\/wiki.wireshark.org\/Development\/LibpcapFileFormat\" target=\"_blank\" rel=\"noreferrer noopener\">[1]<\/a>.<\/p>\n\n\n\n<p>Der Packet Header ist wie folgt aufgebaut:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\ntypedef struct pcaprec_hdr_s {\n        guint32 ts_sec;         \/* timestamp seconds *\/\n        guint32 ts_usec;        \/* timestamp microseconds *\/\n        guint32 incl_len;       \/* number of octets of packet saved in file *\/\n        guint32 orig_len;       \/* actual length of packet *\/\n} pcaprec_hdr_t;\n<\/pre><\/div>\n\n\n<p>Mit <code>ts_sec<\/code> und <code>ts_usec<\/code> treffen wir auf unseren alten Bekannten <code><a href=\"https:\/\/man7.org\/linux\/man-pages\/man3\/timeval.3type.html\" target=\"_blank\" rel=\"noreferrer noopener\">timeval<\/a><\/code> aus der C-Welt zur Angabe der Capture Time. Hier kann im einfachsten Fall <code><a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/gettimeofday.2.html\" target=\"_blank\" rel=\"noreferrer noopener\">gettimeofday()<\/a><\/code> genutzt werden. Die Felder <code>incl_len<\/code> und <code>orig_len<\/code> d\u00fcrften selbsterkl\u00e4rend sein. WICHTIG: was logischerweise nicht Bestandteil des Packet Headers ist, ist die Kennung des Senders des Paketes. Wir erinnern uns, pcap dient urspr\u00fcnglich dem Netzwerkmitschnitt, Sender und Empf\u00e4nger sind dort in den Paketen selbst angegeben. Implementieren wir bi- oder multidirektionale Mitschnitte, so m\u00fcssen wir uns selbst um die Sender- und Empf\u00e4ngerkennung im Paket k\u00fcmmern, im einfachsten Fall durch einen Header, den wir dem Paket voran setzen (nat\u00fcrlich in der L\u00e4nge ber\u00fccksichtigen!).<\/p>\n\n\n\n<p>Und das war es auch schon. Auf diese Weise kann man nun Mitschnitte erstellen, z.B. f\u00fcr UART, SPI oder was auch immer. Aber UART z.B. ist doch nicht paketorientiert? Richtig, aber genau das ist wieder etwas, was man ja in dem Fall eigentlich haben m\u00f6chte, das Wissen um das Timing des Datenstroms. Hei\u00dft, ich setze beim Lesen der UART meinen Empfangspuffer ausreichend gro\u00df und speichere als Paket alles, was ein read mir an Oktetts (Bytes) bei einem Aufruf zur\u00fcckgibt.<\/p>\n\n\n\n<p>Diese Methode macht sich nicht nur bei der Fehlersuche und Kontrolle in eigenen Protokollen n\u00fctzlich, sondern gerade auch in der Fehlersuche bei Protokollen von Sensoren und Komponenten von Zulieferern. Gerade hier trifft man leider sehr oft auf die bitteren Diskrepanzen zwischen Dokumentationen und Realit\u00e4t. Mitschnitte mit genauen Zeitstempeln sind hier nicht nur f\u00fcr die eigene Fehlersuche ein Segen, sondern auch zur Dokumentation und Argumentation gegen\u00fcber dem Zulieferer. Nicht selten muss man hier mit harten Bandagen gegen Mauern und Leugnen ank\u00e4mpfen, unleugbar \u00fcber Mitschnitte. \u00dcber pcap-Dateien hat man so eine gute M\u00f6glichkeit, diese auch f\u00fcr ihn direkt auswertbar zu \u00fcbermitteln. Wireshark ist f\u00fcr jeden verf\u00fcgbar &#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Datenstr\u00f6me sind wie Blutgef\u00e4\u00dfe in einem Organismus, ohne sie l\u00e4uft kein Softwaresystem. Und so ist klar, auch hier geh\u00f6rt die Fehlersuche zum [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,20,9,19],"tags":[],"class_list":["post-322","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-fehlersuche","category-programmierung","category-sniffing"],"_links":{"self":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=322"}],"version-history":[{"count":8,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/322\/revisions"}],"predecessor-version":[{"id":492,"href":"https:\/\/thurow.de\/index.php?rest_route=\/wp\/v2\/posts\/322\/revisions\/492"}],"wp:attachment":[{"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thurow.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}