Windows TCP 기능에 대한 설명

이 문서에서는 Windows의 TCP 기능에 대해 설명합니다.

적용 대상: Windows 10 - 모든 버전, Windows Server 2012 R2
원래 KB 번호: 224829

요약

이 문서에서는 Windows의 다음 TCP 기능에 대해 설명합니다.

  • TCP 창 크기
  • 이제 TCP 옵션이 지원됨
  • Windows 크기 조정 - RFC 1323
  • 타임스탬프 - RFC 1323
  • PAWS(래핑된 시퀀스 번호)에 대한 보호
  • SACKS(선택적 승인) - RFC 2018
  • TCP 재전송 동작 및 빠른 재전송

레지스트리의 항목을 변경하여 TCP 기능을 변경할 수 있습니다.

중요

다음 섹션, 메서드 또는 작업에는 레지스트리를 수정하는 방법을 알려주는 단계가 포함되어 있습니다. 그러나 레지스트리를 잘못 수정하면 심각한 문제가 발생할 수 있습니다. 따라서 다음 단계를 주의하여 수행해야 합니다. 추가된 보호를 위해 레지스트리를 수정하기 전에 백업하세요. 그런 다음 문제가 발생할 경우 레지스트리를 복원할 수 있습니다. Windows XP 및 Windows Server 2003에서 레지스트리를 백업, 편집 및 복원하는 방법에 대한 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료를 참조하세요.
322756 Windows에서 레지스트리를 백업 및 복원하는 방법

TCP 창 크기

TCP 수신 창 크기는 연결 중에 버퍼링할 수 있는 수신 데이터 양(바이트)입니다. 송신 호스트는 수신 호스트에서 승인 및 창 업데이트를 기다려야 하기 전에 해당 양의 데이터만 보낼 수 있습니다. Windows TCP/IP 스택은 대부분의 환경에서 자체 조정하도록 설계되었으며 이전 버전보다 더 큰 기본 창 크기를 사용합니다.

하드 코딩된 기본 수신 창 크기를 사용하는 대신 TCP는 MSS(최대 세그먼트 크기)의 짝수 증가로 조정됩니다. MSS는 연결 설정 중에 협상됩니다. 수신 창을 MSS의 증분으로 조정하면 대량 데이터 전송 중에 사용되는 전체 크기 TCP 세그먼트의 비율이 증가합니다.

수신 창 크기는 다음과 같은 방식으로 결정됩니다.

  1. 원격 호스트로 전송된 첫 번째 연결 요청은 수신 창 크기 16K(16,384바이트)를 보급합니다.
  2. 연결이 설정되면 수신 창 크기가 MSS의 짝수 증가로 반올림됩니다.
  3. 창 크기 조정 옵션(RFC 1323)을 사용하지 않는 한 창 크기는 MSS의 4배, 최대 크기 64K로 조정됩니다.

참고

"Windows 크기 조정" 섹션을 참조하세요.

이더넷 연결의 경우 창 크기는 일반적으로 17,520바이트(16K는 12개의 1460바이트 세그먼트로 반올림됨)로 설정됩니다. SACKS(선택적 승인) 및 타임스탬프와 같은 확장된 TCP 헤드 옵션을 지원하는 컴퓨터에 연결하면 창 크기가 줄어들 수 있습니다. 이러한 두 옵션은 TCP 헤더 크기를 20바이트 이상으로 늘려 데이터 공간을 줄입니다.

이전 버전의 Windows NT 이더넷 연결의 창 크기는 8,760바이트 또는 6개의 1460바이트 세그먼트였습니다.

수신 창 크기를 특정 값으로 설정하려면 Windows 버전과 관련된 레지스트리 하위 키에 TcpWindowSize 값을 추가합니다. 제거하려면 다음 단계를 수행합니다.

  1. 실행 시작을> 선택하고 를 입력Regedit한 다음 확인을 선택합니다.

  2. Windows 버전과 관련된 레지스트리 하위 키를 확장합니다.

    • Windows 2000의 경우 다음 하위 키를 확장합니다. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • Windows Server 2003의 경우 다음 하위 키를 확장합니다. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. 편집 메뉴에서 새로 만들기를 가리킨 다음 DWORD 값을 선택합니다.

  4. 새 값 상자에 를 입력 TcpWindowSize 한 다음 Enter 키를 누릅니다.

  5. 편집 메뉴에서 수정을 선택합니다.

  6. 값 데이터 상자에 원하는 창 크기를 입력합니다.

    참고

    창 크기에 유효한 범위는 0-0x3FFFC000 16진수입니다.

