![Socat - 버퍼링 없음](https://linux55.com/image/111033/Socat%20-%20%EB%B2%84%ED%8D%BC%EB%A7%81%20%EC%97%86%EC%9D%8C.png)
저는 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초 미만이고 증가하지 않는 솔루션에도 관심이 있습니다.