Condividi tramite


Regole per l'unione di segmenti TCP/IP

Questa sezione definisce le regole che specificano quando un driver miniport che supporta il segmento di ricezione (RSC) deve unire un segmento per una determinata connessione TCP. Se una delle regole viene violata, viene generata un'eccezione e il driver miniport deve interrompere l'unione del segmento.

Il driver miniport deve aggiornare le intestazioni IP e TCP per la singola unità di unione (SCU). Il driver miniport deve ricompilare i checksum TCP e IPv4 su SCU e concatenare il payload TCP.

Il primo dei due diagrammi di flusso seguenti descrive le regole per i segmenti di unione e l'aggiornamento delle intestazioni TCP. Questo diagramma di flusso si riferisce ai meccanismi per distinguere gli AK duplicati validi e gli aggiornamenti delle finestre. Il secondo diagramma di flusso descrive questi meccanismi.

Questi diagrammi di flusso vengono forniti come riferimento per comprendere le regole RSC. Un'implementazione hardware può ottimizzare il diagramma di flusso, purché venga mantenuta la correttezza.

I termini seguenti vengono usati nei diagrammi di flusso:

Termine Descrizione
SEG. SEQ Numero di sequenza del segmento in ingresso.
H.SEQ Numero di sequenza dell'SCU attualmente rilevato.
SEG. ACK Numero di riconoscimento del segmento in ingresso.
H.ACK Numero di riconoscimento della SCU attualmente rilevata.
SEG. WND Finestra pubblicizzata dal segmento in ingresso.
H.WND Finestra pubblicizzata dalla SCU attualmente rilevata.
SEG. LEN Lunghezza del payload TCP del segmento in ingresso.
H.LEN Lunghezza del payload TCP della SCU attualmente rilevata.
SEG. NXT Somma di SEG. SEQ e SEG. LEN.
H.NXT Somma di H.SEQ e H.LEN.
H.DupAckCount Numero di AK duplicati che sono stati uniti nell'SCU. Questo numero deve essere pari a zero.
SEG. Tsval Valore Timestamp nel segmento attualmente ricevuto. Il formato per questo valore è definito in RFC 1323.
H.Tsval Valore Timestamp nell'SCU attualmente rilevato.
SEG. TSecr Timestamp Echo Reply nel segmento attualmente ricevuto.
H.TSecr Timestamp Echo Reply nella SCU attualmente rilevata.

Diagramma di flusso che mostra le regole per i segmenti di unione e l'aggiornamento delle intestazioni TCP.

Diagramma di flusso che mostra i meccanismi per distinguere gli AK duplicati validi e gli aggiornamenti delle finestre.

I diagrammi di flusso mostrano che il driver miniport può unire segmenti con numeri ACK diversi. Tuttavia, il driver miniport deve rispettare le regole seguenti relative ai numeri ACK, come illustrato nel primo diagramma di flusso precedente:

  • Dopo aver eseguito il controllo del numero di sequenza, un ACK puro in ingresso può essere unione nell'SCU attualmente monitorato se soddisfa una o entrambe le condizioni seguenti:

    • H.ACK == SEG. ACK.

    • Il conteggio duplicate-ACK nel segmento coalesced monitorato è zero. In altre parole, H.DupAckCount == 0.

      In altre parole, qualsiasi ACK puro che non sia un ACK duplicato o un aggiornamento di finestra attiva un'eccezione e non deve essere unito. Tutti questi ACL puri devono essere indicati come singoli segmenti. Questa regola garantisce che RSC non influisca sul comportamento o sulle prestazioni degli algoritmi di controllo della congestione TCP di Windows.

  • Segmento di dati in ingresso (SEG. ACK == H.ACK) o un ACK a supporto di piggy in ingresso (SEG. ACK>H.ACK) può essere unito nell'SCU attualmente monitorato se vengono soddisfatte entrambe le condizioni seguenti:

    • Il segmento è contiguo all'SCU nello spazio della sequenza. In altre parole, SEG. SEQ == H.NXT.
    • Il conteggio duplicate-ACK nel segmento coalesced monitorato è zero. In altre parole, H.DupAckCount == 0.

Note aggiuntive sulla unione ACK duplicata

Comportamento ACK duplicato

Il driver miniport deve trattare un segmento ACK duplicato equivalente a un ACK puro e non unire. In questo caso, deve finalizzare l'SCU corrente (se presente) per l'indicazione e indicare il segmento ACK duplicato come segmento singolo. Poiché i client Windows usano i riconoscimenti selettivi (SACK) per impostazione predefinita, è probabile che un segmento ACK duplicato generi un'eccezione. Per un esempio, vedere Esempi di unione del segmento di ricezione . Se viene indicato un segmento con DupAckCount> 0, NDIS disabiliterà RSC nell'interfaccia.

Gestione di ACK duplicati durante il rilevamento di un SCU costituito da segmenti di dati