이 값은 기본적으로 존재하지 않습니다. TcpWindowSize 값을 추가하면 위에서 설명한 기본 창 크기 알고리즘이 재정의됩니다.

참고

TcpWindowSize를 매개 변수 키에 추가하여 모든 인터페이스에 대해 창 크기를 전역적으로 설정할 수도 있습니다.

이제 TCP 옵션이 지원됨

이전에는 TCP 옵션이 주로 최대 세그먼트 크기를 협상하는 데 사용되었습니다. Windows에서 TCP 옵션은 창 크기 조정, 타임스탬프 및 선택적 ACK에 사용됩니다.

TCP 옵션에는 두 가지 유형이 있습니다.

  1. 특정 옵션 종류를 나타내는 데 사용되는 단일 옥텟 TCP 옵션입니다.
  2. 옵션 종류, 옵션 길이 및 일련의 옵션 옥텟으로 구성된 여러 옥텟 TCP 옵션입니다.

다음 목록에는 각 TCP 옵션 종류, 길이, 이름 및 설명이 나와 있습니다.

종류: 0
길이: 1
옵션: 옵션 목록의 끝
설명: 마지막 TCP 옵션에 안쪽 여백이 필요할 때 사용됩니다.

종류: 1
길이: 1
옵션: 작업 없음
설명: 안쪽 여백이 필요하고 동일한 패킷 내에서 더 많은 TCP 옵션이 따르는 경우에 사용됩니다.

종류: 2
길이: 4
옵션: 최대 세그먼트 크기
설명: 네트워크를 통해 보낼 수 있는 TCP 세그먼트의 최대 크기를 나타냅니다.

종류: 3
길이: 3
옵션: 창 크기 조정 옵션
설명: 64k보다 큰 창 크기를 사용할 때 사용할 배율 인수를 식별합니다.

종류: 8
길이: 10
옵션: 타임스탬핑 옵션
설명: 전송된 패킷의 RTT(왕복 시간)를 계산하는 데 사용됩니다.

종류: 4
길이: 2
옵션: TCP SACK 허용됨
설명: 선택적 Acks가 허용되었음을 다른 호스트에 알릴 수 있습니다.

종류: 5
길이: 다양
옵션: TCP SACK 옵션
설명: 호스트에서 잘못된 패킷이 수신되었는지 여부를 식별하는 데 사용됩니다.

Windows 크기 조정

높은 대역폭 네트워크를 보다 효율적으로 사용하려면 더 큰 TCP 창 크기를 사용할 수 있습니다. TCP 창 크기 필드는 데이터 흐름을 제어하고 2바이트 또는 창 크기 65,535바이트로 제한됩니다.

크기 필드를 확장할 수 없으므로 배율 인수가 사용됩니다. TCP 창 크기 조정은 최대 창 크기를 65,535바이트에서 1기가바이트로 늘리는 데 사용되는 옵션입니다.

창 크기 조정 옵션은 TCP 3방향 핸드셰이크 중에만 사용됩니다. 창 크기 조정 값은 16비트 창 크기 필드를 왼쪽으로 이동할 비트 수를 나타냅니다. 창 크기 조정 값은 0(교대 없음)에서 14로 설정할 수 있습니다.

실제 창 크기를 계산하려면 창 크기를 2^S로 곱합니다. 여기서 S는 배율 값입니다.

예를 들어:

창 크기가 65,535바이트이고 창 배율 인수가 3인 경우
True 창 크기 = 65535*2^3

True 창 크기 = 524280

다음 네트워크 모니터 추적은 창 크기 조정 옵션이 사용되는 방법을 보여 제공합니다.

TCP: ....S., len:0, seq:725163-725163, ack:0, win:65535, src:1217 dst:139(NBT Session)  
TCP: Source Port = 0x04C1  
TCP: Destination Port = NETBIOS Session Service  
TCP: Sequence Number = 725163 (0xB10AB)  
TCP: Acknowledgement Number = 0 (0x0)  
TCP: Data Offset = 44 (0x2C)  
TCP: Reserved = 0 (0x0000)  
+ TCP: Flags = 0x02 : ....S.  
TCP: Window = 65535 (0xFFFF)  
TCP: Checksum = 0x8565  
TCP: Urgent Pointer = 0 (0x0)  
TCP: Options  
+ TCP: Maximum Segment Size Option  
TCP: Option Nop = 1 (0x1)  
TCP: Window Scale Option  
TCP: Option Type = Window Scale  
TCP: Option Length = 3 (0x3)  
TCP: Window Scale = 3 (0x3)  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: Timestamps Option  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: SACK Permitted Option  

