gpt4 book ai didi

tcp - Socat - 无缓冲

转载 作者:可可西里 更新时间:2023-11-01 02:40:35 25 4
gpt4 key购买 nike

我使用带有 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 端是一个堆栈非常小的嵌入式设备,一次只能处理一个以太网帧。

路由器缓存最多 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)
...

在具有大接收缓冲区的系统中,这不是问题,因为它可以重新排序接收到的包。但在我的小型嵌入式设备中,重新排序是不可能的。 (重新)传输暂停时间越来越长,直到嵌入式设备超时。

为了解决这个问题,我尝试在 ipv6 端将路由器的 socat-buffer 减少到一个数据包的大小,因此它必须在发送新数据包之前接收一个新数据包。但是这种方法没有用,因为 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 秒且不会增加的解决方案感兴趣。

最佳答案

以下选项减少了缓冲区和 paketsize,它对我有用

echo "net.ipv4.tcp_wmem= 700 700 700"$'\n'"net.ipv4.tcp_rmem= 700 700 700" >> /etc/sysctl.conf

或每个编辑:

net.ipv4.tcp_wmem= 700 700 700
net.ipv4.tcp_rmem= 700 700 700

关于tcp - Socat - 无缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43684185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com