Socat-无缓冲

Socat-无缓冲

我使用带有 OpenWRT 的 TP-Link 路由器 TL-WR710N 作为 IPv4 到 IPv6 转换器/网关,并使用以下 socat 命令:

socat TCP4-LISTEN:80,fork,su=nobody TCP6:[xx:xx:xx::xx]:80

IPv4端是一台PC,通过TCP发送大量数据(例如300kB)。 Ipv6 端是一个具有非常小的堆栈的嵌入式设备,一次只能处理 1 个以太网帧。

路由器缓冲多达 300k 的数据,并将其逐帧发送到嵌入式设备。有时路由器会以错误的顺序发送 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 端一个数据包的大小,因此它必须在发送新数据包之前接收新数据包。但这种方法不起作用,因为 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 秒并且不会增加。

相关内容