소켓에 여러 번 빠르게 연속해서 쓰는 경우(POSIX 함수 사용 write
) 일반적으로 내가 쓰는 모든 데이터는 단일 TCP 패킷으로 전송됩니다. 글을 너무 많이 쓰지 않는 한, 글을 쓰는 사이에 너무 오래 기다리지 않는 한.
커널은 내가 소켓에 쓰는 데이터를 버퍼링하고 주기적으로 패킷을 보내나요? 아니면 libc가 이것을 처리합니까? 커널은 패킷을 보내기 전에 얼마나 오래 기다리나요? 거의 빈 패킷이 즉시 전송되도록 요청할 수 있나요? UDP 또는 다른 프로토콜이 다르게 처리됩니까?
이 모든 것이 어떻게 작동하는지 알고 싶지만 해당 주제에 대한 정보를 찾는 데 어려움을 겪고 있습니다.
답변1
운영 체제는 보내기 전에 단기 버퍼링을 수행할 수 있습니다. 예를 들어, Linux 매뉴얼 페이지tcp(7)
TCP_NODELAY
이 옵션을 비활성화하는 옵션에 대해 언급합니다 (참조:setsockopt(2)
):
TCP_NODELAY
설정된 경우 Nagle 알고리즘을 비활성화합니다. 이는 데이터 양이 적더라도 데이터 세그먼트가 항상 가능한 한 빨리 전송된다는 것을 의미합니다. 설정하지 않으면 충분한 양이 전송될 때까지 데이터가 버퍼링되므로 작은 데이터 패킷의 빈번한 전송을 방지하여 네트워크 활용도가 낮아집니다. 이 옵션은 에 의해 재정의됩니다 . 그러나 이 옵션을 설정하면 현재 설정되어TCP_CORK
있어도 보류 중인 출력이 명시적으로 플러시됩니다 .TCP_CORK
Nagel의 알고리즘실제 버퍼링 알고리즘입니다. 탐색경로를 올바르게 따르면RFC 1122현재 유효한 정의인 것 같습니다.
이것은 libc가 아니라 커널입니다. C 라이브러리는 stdio 스트림( FILE *
)을 버퍼링하지만 커널로 write()
직접 이동합니다.send()
UDP에서는 데이터그램의 크기가 매우 중요하고 상위 계층에 표시되므로 유사한 손상이 불가능합니다.