TCP/IP 세그먼트 병합 규칙

이 섹션에서는 RSC(수신 세그먼트 병합) 지원 미니포트 드라이버가 지정된 TCP 연결에 대한 세그먼트를 병합해야 하는 경우를 지정하는 규칙을 정의합니다. 규칙을 위반하면 예외가 생성되고 미니포트 드라이버는 세그먼트의 병합을 중단해야 합니다.

미니포트 드라이버는 단일 병합 단위(SCU)에 대한 IP 및 TCP 헤더를 업데이트해야 합니다. 미니포트 드라이버는 SCU를 통해 TCP 및 IPv4 체크섬을 다시 계산하고 TCP 페이로드를 연결해야 합니다.

다음 두 순서도 중 첫 번째 순서도는 세그먼트를 병합하고 TCP 헤더를 업데이트하는 규칙을 설명합니다. 이 순서도는 유효한 중복 ACK 및 창 업데이트를 구분하기 위한 메커니즘을 나타냅니다. 두 번째 순서도는 이러한 메커니즘을 설명합니다.

이러한 순서도는 RSC 규칙을 이해하기 위한 참조로 제공됩니다. 하드웨어 구현은 정확성이 유지되는 한 순서도를 최적화할 수 있습니다.

다음 용어는 순서도에 사용됩니다.

용어 설명
Seg. Seq 들어오는 세그먼트의 시퀀스 번호입니다.
H.SEQ 현재 추적된 SCU의 시퀀스 번호입니다.
Seg. Ack 들어오는 세그먼트의 승인 번호입니다.
H.ACK 현재 추적된 SCU의 승인 번호입니다.
Seg. Wnd 들어오는 세그먼트에서 보급되는 창입니다.
H.WND 현재 추적된 SCU에서 보급하는 창입니다.
Seg. 렌 들어오는 세그먼트의 TCP 페이로드 길이입니다.
H.LEN 현재 추적된 SCU의 TCP 페이로드 길이입니다.
Seg. Nxt SEG의 합계입니다 . SEQSEG. LEN.
H.NXT H.SEQH.LEN의 합계입니다.
H.DupAckCount SCU에 병합된 중복 ACK의 수입니다. 이 수는 0이어야 합니다.
Seg. Tsval 현재 수신된 세그먼트의 타임스탬프 값입니다. 이 값의 형식은 RFC 1323에 정의되어 있습니다.
H.Tsval 현재 추적된 SCU의 타임스탬프 값입니다.
Seg. TSecr 현재 수신된 세그먼트의 타임스탬프 에코 회신 입니다.
H.TSecr 현재 추적된 SCU의 타임스탬프 에코 회신 입니다.

세그먼트를 병합하고 TCP 헤더를 업데이트하는 규칙을 보여 주는 순서도입니다.

유효한 중복 ACK 및 창 업데이트를 구분하기 위한 메커니즘을 보여 주는 순서도입니다.

순서도는 미니포트 드라이버가 세그먼트를 서로 다른 ACK 번호와 결합할 수 있음을 보여 줍니다. 그러나 미니포트 드라이버는 위의 첫 번째 순서도와 같이 ACK 번호에 대한 다음 규칙을 준수해야 합니다.

  • 시퀀스 번호 검사 수행한 후 다음 조건 중 하나 또는 둘 다를 충족하는 경우 들어오는 순수 ACK가 현재 추적된 SCU로 병합될 수 있습니다.

    • H.ACK == Seg. ACK.

    • 추적 중인 병합된 세그먼트의 중복 ACK 수는 0입니다. 즉, H.DupAckCount == 0입니다.

      즉, 중복된 ACK 또는 창 업데이트가 아닌 순수 ACK는 예외를 트리거하고 병합해서는 안 됩니다. 이러한 모든 순수 ACK는 개별 세그먼트로 표시되어야 합니다. 이 규칙은 RSC가 Windows TCP 정체 제어 알고리즘의 동작 또는 성능에 영향을 주지 않도록 합니다.

  • 들어오는 데이터 세그먼트(SEG. ACK == H.ACK) 또는 들어오는 돼지 백업 ACK(SEG. ACK>H.ACK)는 다음 조건이 모두 충족되는 경우 현재 추적된 SCU로 병합될 수 있습니다.

    • 세그먼트는 시퀀스 공간의 SCU와 연속됩니다. 즉, SEG입니다. SEQ == H.NXT.
    • 추적 중인 병합된 세그먼트의 중복 ACK 수는 0입니다. 즉, H.DupAckCount == 0입니다.

중복 ACK 병합에 대한 추가 참고 사항

중복 ACK 동작

미니포트 드라이버는 순수 ACK에 해당하는 중복 ACK 세그먼트를 처리하고 병합하지 않아야 합니다. 이 경우 표시를 위해 현재 SCU(있는 경우)를 마무리하고 중복된 ACK 세그먼트를 개별 세그먼트로 표시해야 합니다. Windows 클라이언트는 기본적으로 SACK(선택적 승인)을 사용하므로 중복된 ACK 세그먼트는 예외를 생성할 가능성이 높습니다. 예제는 수신 세그먼트 병합 예제를 참조하세요. DupAckCount> 0이 있는 세그먼트가 표시되면 NDIS는 인터페이스에서 RSC를 사용하지 않도록 설정합니다.

데이터 세그먼트로 구성된 SCU를 추적할 때 중복 ACK 처리

H.LEN> 0을 사용하여 SCU를 추적할 때(즉, 데이터가 포함된 병합된 세그먼트) 중복된 ACK가 다음에 도착하면 추적 SCU는 다음과 같이 완료되어야 합니다.

  1. 중복된 ACK부터 새 SCU를 추적해야 합니다.

  2. 새 SCU에 대한 DupAckCount 를 0으로 설정해야 합니다.

  3. 중복 ACK가 추가로 수신되면 DupAckCount 가 증가해야 합니다.

