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. |
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:
È necessario tenere traccia di una nuova SCU, a partire dal duplicato ACK.
DupAckCount per la nuova SCU deve essere impostato su zero.
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:
È necessario tenere traccia di una nuova SCU, a partire da questo segmento.
DupAckCount per la nuova SCU deve essere impostato su zero.
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:
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:
Ricompilare il tcp e, se applicabile, il checksum IPv4.
Aggiornamento delle intestazioni IP, come descritto in Aggiornamento delle intestazioni IP per segmenti di carbone.
Impostando i bit ECN e i campi ECN nelle intestazioni TCP e IP agli stessi valori impostati nei singoli segmenti.
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.