Я использую маршрутизатор 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 с и не будет увеличиваться.
rcvbuf
, чтобы установить максимальный размер окна на сторонеTCP4-LISTEN
? - person vlp   schedule 10.05.2017