실제 3방향 핸드셰이크에 사용되는 창 크기는 RFC 1323 섹션 2.2당 크기가 조정된 창 크기가 아닙니다.

"SYN의 창 필드(예: [SYN] 또는 [SYN,ACK]) 세그먼트 자체는 확장되지 않습니다."

즉, 3방향 핸드셰이크 후에 전송된 첫 번째 데이터 패킷이 실제 창 크기입니다. 배율 인수가 있는 경우 초기 창 크기는 항상 65,535바이트입니다. 창 크기는 3방향 핸드셰이크에서 식별된 배율 인수를 곱합니다. 아래 표는 다양한 창 크기에 대한 배율 계수 경계를 나타냅니다.

배율 배율 배율 값 초기 창 창 크기 조정됨
0 1 65535 이하 65535 이하
1 2 65535 131,070
2 4 65535 262,140
3 8 65535 524,280
4 16 65535 1,048,560
5 32 65535 2,097,120
6 64 65535 4,194,240
7 128 65535 8,388,480
8 256 65535 16,776,960
9 512 65535 33,553,920
10 1024 65535 67,107,840
11 2048 65535 134,215,680
12 4096 65535 268,431,360
13 8192 65535 536,862,720
14 16384 65535 1,073,725,440

예를 들면

레지스트리의 창 크기가 10진수로 2690000000(269M)으로 입력되면 3방향 핸드셰이크 중 배율 인수는 13입니다. 12의 배율 인수는 최대 268,431,360바이트(268M)의 창 크기만 허용합니다.

이 예제의 초기 창 크기는 다음과 같이 계산됩니다.
창 배율 인수가 13인 65,535바이트
True 창 크기 = 65535*2^13
True 창 크기 = 536,862,720

창 크기에 대한 값이 레지스트리에 추가되고 해당 크기가 기본값보다 크면 Windows는 새 창 크기를 수용하는 배율 값을 사용하려고 시도합니다.

다음 레지스트리 키의 Tcp1323Opts 값을 추가하여 크기 조정 창 및 타임스탬프를 제어할 수 있습니다.

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. 도구 모음에서 실행 시작을> 선택한 다음 를 입력Regedit하여 레지스트리 편집기 시작합니다.

  2. 레지스트리 편집기 편집을 선택하고 새로 만들기를 가리킨 다음 DWORD 값을 선택합니다.

  3. 새 값 상자에 를 입력 Tcp1323Opts하고 Enter 키를 누른 다음 편집 메뉴에서 수정을 선택합니다.

    참고

    유효한 범위는 다음과 같은 0, 1, 2 또는 3입니다.
    0(RFC 1323 옵션 사용 안 함)
    1(창 크기 조정만 사용)
    2(타임스탬프만 사용)
    3(두 옵션 모두 사용)

이 레지스트리 항목은 RFC 1323 타임스탬프 및 창 크기 조정 옵션을 제어합니다. 타임스탬프 및 창 크기 조정은 기본적으로 사용하도록 설정되지만 플래그 비트로 조작할 수 있습니다. 비트 0 은 창 크기 조정을 제어합니다. 비트 1 은 타임스탬프를 제어합니다.

타임 스탬프

이전에는 TCP/IP 스택이 전송된 데이터 창당 하나의 샘플을 사용하여 RTT(왕복 시간)를 계산했습니다. 승인이 수신될 때까지 패킷이 전송될 때 타이머(다시 전송 타이머)가 설정되었습니다. 예를 들어 이더넷 네트워크의 창 크기가 64,240바이트(전체 세그먼트 44개)인 경우 왕복 시간을 다시 계산하는 데는 44개 패킷 중 하나만 사용되었습니다. 최대 창 크기가 65,535바이트인 이 샘플링 속도는 충분했습니다. 창 크기 조정 및 최대 창 크기 1GB를 사용하는 경우 이 RTT 샘플링 속도만으로는 충분하지 않습니다.

이제 스택에서 적절한 것으로 간주되는 세그먼트(데이터 및 ACK)에서 TCP 타임스탬프 옵션을 사용하여 다음과 같은 작업을 수행할 수 있습니다.

  • RTT 계산
  • PAWS 검사

이 데이터를 사용하면 RTT를 큰 창 크기로 정확하게 계산할 수 있습니다. RTT는 재전송 간격을 계산하는 데 사용됩니다. 최적의 처리량을 위해 정확한 RTT 및 재전송 시간 초과가 필요합니다.

TCP 세션에서 TCP 타임스탬프를 사용하는 경우 세션의 발신자는 TCP SYN 패킷(3방향 핸드셰이크)의 첫 번째 패킷에서 옵션을 보냅니다. 그러면 어느 한 쪽에서 세션 중에 TCP 옵션을 사용할 수 있습니다.

