Socat — без буферизации

Я использую маршрутизатор TP-Link TL-WR710N с OpenWRT в качестве транслятора/шлюза IPv4-IPv6 со следующей командой socat:

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

На стороне IPv4 находится ПК, который отправляет большой объем данных (например, 300 КБ) через TCP. На стороне Ipv6 находится встроенное устройство с очень маленьким стеком, которое может одновременно обрабатывать только 1 кадр Ethernet.

Маршрутизатор буферизует до 300 тыс. данных и отправляет их кадр за кадром на встроенное устройство. Иногда маршрутизатор отправляет 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 с и не будет увеличиваться.


person Chris    schedule 28.04.2017    source источник
comment
Вы пробовали параметр rcvbuf, чтобы установить максимальный размер окна на стороне TCP4-LISTEN?   -  person vlp    schedule 10.05.2017


Ответы (1)


Следующая опция уменьшила буфер и размер пакета, и это сработало для меня.

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
person Chris    schedule 20.06.2017