Quando si monitora una SCU con H.LEN> 0 (in altre parole, un segmento coalesced contenente dati), se arriva un ACK duplicato, il rilevamento SCU deve essere finalizzato come segue:

  1. È necessario tenere traccia di una nuova SCU, a partire dal duplicato ACK.

  2. DupAckCount per la nuova SCU deve essere impostato su zero.

  3. DupAckCount deve essere incrementato se vengono ricevuti altri AK duplicati.

In questo caso , DupAckCount sarà 1 minore del numero di AK duplicati. Lo stack host gestirà correttamente il conteggio.

Gestione di ACK duplicati durante il rilevamento di un SCU costituito da un ACK cumulativo puro

Quando si verifica un SCU costituito da un singolo ACK cumulativo puro (regole che vietano l'unione di più ACK pure), se un ACK duplicato arriva successivamente, il DupAckCount per l'SCU di rilevamento deve essere incrementato. Deve anche essere incrementato se vengono ricevuti altri AK duplicati. In questo caso , DupAckCount sarà uguale al numero di AK duplicati uniti.

Quando il primo segmento ricevuto in un DPC è un ACK duplicato

In questo caso, la scheda di interfaccia di rete non può determinare se il segmento ricevuto è un ACK duplicato, perché non mantiene alcuno stato. Il segmento deve quindi essere considerato come un ACK puro come segue:

  1. È necessario tenere traccia di una nuova SCU, a partire da questo segmento.

  2. DupAckCount per la nuova SCU deve essere impostato su zero.

  3. DupAckCount deve essere incrementato di 1 per ogni ACK duplicato aggiuntivo ricevuto.

In questo caso , DupAckCount sarà uguale a 1 minore del numero effettivo di AK duplicati. Lo stack host gestirà correttamente il conteggio.

Esenzione ACK duplicata

Il driver miniport può trattare un segmento ACK duplicato equivalente a un ACK puro e non unire. In questo caso, deve finalizzare l'SCU corrente (se presente) per l'indicazione e indicare il segmento ACK duplicato come segmento singolo. Poiché i client Windows usano SACK per impostazione predefinita, è probabile che un segmento ACK duplicato generi un'eccezione. Per un esempio, vedere Esempi di unione del segmento di ricezione. Questa esenzione non si applica ai segmenti di aggiornamento delle finestre.

Unione di segmenti con l'opzione Timestamp

L'opzione timestamp TCP è l'unica opzione che può essere legalmente unione. L'unione dei segmenti con questa opzione viene lasciata come decisione specifica dell'implementazione. Se il driver miniport aggiusta segmenti con l'opzione timestamp, deve seguire le regole descritte nel diagramma di flusso seguente:

Diagramma di flusso che descrive le regole per i segmenti di unione con l'opzione timestamp TCP.

Nota

Controllo SEG. TSval= H.TSval> deve essere eseguito usando l'aritmetica modulo-232 simile a quella usata per i numeri di sequenza TCP. Vedere RFC 793, sezione 3.3.

Quando si indica un segmento coalesced, le informazioni out-of-band seguenti devono essere indicate come segue impostando il membro NetBufferListInfo della struttura NET_BUFFER_LIST che descrive il segmento di unione:

  • Il numero di segmenti che sono stati raggruppati deve essere archiviato in NetBufferListInfo[TcpRecvSegCoalesceInfo]. Membro CoalescedSegCount . Questo numero rappresenta solo i segmenti di dati che sono stati uniti. Il raggruppamento pure ACK non è consentito e i segmenti di aggiornamento delle finestre non devono essere conteggiati come parte di questo campo.

  • Il conteggio ACK duplicato deve essere archiviato in NetBufferListInfo[TcpRecvSegCoalesceInfo]. Membro DupAckCount . Il primo diagramma di flusso precedente spiega come viene calcolato questo valore.

  • Quando i segmenti con l'opzione timestamp TCP sono uniti, NetBufferListInfo[RscTcpTimestampDelta] devono essere riempiti con il delta assoluto tra il più recente e il valore di timestamp TCP più recente visto nella sequenza di segmenti di carbone che comprendono la SCU. La SCU stessa deve contenere il valore di timestamp TCP più recente visualizzato nella sequenza di segmenti di carbone.

I membri DupAckCount e RscTcpTimestampDelta vengono interpretati se e solo se il membro CoalescedSegCount è maggiore di zero. Se l'oggetto CoalescedSegCount è zero, il segmento viene considerato come un segmento non a carbone non RSC.

Per informazioni sul contenuto del membro NetBufferListInfo , vedere NDIS_NET_BUFFER_LIST_INFO e NDIS_RSC_NBL_INFO.

Il bit PSH deve essere ORed per tutti i segmenti di carbone. In altre parole, se il bit PSH è stato impostato in uno dei singoli segmenti, il driver miniport deve impostare il bit PSH nella SCU.

La finalizzazione di un'SCU prevede:

Gestione dei segmenti IPsec TCP/IP

Una scheda di rete può segnalare funzionalità di offload delle attività RSC e IPsec. Vedere Determinazione delle funzionalità RSC di una scheda di rete. Tuttavia, se supporta l'offload dell'attività IPsec, non deve tentare di unire i segmenti protetti da IPsec.