TCP 타임스탬프 옵션(TSopt):

종류 = 8 길이 = 10 TS 값(Tsval) TS 에코 회신(Tsecr)
1바이트 1바이트 4바이트 4바이트

아래와 같이 TCP 옵션 필드를 확장하여 네트워크 모니터 추적에서 타임스탬프 옵션 필드를 볼 수 있습니다.

TCP: Timestamps Option  
TCP: Option Type = Timestamps  
TCP: Option Length = 10 (0xA)  
TCP: Timestamp = 2525186 (0x268802)  
TCP: Reply Timestamp = 1823192 (0x1BD1D8)

PAWS(래핑된 시퀀스 번호)에 대한 보호

TCP 시퀀스 번호 필드는 사용 가능한 시퀀스 번호 수를 제한하는 32비트로 제한됩니다. 대용량 네트워크와 대규모 데이터 전송을 사용하면 패킷이 네트워크를 트래버스하기 전에 시퀀스 번호를 래핑할 수 있습니다. 초당 1Gbps(기가바이트) 네트워크에서 데이터를 보내는 경우 시퀀스 번호는 34초만에 래핑할 수 있습니다. 패킷이 지연되면 시퀀스 번호가 같은 다른 패킷이 있을 수 있습니다. 중복 시퀀스 번호의 혼동을 방지하기 위해 TCP 타임스탬프는 시퀀스 번호의 확장으로 사용됩니다. 패킷에는 현재 및 진행 중인 타임스탬프를 갖습니다. 이전 패킷에는 이전 타임스탬프를 가지고 있으며 삭제됩니다.

선택적 승인(SACK)

Windows에서는 선택적 승인 또는 SACK이라는 성능 기능을 지원합니다. SACK은 큰 TCP 창 크기를 사용하는 연결에 특히 중요합니다. SACK 이전에는 수신자가 수신된 연속 데이터 스트림의 최신 시퀀스 번호 또는 수신 창의 "왼쪽 가장자리"만 확인할 수 있었습니다. SACK을 사용하도록 설정하면 수신자는 수신 창의 왼쪽 가장자리를 승인하기 위해 ACK 번호를 계속 사용하지만 수신된 데이터의 다른 블록을 개별적으로 승인할 수도 있습니다. SACK은 아래와 같이 TCP 헤더 옵션을 사용합니다.

SACK은 두 가지 유형의 TCP 옵션을 사용합니다.

TCP Sack-Permitted 옵션은 선택적 ACK를 수행할 수 있음을 나타내기 위해 SYN 패킷(TCP 연결 설정 중)에서만 사용됩니다.

두 번째 TCP 옵션인 TCP Sack 옵션에는 하나 이상의 데이터 블록에 대한 승인이 포함됩니다. 데이터 블록은 데이터 블록의 시작 부분과 끝에 있는 시퀀스 번호를 사용하여 식별됩니다. 데이터 블록의 왼쪽 및 오른쪽 가장자리라고도 합니다.

종류 4는 TCP Sack-Permitted 옵션입니다. 종류 5는 TCP Sack 옵션입니다. 길이는 이 TCP 옵션의 길이(바이트)입니다.

Tcp SACK 허용:

종류 = 4 길이 = 2
1바이트 1바이트

Tcp SACK 옵션:

종류 = 5 Length = Variable
1바이트 첫 번째 블록의 왼쪽 가장자리에서 첫 번째 블록의 오른쪽 가장자리
...
N번째 블록의 왼쪽 가장자리에서 N번째 블록의 오른쪽 가장자리까지

SACK 사용(기본값)을 사용하면 패킷 또는 일련의 패킷을 삭제할 수 있습니다. 수신자는 수신된 데이터와 데이터에 "구멍"이 있을 수 있는 위치를 보낸 사람에게 알립니다. 그런 다음 보낸 사람은 이미 성공적으로 수신된 데이터 블록을 다시 전송하지 않고 누락된 데이터를 선택적으로 다시 전송할 수 있습니다. SACK은 SackOpts 레지스트리 매개 변수에 의해 제어됩니다.

다음 레지스트리 키의 SackOpts 값을 편집하여 선택적 승인 사용을 제어할 수 있습니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. 도구 모음에서 실행 시작을> 선택한 다음 를 입력Regedit하여 레지스트리 편집기 시작합니다.
  2. 레지스트리 편집기 위의 키를 찾아 선택한 다음 편집 메뉴에서 수정을 선택합니다.
  3. 값 데이터 상자에 원하는 값을 입력합니다.

