私はOpenWRTを含むTP-LinkルーターTL-WR710NをIPv4-IPv6コンバーター/ゲートウェイとして使用しており、次のsocatコマンドを使用しています。
socat TCP4-LISTEN:80,fork,su=nobody TCP6:[xx:xx:xx::xx]:80
IPv4側は、TCPを介して大量のデータ(300kBなど)を送信するPCです。 IPv6側は、一度に1つのイーサネットフレームしか処理できない非常に小さなスタックを含む組み込みデバイスです。
ルータは最大300,000のデータをバッファリングし、フレームごとに組み込みデバイスに送信します。時には、ルータが間違った順序でTCPパケットを送信することがあります。たとえば、次のようになります。
Sender(TP-Link router) Receiver(embedded sys)
packet 1 Ack 1
packet 3 Ack 1
packet 2 Ack 2
packet 4 Ack 2
transmission pause (400ms)
packet 3 Ack 3
packet 5 Ack 3
packet 4 Ack 4
packet 6 Ack 4
transmission pause (1,2s)
packet 5 Ack 5
packet 7 Ack 5
packet 6 Ack 6
packet 8 Ack 6
transmission pause (5s)
...
より大きな受信バッファを持つシステムでは、受信したパケットを並べ替えることができるため、これは問題ではありません。しかし、私の小さな組み込みデバイスでは、並べ替えは不可能です。 (再)転送の一時停止は、内蔵デバイスがタイムアウトするまでますます長くなります。
この問題を解決するには、ルータのsocatバッファをipv6側で1つのパケットサイズに縮小し、新しいパケットを送信する前に受信する必要があります。ただし、この方法は機能しません。なぜなら socat-application-buffer が唯一のバッファではなく、router-buffer もあるからです。誰でもこれを管理するアイデアはありますか?
actual state:
1. [ PC (300kB) ] ------ [ Router ] ------ [ Embedded-device ]
2. [ PC ] ------ [ (300kB) Router ] ------ [ Embedded-device ]
3. [ PC ] ------ [ Router (299kB) ] ------ [ (1kB) Embedded-device ]
4. [ PC ] ------ [ Router (298kB) ] ------ [ (2kB) Embedded-device ]
5. .....
should state:
1. [ PC (300kB) ] ------ [ Router ] ------ [ Embedded-device ]
2. [ PC (299kB) ] ------ [ Router ] ------ [ (1kB) Embedded-device ]
3. [ PC (298kB) ] ------ [ Router ] ------ [ (2kB) Embedded-device ]
4. [ PC (297kB) ] ------ [ Router ] ------ [ (3kB) Embedded-device ]
5. .....
また、(再)転送の一時停止が1秒未満で増加しないソリューションにも興味があります。