디자인 문제 - Winsock 함께 TCP 통한 작은 데이터 세그먼트 보내기

기술 자료 번역 기술 자료 번역
기술 자료: 214397 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

요약

Winsock 응용 프로그램의 디자인 TCP를 통한 작은 데이터 패킷을 보내야 할 때 특히 중요합니다. 지연된 승인, Nagle 알고리즘을 및 Winsock 버퍼링 상호 작용은 고려하지 않은 디자인 성능을 대폭 효과 수 있습니다. 이 문서에서는 몇 가지 사례 연구 사용하여 이러한 문제를 설명하고 일련의 작은 데이터 패킷을 Winsock 응용 프로그램에서 효율적으로 전송하기 위한 권장 사항 파생됩니다.

추가 정보

배경

Microsoft TCP 스택은 데이터 패킷을 받으면 200-ms 지연 타이머 이동합니다. ACK를 결국 보낼 때 지연 타이머를 설정하고 데이터 패킷을 받으면 다른 200-ms 지연 시작합니다. 인터넷 및 인트라넷 응용 프로그램의 효율성을 높이려면 Microsoft TCP 스택은 한 ACK 받은 데이터 패킷을 보낼 시기를 결정하는 데 다음 조건을 사용합니다.
  • 지연 타이머가 만료되기 전에 두 번째 데이터 패킷을 받으면 해당 ACK이 보내집니다.
  • 데이터를 두 번째 데이터 패킷을 받아서 지연 타이머가 만료되기 전에 동일한 방향을 따라 해당 ACK 전송될 수 있는 경우 해당 ACK 데이터 세그먼트를 함께 piggybacked 및 즉시 보냅니다.
  • 지연 타이머가 만료되면 해당 ACK이 보내집니다.
작은 데이터 패킷을 네트워크 congest 것을 방지하기 위해 Microsoft TCP 스택은 여러 보내기 호출 및 이전 데이터 패킷에 대해 ACK 보낼 때까지 원격 호스트에서 받은 보내는 지연 작은 데이터 버퍼에서 결합합니다 기본적으로 Nagle 알고리즘이 있습니다. Nagle 알고리즘은 두 가지 예외 사항은 다음과 같습니다.
  • 스택은 최대 전송 단위 (MTU) 보다 큰 데이터 버퍼를 coalesced 있는 경우 원격 호스트에서 ACK 기다리지 않고 전체 크기의 패킷은 즉시 보내집니다. 이더넷 네트워크에서 TCP/IP MTU 1460 바이트입니다.
  • 원격 호스트의 지연 없이 작은 데이터 패킷을 전달할 수 있도록 Nagle 알고리즘을 사용하지 않도록 TCP_NODELAY 소켓 옵션이 적용됩니다.
응용 프로그램 계층에서 성능을 최적화하기 위해 Winsock 커널 버퍼 호출을 응용 프로그램에서 Winsock 복사본을 데이터 버퍼를 보냅니다. 그런 다음 스택 Nagle 알고리즘) 와 같은 자체의 휴리스틱을 실제로 회선에서 패킷의 넣을 시기를 결정하는 데 사용합니다. Winsock 커널 (8 K 기본적으로 선택되어) SO_SNDBUF 옵션을 사용하여 소켓 할당된 버퍼 크기를 변경할 수 있습니다. 버퍼 크기, SO_SNDBUF 여러 개 필요한 경우, Winsock 크게 버퍼링할 수 있습니다. 대부분의 경우 응용 프로그램에서 송신 완료 경우에만 응용 프로그램에서 데이터 버퍼를 나타냅니다. 보낼 호출 Winsock 커널 버퍼에 복사되고 데이터가 네트워크 미디어를 도달했습니다 나타내지 않습니다. SO_SNDBUF 0으로 설정하여 Winsock 버퍼링을 해제할 때 유일한 예외입니다.

Winsock 응용 프로그램에 보내기 완료 나타내려면 다음 규칙을 사용합니다 (보내기 호출된 방식에 따라 완료 알림 수 차단 호출에서 이벤트 신호 또는 알림 함수를 호출하여 반환하는 함수를 수 등을):
  • 소켓이 여전히 SO_SNDBUF 할당량 내에 있으면 Winsock 응용 프로그램 보내기 데이터를 복사하고 응용 프로그램에 보내기 완료 나타냅니다.
  • 소켓이 SO_SNDBUF 할당량을 초과하는 스택 커널 버퍼의 여전히 이전에 버퍼링된 송신 하나만 있을 경우 Winsock 응용 프로그램 보내기 데이터를 복사하고 응용 프로그램에 보내기 완료 나타냅니다.
  • SO_SNDBUF 할당량을 초과하여 소켓입니다 이전에 버퍼링된 하나 이상의 스택 커널 버퍼를 보낼 경우, Winsock 응용 프로그램 보내기 데이터를 복사합니다. 스택 SO_SNDBUF 할당량 또는 하나의 처리 중인 송신 조건 내에서 다시 소켓 넣을 충분한 보냅니다 완료될 때까지 Winsock 응용 프로그램에 보내기 완료를 나타내지 않습니다.

사례 1

