development

언제 TCP_NODELAY를 사용해야하고 언제 TCP_CORK를 사용해야합니까?

big-blog 2020. 12. 8. 18:52
반응형

언제 TCP_NODELAY를 사용해야하고 언제 TCP_CORK를 사용해야합니까?


둘 다 Nagle의 알고리즘을 비활성화한다는 것을 이해했습니다.

각각을 언제 사용하거나 사용하지 않아야합니까?


우선 둘 다 Nagle의 알고리즘을 비활성화하지는 않습니다.

Nagle의 알고리즘은 유선에서 더 많은 수의 소규모 네트워크 패킷을 줄이는 것입니다. 알고리즘은 다음과 같습니다. 데이터가 제한 (일반적으로 MSS)보다 작 으면 이전에 보낸 패킷에 대한 ACK를받을 때까지 기다렸다가 그 동안 사용자로부터 데이터를 누적합니다. 그런 다음 축적 된 데이터를 보냅니다.

if [ data > MSS ]
    send(data)
else
    wait until ACK for previously sent data and accumulate data in send buffer (data)
    And after receiving the ACK send(data)

이것은 텔넷과 같은 응용 프로그램에서 도움이됩니다. 그러나 ACK를 기다리면 스트리밍 데이터를 보낼 때 대기 시간이 늘어날 수 있습니다. 또한 수신자가 '지연된 ACK 정책'을 구현하면 일시적인 교착 상태가 발생합니다. 이러한 경우 Nagle의 알고리즘을 비활성화하는 것이 더 나은 옵션입니다.

따라서 TCP_NODELAY는 Nagle의 알고리즘을 비활성화하는 데 사용됩니다.

TCP_CORK는 적극적으로 데이터를 축적합니다. 소켓에서 TCP_CORK가 활성화 된 경우 버퍼가 고정 된 한계까지 채워질 때까지 데이터를 보내지 않습니다. Nagle의 알고리즘과 유사하게 사용자로부터 데이터를 축적하지만 ACK를 수신 할 때까지 버퍼가 고정 된 한계까지 채워질 때까지입니다. 이것은 여러 데이터 블록을 보내는 동안 유용합니다. 그러나 TCP_CORK를 사용하는 동안 더 조심해야합니다.

2.6 커널까지는이 두 옵션 모두 상호 배타적입니다. 그러나 나중 커널에서는 둘 다 함께 존재할 수 있습니다. 이 경우 TCP_CORK가 더 선호됩니다.

참고 :


TCP_NODELAY

Nagle의 알고리즘을 비활성화하여 TCP / IP 네트워크를 개선하고 이전에 보낸 데이터에 대한 승인이 수신 될 때까지 기다렸다가 누적 된 패킷을 전송함으로써 패킷 수를 줄이는 데 사용됩니다.

// tcp (7) 매뉴얼에서 :

TCP_CORK(또는 TCP_NOPUSHFreeBSD에서)

설정된 경우 부분 프레임을 전송하지 마십시오. 옵션이 다시 지워지면 대기중인 모든 부분 프레임이 전송됩니다. 이는를 호출하기 전에 헤더를 앞에 추가 sendfile(2)하거나 처리량 최적화에 유용합니다 . 현재 구현 된대로 출력이에 의해 코르크되는 시간에 ** 200 밀리 초 상한 **이 TCP_CORK있습니다. 이 한도에 도달하면 대기중인 데이터가 자동으로 전송 됩니다. 이 옵션은 TCP_NODELAYLinux 2.5.71부터 만 결합 할 수 있습니다 . 이식 가능한 코드에서는이 옵션을 사용하면 안됩니다.


최적화이므로 다른 최적화와 마찬가지로 :

  1. 그것을 사용하지 마십시오
  2. 성능이 문제가 될 때까지 기다린 다음 소켓 대기 시간이 그 원인임을 확인하고 테스트 결과 이것이 확실히 해결 될 것이라는 것이 입증되었으며 이것이 가장 쉬운 해결 방법입니다.

기본적으로 목표는 sendfile () 및 그 친구들과 함께 단일 프레임을 사용할 수있는 여러 프레임을 보내는 것을 피하는 것입니다.

예를 들어, 웹 서버에서 헤더와 파일 내용을 전송하면 헤더가 메모리 내에서 어셈블되고 파일은 커널에서 직접 전송됩니다. TCP_CORK를 사용하면 TCP_NODELAY를 사용하더라도 헤더와 파일의 시작 부분을 단일 프레임으로 보낼 수 있습니다. 그렇지 않으면 첫 번째 청크가 즉시 전송됩니다.


TCP_CORK는 TCP_NODELAY의 반대입니다. 전자는 패킷 축적 지연을 강제합니다. 후자는 그것을 비활성화합니다.

참고 URL : https://stackoverflow.com/questions/3761276/when-should-i-use-tcp-nodelay-and-when-tcp-cork

반응형