2016-11-22 9 views
0

Ich arbeite an einer Server/Client-Socket-Anwendung, die Linux TUN-Schnittstelle verwendet.TCP-Prüfsummenfehler für fragmentierte Pakete

Der Server ruft Pakete direkt von der TUN-Schnittstelle ab und übergibt sie an Clients und Clients, die empfangene Pakete direkt in die TUN-Schnittstelle eingeben.

Manchmal müssen die Pakete von Server_TUN in der IP-Ebene fragmentiert werden, bevor sie an einen Client übertragen werden.

Also auf dem Server lese ich ein Paket von TUN, starten Sie fragmentieren es in der IP-Schicht und senden sie über Socket an Clients.

Als die Fragmentierungslogik implementiert wurde, funktionierte die Lösung nicht gut.

Nach dem Starten Wireshark auf Client_TUN bemerkte ich für alle eingehenden fragmentierten Pakete ich TCP Checksum Fehler.

wireshark capture

Bei der gegebenen Screenshot wird Rahmennummer 154 nach 155 wieder zusammengebaut in werden

Aber TCP-Prüfsumme behauptet falsch zu sein!

Auf Server-Seite, ich tcp Daten intakt und für das angegebene Beispiel, während Sie in Wireshark umgekehrt sehen, habe ich ein Paket mit 1452 Bytes (einschließlich IP-Header) und 30 Bytes (einschließlich IP-Header)

aufgeteilt

Ich habe auch den TCP-Prüfsummenwert auf dem Server überprüft und es ist genau 0x935e und während ich dachte, dass Checksum Offloading Angelegenheiten für eingehende Pakete ist, habe ich auf dem Client Offloading aktiviert und es war aus.

$ sudo ethtool -k tun0 | grep ": on" 
scatter-gather: on 
tx-scatter-gather: on 
tx-scatter-gather-fraglist: on 
generic-segmentation-offload: on 
generic-receive-offload: on 
tx-vlan-offload: on 
tx-vlan-stag-hw-insert: on 

Trotz, dass wegen der Lösung jetzt nicht funktioniert, ich seine durch Offload-Effekt verursacht nicht denken.

Haben Sie eine Idee, warum die TCP-Prüfsumme für fragmentierte Pakete falsch sein könnte?

Antwort

0

Hoffentlich fand ich das Problem. Es war mein Fehler. Einige TCP-Daten fehlten, als ich Puffer puffern konnte. Ich verfolgte die Indizes und Längen, aber wegen der Änderungen in den Daten, berechnete Prüfsumme Wert auf der Client-Seite.

Verwandte Themen