개요:

Winsock TCP 클라이언트 10000 레코드를 데이터베이스에 저장할 수 있는 Winsock TCP 서버로 보내야 합니다. 레코드 크기가 100 바이트 긴 20 바이트 다릅니다. 응용 프로그램 논리를 단순화하기 위해 디자인 다음과 같습니다.
  • 클라이언트의 차단 송신을 않습니다. 서버가 차단 recv를 않습니다.
  • 각 레코드의 단일 데이터 세그먼트를 저장되도록 클라이언트 소켓 있는 SO_SNDBUF 0으로 설정합니다.
  • 서버에서 recv 루프에서 호출합니다. 각 레코드가 한 recv 호출을 받을 수 있도록 200 바이트 recv에 게시된 버퍼가 없습니다.

성능:

테스트 중에 클라이언트가 서버에 대해서만 초당 다섯 개의 레코드를 보낼 수 개발자가 찾습니다. 총 10000 레코드를, 최대 시 데이터의 976 K 바이트 (10000 * 100/1024), 서버로 보낼 절반 이상 1시간 걸립니다.

분석:

클라이언트가 TCP_NODELAY 옵션 설정 때문에 Nagle 알고리즘을 회선에서 다른 패킷을 보낼 수 전에 대한 ACK를 기다리는 TCP 스택은 강제로. 그러나 클라이언트가 SO_SNDBUF 옵션을 0으로 설정하여 Winsock 버퍼링을 사용할 수 없습니다. 따라서 10000 개별적으로 보낼 수 있 및 ACK'ed 보내기 호출합니다. 다음 서버의 TCP 스택에 발생하기 때문에 각 ACK 지연된 200-ms 같습니다.
  • 서버가 패킷을 받으면 200-ms 지연 타이머가 이동합니다.
  • 해당 ACK piggybacked 수 있도록 아무것도 다시 보내도록 서버에 필요하지 않습니다.
  • 이전 패킷 승인되지 않으면 클라이언트를 다른 패킷을 보내지 않습니다.
  • 서버의 지연 타이머 만료 및 해당 ACK 다시 보내집니다.

개선 방법:

이 디자인 두 가지 문제가 있습니다. 첫째, 지연 타이머 문제가 있습니다. 클라이언트가 클라이언트는 기본적으로 Nagle 알고리즘을 사용하는 때문에 서버 200-ms. 내에 두 패킷을 보낼 수 있어야 합니다. 그리고 방금 Winsock 기본 버퍼링 사용 및 SO_SNDBUF 0으로 설정해야 합니다. TCP 스택은 최대 전송 단위 (MTU) 보다 큰 버퍼를 coalesced 가진 일단 원격 호스트에서 ACK 기다리지 않고 전체 크기의 패킷은 즉시 전송됩니다.

둘째, 이 디자인 이러한 작은 크기의 각 레코드에 대해 하나의 송신을 호출합니다. 이 경우 크기가 작은 보내는 매우 효율적인 아닙니다. 이 경우 개발자는 각 레코드로 100 바이트 패드 및 80 레코드를 한 번에 한 클라이언트에서 호출을 보낼 보낼 할 수 있습니다. 총 레코드 수를 보내집니다 알고 서버가, 클라이언트가 따라 레코드 수를 포함하는 수정 크기의 헤더로 해제 통신을 시작하도록 할 수 있습니다.

사례 2

개요:

Winsock TCP 클라이언트 응용 프로그램에서 주식 시세 서비스를 제공하는 Winsock TCP 서버 응용 프로그램과 두 개의 연결을 엽니다. 첫 번째 연결 명령을 채널로 주식 기호 서버에 보내는 데 사용됩니다. 두 번째 연결 데이터 채널로 주식 시세 나타날 수 있습니다. 두 개의 연결을 설정한 후 클라이언트가 주식 기호 명령 채널을 통해 서버에 보내고 데이터 채널을 통해 돌아오는 주식 시세 기다립니다. 첫 번째 주식 시세 받은 후 다음 주식 기호를 요청을 서버에 보냅니다. 클라이언트와 서버 SO_SNDBUF 및 TCP_NODELAY 옵션을 설정하지 마십시오.

성능:

테스트 중에 클라이언트가 초당 다섯 개의 따옴표가 하나만 가져올 수 개발자가 찾습니다.

분석:

