Socat - 버퍼링 없음

Socat - 버퍼링 없음

저는 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 측은 한 번에 1개의 이더넷 프레임만 처리할 수 있는 매우 작은 스택이 포함된 내장 장치입니다.

라우터는 최대 300,000개의 데이터를 버퍼링하여 프레임별로 임베디드 장치로 보냅니다. 때로는 라우터가 잘못된 순서로 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초 미만이고 증가하지 않는 솔루션에도 관심이 있습니다.

관련 정보