현재 오프라인 상태입니다. 인터넷에 다시 연결하기를 기다리고 있습니다.

이 브라우저는 지원되지 않습니다.

사이트를 사용하여 브라우저를 업데이트해야 합니다.

최신 버전의 Internet Explorer를 업데이트하세요.

디자인 문제-Winsock 사용 하 여 TCP 통한 작은 데이터 세그먼트를 전송

이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.

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

배경

Microsoft TCP 스택은 데이터 패킷을 받으면 200 밀리초 지연 타이머가 이동 합니다. ACK를 결국 보낼 때 지연 타이머 재설정 되 고 데이터 패킷을 받으면 다른 200 ms 연기를 시작 합니다.인터넷과 인트라넷 응용 프로그램의 효율성을 높입니다 Microsoft TCP 스택은 한 ACK 받은 데이터 패킷을 보낼 시기를 결정 하려면 다음 기준을 사용 합니다.
  • 지연 타이머가 만료 되기 전에 두 번째 데이터 패킷을 받으면, ACK 전송 됩니다.
  • 데이터를 두 번째 데이터 패킷을 받아서 지연 타이머가 만료 되기 전에 동일한 방향으로 ACK 보낼 경우 ACK 데이터 세그먼트를 함께 piggybacked 이며 즉시 전송 됩니다.
  • 지연 타이머가 만료 되 면 해당 ACK 전송 됩니다.
작은 데이터 패킷을 네트워크에 가득 차는 것을 방지 하려면 Microsoft TCP 스택은 여러 보내기 호출 및 이전 데이터 패킷에 대해 ACK 보낼 때까지 받은 원격 호스트에서 보내는 지연 작은 데이터 버퍼를 결합 하는 기본적으로 Nagle 알고리즘을 수 있습니다. Nagle 알고리즘은 두 가지 예외는 다음과 같습니다.
  • 스택은 최대 전송 단위 (MTU) 보다 큰 데이터 버퍼를 결합에, 전체 크기의 패킷은 원격 호스트에서 ACK 기다리지 않고 바로 보내집니다. 이더넷 네트워크에서 TCP/IP에 대 한 MTU 1460 바이트입니다.
  • 원격 호스트로 지연 없이 작은 데이터 패킷을 배달 되도록 Nagle 알고리즘을 사용 하지 않도록 TCP_NODELAY 소켓 옵션이 적용 됩니다.
응용 프로그램 계층에서 성능을 최적화 하기 위해 응용 프로그램에서 Winsock 복사본 데이터 버퍼에 Winsock 커널 버퍼 호출을 보냅니다. 다음 스택 (Nagle 알고리즘)과 같은 자체의 휴리스틱을 실제로 회선에서 패킷의 넣을 시기를 결정 하 사용 합니다. Winsock 커널 버퍼에 소켓이 SO_SNDBUF 옵션 (기본적으로 이것은 8 K)를 사용 하 여 할당의 양을 변경할 수 있습니다. 필요한 경우 버퍼 크기는 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에 게시 된 버퍼는 각 레코드가 한 recv 호출에서 받을 수 있도록 200 바이트입니다.

성능:

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

분석:

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

개선 하는 방법

이 디자인 두 가지 문제가 있습니다. 첫째, 지연 타이머 문제가 있습니다. 클라이언트가 클라이언트는 기본적으로 Nagle 알고리즘을 사용 하므로 서버 200 밀리초 내에 두 패킷을 보낼 수 있게 하려면 필요, 기본 Winsock 버퍼링 사용 하며 SO_SNDBUF를 0으로 설정 되지 않았습니다. TCP 스택은 최대 전송 단위 (MTU) 보다 큰 버퍼를 결합 했습니다, 일단 원격 호스트에서 ACK 기다리지 않고 전체 크기의 패킷은 즉시 전송 됩니다.

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

사례 2

개요:

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

성능:

테스트 하는 동안 개발자는 클라이언트가 초당 다섯 개의 따옴표가 혹시만 찾습니다.

분석:

만이 디자인 한 번에 한 주식 시세 해결 되지 않은 요청을 허용합니다. 첫 번째 주식 기호 (연결) 명령 채널을 통해 서버로 전송 되 고 응답 즉시 전송 됩니다 서버에서 다시 클라이언트로 데이터 채널 (연결)을 통해. 그런 다음 클라이언트 즉시 두 번째 주식 기호 요청을 보내고 보내기 호출에서 요청 버퍼에 Winsock 커널 버퍼 복사 되 고 송신 즉시 반환 하며 그러나 클라이언트 TCP 스택은 명령 채널을 통해 첫 번째 보내기 때문에 아직 승인 되지는 즉시 해당 커널 버퍼에서 요청을 보낼 수 없습니다. 200 ms 타이머 지연 후 서버 명령 채널을 만료, 첫 번째 기호 요청에 대해 ACK 클라이언트에 반환 되. 다음 두 번째 견적 요청 후 200 김 두 번째 주식 기호에 대 한 견적 다시 들어오면 즉시 데이터 채널을 통해이 시간에 클라이언트 데이터 채널에 지연 타이머가 만료 되었기 때문에 지연 되는 서버에 성공적으로 전송 됩니다. 이전 견적 응답에 대 한 ACK이 서버에 의해 수신 됩니다. (는 클라이언트로 보낼 수 없습니다 200 밀리초에 대 한 두 번째 주식 시세 요청 따라서 시간 지연 타이머 만료 및 ACK를 서버로 보내 클라이언트에 제공 해야 합니다.) 따라서 클라이언트 두 번째 따옴표 응답을 같은 주기는 다른 견적 요청을 발급할 수 있습니다.

개선 하는 방법

여기 두 연결 (채널) 설계는 필요 없습니다. 주식 시세 요청 및 응답 하나의 연결을 사용 하는 경우 견적 요청에 대해 ACK 견적 응답에 piggybacked 고 바로 돌아올 수 있습니다. 또한 성능을 향상 시키기 위해, 클라이언트 수 "멀티플렉싱" 주식 시세 요청을 여러 서버에 하나의 송신 호출으로 및 서버 수 또한 "멀티플렉싱" 복수 견적 응답 클라이언트에 하나의 송신 호출으로. 두 개의 단방향 채널이 디자인 어떤 이유로 실제로 필요한 경우 작은 패킷을 이전 패킷에 대해 ACK 기다릴 필요 없이 즉시 보낼 수 있도록 양쪽 TCP_NODELAY 옵션을 설정 해야 합니다.

권장 사항:

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

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

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 214397 - 마지막 검토: 03/14/2015 07:32:00 - 수정: 4.0

  • kbdswnet2003swept kbapi kbinfo kbip kbnetwork kbwinsock kbmt KB214397 KbMtko
피드백
icrosoft.com/c.gif?DI=4050&did=1&t="> >ow.location.protocol) + "//c.microsoft.com/ms.js'><\/script>");