Linux TUN インターフェイスを使用しているサーバー/クライアント ソケット アプリケーションに取り組んでいます。
サーバーは TUN インターフェイスから直接パケットを取得してクライアントに渡し、クライアントは受信したパケットを直接 TUN インターフェイスに入れます。
<Server_TUN---><---Server---><---Clients---><---Client_TUN--->
Server_TUN からのパケットは、クライアントに送信する前に IP レイヤーでフラグメント化する必要がある場合があります。
そのため、サーバーで TUN からパケットを読み取り、IP レイヤーでフラグメント化を開始し、ソケット経由でクライアントに送信します。
断片化ロジックが実装されたとき、ソリューションはうまく機能しませんでした。
Client_TUN で Wireshark を開始した後、フラグメント化されたすべての着信パケットで TCP チェックサム エラーが発生することに気付きました。
与えられたスクリーンショットでは、フレーム番号 154 が 155 で再構築されると主張されています。
しかし、TCP チェックサムは正しくないと主張されています!
サーバー側では、tcp データをそのまま保持します。この例では、Wireshark で逆のことがわかりますが、1452 バイト (IP ヘッダーを含む) と 30 バイト (IP ヘッダーを含む) のパケットを分割しました。
また、サーバーで TCP チェックサム値を確認しましたが、正確には 0x935e であり、着信パケットのチェックサム オフロードが問題になるとは思いませんでしたが、クライアントでオフロードを確認したところ、オフでした。
$ 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
それにもかかわらず、解決策が現在機能していないため、オフロード効果が原因ではないと思います。
フラグメント化されたパケットの TCP チェックサムが正しくない理由を知っていますか?