참고

유효한 이진 값은 0 또는 1이고 기본값은 1입니다. 이 매개 변수는 선택적 ACK(SACK - RFC 2018) 지원을 사용할지 여부를 제어합니다.

다음 네트워크 모니터 추적은 시퀀스 번호 54857341 모든 데이터를 인정하는 호스트와 시퀀스 번호 54858789-54861685의 데이터를 보여 줍니다. 누락된 데이터는 54857341 54858788.

TCP: .A...., len:0, seq:925104-925104, ack:54857341, win:32722, src:1242 dst:139  
TCP: Source Port = 0x04DA  
TCP: Destination Port = NETBIOS Session Service  
TCP: Sequence Number = 925104 (0xE1DB0)  
TCP: Acknowledgement Number = 54857341 (0x3450E7D)  
TCP: Data Offset = 44 (0x2C)  
TCP: Reserved = 0 (0x0000)  
+ TCP: Flags = 0x10 : .A....  
TCP: Window = 32722 (0x7FD2)  
TCP: Checksum = 0x4A72  
TCP: Urgent Pointer = 0 (0x0)  
TCP: Options  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: Timestamps Option  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
TCP: SACK Option  
TCP: Option Type = 0x05  
TCP: Option Length = 10 (0xA)  
TCP: Left Edge of Block = 54858789 (0x3451425)  
TCP: Right Edge of Block = 54861685 (0x3451F75)

TCP 재전송 동작 및 빠른 재전송

TCP 재전송

일반적인 재전송 동작을 검토하기 위해 TCP는 각 아웃바운드 세그먼트가 IP(인터넷 프로토콜)에 전달될 때 재전송 타이머를 시작합니다. 타이머가 만료되기 전에 지정된 세그먼트의 데이터에 대한 승인이 수신되지 않은 경우 세그먼트가 다시 전송됩니다.

RTO(재전송 시간 제한)는 RFC 793에 설명된 대로 SRTT(부드러운 왕복 시간) 계산을 사용하여 연결의 특성에 맞게 지속적으로 조정됩니다. 지정된 세그먼트에 대한 타이머는 해당 세그먼트의 각 재전송 후 두 배가 됩니다. 이 알고리즘을 사용하여 TCP는 연결의 정상적인 지연으로 자체 조정합니다.

빠른 재전송

TCP는 경우에 따라 재전송 타이머가 만료되기 전에 데이터를 다시 전송합니다. 가장 일반적인 원인은 빠른 재전송이라는 기능입니다. 빠른 재전송을 지원하는 수신기가 현재 예상한 것 이상으로 시퀀스 번호가 있는 데이터를 수신하면 일부 데이터가 삭제되었을 수 있습니다. 이 이벤트를 보낸 사람에게 알리기 위해 수신자는 ACK 번호를 예상 시퀀스 번호로 설정하여 즉시 ACK를 보냅니다. 도착하는 각 추가 TCP 세그먼트에 대해 계속 수행됩니다. 발신자가 동일한 시퀀스 번호를 인정하는 ACK 스트림을 수신하기 시작하면 세그먼트가 삭제되었을 수 있습니다. 발신자는 재전송 타이머가 만료될 때까지 기다리지 않고 수신자가 예상하는 세그먼트를 즉시 다시 보냅니다. 이 최적화는 패킷이 자주 삭제될 때 성능을 크게 향상시킵니다.

기본적으로 Windows는 다음 조건에서 세그먼트를 다시 보냅니다.

  • 동일한 시퀀스 번호에 대해 3개의 ACK(ACK 1개와 중복 2개)를 받습니다.
  • 시퀀스 번호는 현재 번호보다 지연됩니다.

이 동작은 레지스트리 매개 변수를 사용하여 TcpMaxDupAcks 제어할 수 있습니다.

다음 레지스트리 키의 TcpMaxDupAcks 값을 편집하여 빠른 재전송을 시작하는 데 필요한 ACK 수를 제어할 수 있습니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. 도구 모음에서 실행 시작을> 선택한 다음 를 입력Regedit하여 레지스트리 편집기 시작합니다.
  2. 레지스트리 편집기 위의 키를 찾아 선택한 다음 편집 메뉴에서 수정을 선택합니다.
  3. 값 데이터 상자에 원하는 값을 입력합니다.

참고

유효한 범위는 1-3이고 기본값은 2입니다.

이 매개 변수는 전송 중에 삭제된 세그먼트를 다시 보내기 위해 트리거되기 전에 fast retransmit 전송된 데이터의 동일한 시퀀스 수에 대해 수신해야 하는 중복 ACK 수를 결정합니다.