이 디자인 경우에만 한 번에 한 주식 시세 해결되지 않은 요청이 있습니다. 첫 번째 주식 기호 (연결) 명령 채널을 통해 서버로 보내고 응답을 즉시 서버에서 다시 클라이언트로 데이터 채널 (연결) 통해 보내집니다. 그런 다음 클라이언트 즉시 두 번째 주식 기호 요청을 보내고 보내기 호출 요청 버퍼에 Winsock 커널 버퍼에 복사할 때 송신 즉시 반환합니다. 그러나 통해 첫 번째 보내기 때문에 명령 채널을 아직 승인되지 있지 않은 바로 클라이언트 TCP 스택은 커널 버퍼에서 요청을 보낼 수 없습니다. 시 타이머를 200-ms 지연 후 서버 명령 채널을 만료, 첫 번째 기호 요청에 대해 ACK 다시 클라이언트에 제공됩니다. 그런 다음 두 번째 따옴표 요청은 성공적으로 서버에 200 - 이 시간에 클라이언트 데이터 채널 시 지연 타이머가 만료되었기 때문에 두 번째 주식 기호에 대한 견적 다시 즉시 데이터 채널을 통해 제공되는 ms.에 대한 지연된 후 보내집니다. 서버에서 ACK은 이전 견적 응답을 받았습니다. 클라이언트가 200-ms 두 번째 주식 시세 요청을 따라서 시간 지연 타이머가 만료되어 ACK를 서버로 보내기 위해 클라이언트에서 제공하는 보내지 못했습니다 것을 기억하십시오. 따라서 클라이언트가 두 번째 따옴표 응답을 가져오고 적용되는 동일한 주기가 다른 인용 요청을 발급할 수 있습니다.

개선 방법:

두 연결 (채널) 디자인 불필요한 같습니다. 주식 시세 요청 및 응답 하나의 연결을 사용하는 경우 따옴표가 요청에 대해 ACK 견적 응답에 따라 piggybacked 및 즉시 돌아오는 수 있습니다. 성능을 더 향상시키려면 클라이언트 "주식 시세 요청을 여러 서버에 하나의 송신 호출로 multiplex 수" 및 서버가 또한 "복수 견적 응답을 클라이언트에 하나의 송신 호출로 multiplex 수". 두 개의 단방향 채널이 디자인 어떤 이유로 꼭 필요한 경우 작은 패킷을 이전 패킷에 대해 ACK 기다릴 필요 없이 즉시 보낼 수 있도록 양쪽 TCP_NODELAY 옵션을 설정해야 합니다.

권장 사항:

이러한 두 사례 연구 만듭니다 동안 일부 최악의 사례 시나리오를 보여 주는 도움말. 광범위한 작은 데이터 세그먼트를 포함하는 응용 프로그램을 설계할 때 보내고 recvs, 다음 지침을 고려해야 합니다.
  • 세그먼트가 데이터 중요한 시간 경우 응용 프로그램이 이를 보내기 호출을 전달하는 데 더 큰 데이터 블록 병합이 합니다. 송신 버퍼에 Winsock 커널 버퍼에 복사할 가능성이 있기 때문에 버퍼가 너무 커서 안 됩니다. 8 K 미만으로 약간 대개 효과적입니다. Winsock 커널 블록 크기보다 MTU가 가져옵니다 아니라, 여러 큰 패킷을 및 모든 내용이 남아 있는 마지막 패킷을 보냅니다. 마지막 패킷 제외한 보내는 쪽 200-ms 지연 타이머에 의해 적중되지 않습니다. 홀수 패킷 수 발생하면 마지막 패킷 지연된 승인 알고리즘이 변경될 수 있습니다. 보내는 최종 스택을 다른 블록 크기보다 MTU가 가져옵니다 경우 여전히 Nagle 알고리즘을 무시할 수 있습니다.
  • 가능한 경우 단방향 데이터 흐름 소켓 연결을 사용하지 않습니다. 단방향 소켓을 통해 통신 더 쉽게 Nagle에 의해 영향 및 승인 알고리즘을 연기할 수 있습니다. 통신 요청 및 응답 흐름 뒤에 단일 소켓 있는 ACK 응답에 따라 piggybacked 수 있습니다 있도록 보냅니다 및 recvs 수행할 수 사용해야 합니다.
  • 작은 데이터 세그먼트를 즉시 보낼 수 있는 경우 보내는 쪽에서 TCP_NODELAY 옵션을 설정하십시오.
  • 보내기 완료 Winsock에 의해 표시된 패킷을 회선에서 전송됩니다 보장할 않으려는 경우 해당 SO_SNDBUF 0으로 설정하지 않아야 합니다. 사실 기본 8 K 버퍼를 스스로 결정된 대부분의 상황에서 잘 작동하는, 테스트한 있을 경우에만 새 Winsock 버퍼 설정을 사용하면 기본 더 나은 성능을 제공합니다 변경할 합니다지 않습니다. 또한 SO_SNDBUF 0으로 설정하면 대부분 데이터 전송을 대량 작업을 응용 프로그램에서 유용합니다. 경우에도 최대 효율성을 위해 사용자가 이중 버퍼링을 두 개 이상의 처리 중인 송신 주어진 언제든지 함께 함께 사용해야 하는 다음 I/O 겹쳐진.
  • UDP을 사용할 데이터 전달을 보장할 수 없습니다.

참조

지연된 승인 및 Nagle 알고리즘에 대한 자세한 내용은 다음을 참조하십시오.

Braden, 오른쪽 RFC 1122, 요구 사항 인터넷 호스트--통신 레이어 인터넷 엔지니어링 작업 [1989] 강제로.

속성

기술 자료: 214397 - 마지막 검토: 2005년 7월 11일 월요일 - 수정: 3.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Platform Software Development Kit-January 2000 Edition
키워드:?
kbmt kbdswnet2003swept kbapi kbinfo kbip kbnetwork kbwinsock KB214397 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com