tcp_nodelay 예제

By agosto 2, 2019Sem categoria

Nagle의 알고리즘은 사용자 공간 응용 프로그램이 쓰기(2)를 위해 많은 작은 호출을 할 수 있다고 지적합니다. 커널이 이러한 모든 쓰기를 TCP 패킷으로 순진하게 번역하면 커널은 많은 작은 패킷을 보내게 됩니다. 예를 들어 통계 프로토콜을 고려하십시오. 이 프로토콜에서 통계는 통계 이름, 값 및 선택적으로 “형식”으로 전송됩니다. 이 프로토콜에서 전송되는 일반적인 통계는 매우 작습니다. 말, 50 바이트. 따라서 10개의 통계를 보내려는 응용 프로그램은 각 50바이트를 전송하는 10번의 호출(2)을 발행할 수 있습니다. 데이터를 작성하는 send_stat() 함수가 있도록 라이브러리를 구성한 다음 해당 함수를 10번 호출하는 방법을 쉽게 상상할 수 있습니다. Nagle의 알고리즘은 처리되지 않은 데이터가 전송되고 커널의 쓰기 버퍼가 MTU보다 작은 경우 응용 프로그램이 더 많은 데이터를 쓰는지 확인하기 위해 잠시 기다립니다. 쓰기 버퍼가 MTU 크기에 도달하면 데이터가 전송됩니다.

비행 중 데이터가 처리되면 MTU보다 작더라도 데이터가 전송됩니다. 방금 제공한 예제에서는 커널이 단일 500바이트 패킷으로 전송된 통계를 자동으로 합산한다는 의미입니다. 당신이 볼 수 있듯이, 이것은 정말 좋은 일, 그리고 일반적으로 뭔가 비활성화 하려는. 특히 많은 데이터를 전송하지 않는 경우 대기 시간이 매우 중요한 응용 프로그램은 TCP_NODELAY를 안전하게 사용할 수 있습니다. 여기에 좋은 예는 SSH 세션이 될 것입니다. SSH 세션에서는 사용자가 원격 서버에 입력을 입력하는 것이 일반적이며 사용자는 네트워크의 대역폭 용량에 비해 느린 속도로 입력하는 것이 일반적입니다. Nagle의 알고리즘이 켜지면 키 입력이 자주 지연됩니다. 이렇게 하면 많은 응용 프로그램을 사용하기 어렵게 만들 수 있습니다. Ruby 예제에서 Net::HTTP 모듈에서 단일 쓰기(2) 또는 writev(2) 호출을 실행한 경우 POST 요청은 TCP_NODELAY를 사용할 필요가 없는 단일 패킷에 적합할 수 있습니다. 이런 일이 발생하더라도 POST 본문이 충분히 커서 요청이 분할될 수 있습니다.

그러나 이것은 대부분의 웹 응용 프로그램에 대 한 너무 일반적인 해서는 안. 일반적으로 패킷이 분할되기 전에 페이로드의 적어도 1400 바이트를 맞출 수 있다는 것이 좋습니다. 예: 지연된 ACK는 할 수 있는 경우 세그먼트당 더 많은 데이터를 보내려고 시도합니다. 그러나 Nagle 알고리즘의 일부는 데이터를 전송하는 ACK에 따라 달라집니다. Nagle의 알고리즘과 지연 된 ACK가 함께 문제를 만들 수 있기 때문에 지연 된 ACK는 Nagle의 ACK를 받기 위해 주위를 기다리고 있는 동안 ACK를 보내기 위해 기다리고 있습니다! 이렇게 하면 즉시 전송되어 수신 측 스택 및 그 위에 있는 앱으로 배달될 수 있는 세그먼트에 200-500ms의 임의의 포장 마차가 생성됩니다. 제작자 John Nagle의 이름을 따서 명명된 Nagle의 알고리즘은 네트워크를 통해 전송되는 작은 패킷의 수를 줄여 TCP 효율성을 향상시키는 하나의 메커니즘입니다. 목표는 응용 프로그램이 소켓에 데이터를 다소 느리게 전달하는 경우 노드가 많은 작은 패킷을 전송하지 못하도록 하는 것이었습니다. 프로세스로 인해 많은 작은 패킷이 전송되는 경우 과도한 네트워크 정체가 발생할 수 있습니다.