0

Linux TUN インターフェイスを使用しているサーバー/クライアント ソケット アプリケーションに取り組んでいます。

サーバーは TUN インターフェイスから直接パケットを取得してクライアントに渡し、クライアントは受信したパケットを直接 TUN インターフェイスに入れます。

<Server_TUN---><---Server---><---Clients---><---Client_TUN--->

Server_TUN からのパケットは、クライアントに送信する前に IP レイヤーでフラグメント化する必要がある場合があります。

そのため、サーバーで TUN からパケットを読み取り、IP レイヤーでフラグメント化を開始し、ソケット経由でクライアントに送信します。

断片化ロジックが実装されたとき、ソリューションはうまく機能しませんでした。

Client_TUN で Wireshark を開始した後、フラグメント化されたすべての着信パケットで TCP チェックサム エラーが発生することに気付きました。

Wireshark キャプチャ

与えられたスクリーンショットでは、フレーム番号 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 チェックサムが正しくない理由を知っていますか?

4

1 に答える 1