首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Socat -无缓冲

Socat -无缓冲
EN

Stack Overflow用户
提问于 2017-04-28 23:47:43
回答 1查看 1.1K关注 0票数 2

我使用带有OpenWRT的TP-Link路由器TL-WR710N作为ipv4到ipv6的转换/网关,并使用以下套接字命令:

代码语言:javascript
复制
socat TCP4-LISTEN:80,fork,su=nobody TCP6:[xx:xx:xx::xx]:80

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

路由器缓存高达300k的数据,并将其逐帧发送到嵌入式设备。有时路由器会以错误的顺序发送TCP数据包,例如:

代码语言:javascript
复制
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 buffer减少到IPv6端的一个数据包的大小,这样它就必须接收一个新的数据包,否则它就可以发送一个新的数据包。但是这种方法不起作用,因为socat application- buffer不是唯一的缓冲区,还有路由器缓冲区。有没有人有办法管理这件事?

代码语言:javascript
复制
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秒并且不会增加的解决方案感兴趣。

EN

回答 1

Stack Overflow用户

发布于 2017-06-20 21:42:26

下面的选项减少了缓冲区和纸张大小,它对我很有效

代码语言:javascript
复制
echo "net.ipv4.tcp_wmem= 700 700 700"$'\n'"net.ipv4.tcp_rmem= 700 700 700" >> /etc/sysctl.conf

或每个编辑器:

代码语言:javascript
复制
net.ipv4.tcp_wmem= 700 700 700
net.ipv4.tcp_rmem= 700 700 700
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43684185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档