Tcp Socat-无缓冲
我使用带有OpenWRT的TP链路路由器TL-WR710N作为IPv4到IPv6转换器/网关,并使用以下socat命令:Tcp Socat-无缓冲,tcp,routing,ip,openwrt,socat,Tcp,Routing,Ip,Openwrt,Socat,我使用带有OpenWRT的TP链路路由器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(T
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应用程序缓冲区不是唯一的缓冲区,还有路由器缓冲区。有人有办法解决这个问题吗
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. .....
我还对(重新)传输暂停小于1s且不会增加的解决方案感兴趣。以下选项减少了缓冲区和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
您是否尝试了
rcvbuf
选项来设置TCP4-LISTEN
侧的最大窗口大小?