이 경우 DupAckCount 는 중복 ACK 수보다 1보다 작습니다. 호스트 스택은 계산을 올바르게 처리합니다.

순수 누적 ACK로 구성된 SCU를 추적할 때 중복 ACK 처리

단일 순수 누적 ACK(규칙은 여러 순수 ACK 병합 금지)로 구성된 SCU를 추적할 때 중복된 ACK가 다음에 도착하면 추적 SCU에 대한 DupAckCount 를 증분해야 합니다. 또한 중복 ACK가 추가로 수신되는 경우에도 증가해야 합니다. 이 경우 DupAckCount 는 병합된 중복 ACK 수와 같습니다.

DPC에서 받은 첫 번째 세그먼트가 중복된 ACK인 경우

이 경우 NIC는 상태를 유지하지 않으므로 수신된 세그먼트가 중복된 ACK인지 여부를 확인할 수 없습니다. 따라서 세그먼트는 다음과 같이 순수 ACK로 처리되어야 합니다.

  1. 이 세그먼트부터 새 SCU를 추적해야 합니다.

  2. 새 SCU에 대한 DupAckCount 를 0으로 설정해야 합니다.

  3. DupAckCount는 수신되는 각 추가 중복 ACK에 대해 1씩 증가해야 합니다.

이 경우 DupAckCount 는 실제 중복 ACK 수보다 1보다 작습니다. 호스트 스택은 계산을 올바르게 처리합니다.

중복 ACK 예외

미니포트 드라이버는 순수 ACK에 해당하는 중복 ACK 세그먼트를 처리하고 병합하지 않을 수 있습니다. 이 경우 표시를 위해 현재 SCU(있는 경우)를 마무리하고 중복된 ACK 세그먼트를 개별 세그먼트로 표시해야 합니다. Windows 클라이언트는 기본적으로 SACK을 사용하므로 중복된 ACK 세그먼트가 예외를 생성할 가능성이 높습니다. 예제는 수신 세그먼트 병합의 예를 참조하세요. 이 예외는 창 업데이트 세그먼트에는 적용되지 않습니다.

타임스탬프 옵션을 사용하여 세그먼트 병합

TCP 타임스탬프 옵션은 합법적으로 병합될 수 있는 유일한 옵션입니다. 이 옵션을 사용하여 세그먼트를 병합하는 것은 구현별 결정으로 남습니다. 미니포트 드라이버가 세그먼트를 타임스탬프 옵션과 결합하는 경우 다음 순서도에 설명된 규칙을 따라야 합니다.

TCP 타임스탬프 옵션을 사용하여 세그먼트를 병합하는 규칙을 설명하는 순서도입니다.

참고

검사 SEG입니다. TSval>= H.TSval은 TCP 시퀀스 번호에 사용된 것과 유사한 모듈로-232 산술 연산을 사용하여 수행해야 합니다. RFC 793, 섹션 3.3을 참조하세요.

병합된 세그먼트를 나타내는 경우 병합된 세그먼트를 설명하는 NET_BUFFER_LIST 구조체의 NetBufferListInfo 멤버를 다음과 같이 설정하여 다음과 같이 대역 외 정보를 표시해야 합니다.

  • 병합된 세그먼트 수는 NetBufferListInfo[TcpRecvSegCoalesceInfo]에 저장되어야 합니다. CoalescedSegCount 멤버입니다. 이 숫자는 병합된 데이터 세그먼트만 나타냅니다. 순수 ACK 병합은 사용할 수 없으며 창 업데이트 세그먼트는 이 필드의 일부로 계산되어서는 안 됩니다.

  • 중복된 ACK 수는 NetBufferListInfo[TcpRecvSegCoalesceInfo]에 저장되어야 합니다. DupAckCount 멤버입니다. 위의 첫 번째 순서도는 이 값을 계산하는 방법을 설명합니다.

  • TCP 타임스탬프 옵션이 있는 세그먼트가 병합되면 NetBufferListInfo[RscTcpTimestampDelta]는 SCU를 구성하는 병합된 세그먼트 시퀀스에 표시된 가장 이른 TCP 타임스탬프 값과 최신 TCP 타임스탬프 값 사이의 절대 델타로 채워야 합니다. SCU 자체에는 병합된 세그먼트 시퀀스에 표시된 최신 TCP 타임스탬프 값이 포함되어야 합니다.

CoalescedSegCount 멤버가 0보다 큰 경우에만 DupAckCountRscTcpTimestampDelta 멤버가 해석됩니다. CoalescedSegCount가 0이면 세그먼트는 병합되지 않은 비 RSC 세그먼트로 처리됩니다.

NetBufferListInfo 멤버의 콘텐츠에 대한 자세한 내용은 NDIS_NET_BUFFER_LIST_INFONDIS_RSC_NBL_INFO.

PSH 비트는 병합된 모든 세그먼트에 대해 ORed여야 합니다. 즉, PSH 비트가 개별 세그먼트에서 설정된 경우 미니포트 드라이버는 SCU에서 PSH 비트를 설정해야 합니다.

SCU를 완료하려면 다음이 포함됩니다.

TCP/IP IPsec 세그먼트 처리

네트워크 카드 RSC 및 IPsec 태스크 오프로드 기능을 모두 보고할 수 있습니다. ( 네트워크 어댑터의 RSC 기능 확인 참조) 그러나 IPsec 작업 오프로드를 지원하는 경우 IPsec로 보호되는 세그먼트를 병합하려고 시도해서는 안 됩니다.