Linux에서 TCP 소켓의 조건부 플러시

Linux에서 TCP 소켓의 조건부 플러시

TCP 소켓에 데이터를 쓸 때마다 충분한 데이터(예: 64k(최대 패킷 크기))가 채워질 때까지 기다린 다음 데이터를 회선으로 보냅니다. 이렇게 하면 상대방의 정확한 시간에 데이터가 누락됩니다.

TCP_NODELAY를 설정하면 소켓에 기록된 모든 데이터가 즉시 회선으로 전송됩니다. ACK가 포함된 작은 패킷이 많기 때문에 대역폭이 줄어듭니다.

조건부로 소켓을 지우도록 Linux에 대한 규칙을 설정할 수 있습니까? 전임자:

if time gap between last sent packet and current data is greater than 100ms send immediately no matter how much data lendth is
else if current data length is bigger than 50kb send immediately no matter how much time gap is
else do nothing, wait some milliseconds for next decision

나는 TCP 버퍼 크기를 줄이고 싶지 않으며 Linux가 데이터를 플러시하는 방식을 수정하고 싶습니다.

Linux 구성 파일을 수정하여 이를 수행할 수 있습니까? 아니면 작성된 모든 소프트웨어에 이를 구현해야 합니까?

직접적인 답변, 도움말, 솔루션 또는 기사 링크에 감사드립니다.

답변1

그렇지 않고 현재 데이터 길이가 50kb보다 큰 경우 시간 간격에 관계없이 즉시 전송됩니다.

어쨌든 이런 일이 발생합니다. Nagle 알고리즘의 전송 버퍼 창은 기본 패킷(예: MTU)보다 크지 않습니다. 이는 이점이 없으며 모든 실제 응용 프로그램에서 이러한 버퍼 창은 9kB보다 크지 않습니다. 그래서 나는 당신의 문제가 당신이 생각하는 것과 다르다고 생각합니다.

마지막으로 보낸 데이터 패킷과 현재 데이터 사이의 시간 간격이 100ms를 초과하는 경우 데이터 길이에 관계없이 즉시 전송됩니다.

명시적으로 사용하지 않는 한 이런 일이 발생하며 TCP_CORK심지어 지연 시간은 200ms로 제한됩니다.

다시 한번 나는 당신이 겪고 있는 문제가 당신이 상상하는 것과 완전히 다르다는 느낌을 받았습니다.

그렇지 않으면 아무것도 하지 않고 다음 결정을 내릴 때까지 몇 밀리초 정도 기다리십시오.

문제에 대한 올바른 "결정"을 내리려면 데이터 흐름 요구 사항에 대한 애플리케이션 수준의 지식이 필요합니다. 따라서 실제로 가장 간단하고 특히 오버헤드가 낮은 솔루션은 그에 따라 프로토콜을 설계하고 애플리케이션 전에 작은 Accumulate 데이터그램을 전송한 다음 새로 고치는 것입니다. (또는 사용 TCP_NODELAY) 수동으로. 또한 설정 및 설정 해제를 자세히 살펴보고 TCP_CORKLinux 커널이 저장을 수행하도록 할 수도 있습니다.

이는 TCP를 포기하고 SCTP를 채택해야 함을 의미할 수 있으며, 극단적인 경우 자체 흐름 제어 논리로 UDP를 채택해야 함을 의미할 수 있습니다. 이는 초기 명령문에서 원하는 것처럼 보이는 것입니다.

이렇게 하면 상대방의 정확한 시간에 데이터가 누락됩니다.

TCP에 대한 잘못된 가정을 사용하여 네트워크 프로토콜을 잘못 설계한 것 같나요? TCP는 RX와 TX 사이의 패킷 순서를 보장하지 않으며 각 RX와 TX만 보장합니다.개별적으로, 데이터 순서가 보장됩니다.

관련 정보