Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa sezione definisce le regole che specificano quando un driver miniport compatibile con RSC deve coalescere 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à unita (SCU). Il driver miniport deve ricomputare i checksum TCP e IPv4 attraverso lo SCU e concatenare il payload TCP.
Il primo dei due diagrammi di flusso seguenti descrive le regole per il raggruppamento dei segmenti e l'aggiornamento delle intestazioni TCP. Questo diagramma di flusso si riferisce a meccanismi per distinguere gli ACL 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 monitorato. |
SEG. ACK | Numero di riconoscimento del segmento entrante. |
H.ACK | Numero di riconoscimento dell'SCU attualmente monitorata. |
SEG.WND | Finestra pubblicizzata dal segmento in arrivo. |
H.WND | La finestra annunciata dalla SCU attualmente monitorata. |
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 | La somma di H.SEQ e H.LEN. |
H.DupAckCount | Numero di ACK duplicati che sono stati aggregati nell'SCU. Questo numero deve essere zero. |
SEG. Tsval | Valore Timestamp nel segmento attualmente ricevuto. Il formato per questo valore viene definito in RFC 1323. |
H.Tsval | Valore Timestamp nel SCU attualmente rilevato. |
SEG.TSecr | Il 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 fuso con l'SCU attualmente monitorato se soddisfa una o entrambe le condizioni seguenti.
H.ACK == SEG.ACK.
Il conteggio dei duplicate-ACK nel segmento aggregato e monitorato è zero. In altre parole, H.DupAckCount == 0.
In altre parole, qualsiasi ACK puro che non è un ACK duplicato o un aggiornamento di finestra provoca un'eccezione e non deve essere accorpato. Tutti gli ACK 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.
Un segmento di dati in ingresso (SEG.ACK == H.ACK) o un ACK retroportato (SEG.ACK>H.ACK) possono essere uniti alla SCU attualmente tracciata se vengono soddisfatte entrambe le condizioni seguenti:
- Il segmento è contiguo all'SCU nello spazio sequenza. In altre parole, SEG. SEQ == H.NXT.
- Il conteggio degli ACK duplicati nel segmento unito monitorato è zero. In altre parole, H.DupAckCount == 0.
Note aggiuntive sulla unione di ACK duplicati
Comportamento ACK duplicato
Il driver miniport deve trattare un segmento ACK duplicato come equivalente a un ACK puro e non combinarlo. In questo caso, deve finalizzare l'SCU corrente (se presente) per l'indicazione ed evidenziare il segmento ACK duplicato come singolo segmento. Poiché i client Windows usano i riconoscimenti selettivi (SACK) per impostazione predefinita, un segmento ACK duplicato genererà probabilmente un'eccezione. Per un esempio, vedere esempi di di unione dei segmenti 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 costituita da segmenti di dati
Quando si monitora una SCU con H.LEN> 0 (in altre parole, un segmento aggregato che contiene dati), se arriva un ACK duplicato, il monitoraggio della SCU deve essere finalizzato nei modi seguenti:
È necessario tenere traccia di un nuovo SCU, a partire dal duplicato ACK.
Il DupAckCount per la nuova SCU deve essere impostato su zero.
Il DupAckCount deve essere incrementato se vengono ricevuti altri ACK duplicati.
In questo caso, DupAckCount sarà inferiore di 1 rispetto al numero di ACK duplicati. Lo stack host gestirà correttamente il conteggio.
Gestione di ACK duplicati durante il monitoraggio di una SCU costituita da un ACK puro e cumulativo
Quando si monitora una SCU costituita da un singolo ACK cumulativo puro (in base alle regole che vietano l'unione di più ACK puri), se arriva un ACK duplicato, il DupAckCount per la SCU monitorata deve essere incrementato. Deve essere incrementato anche se si ricevono ulteriori ACK duplicati. In questo caso, DupAckCount sarà uguale al numero di acknowledgement duplicati aggregati.
Quando il primo segmento ricevuto in un DPC è un ACK duplicato
In questo caso, la scheda di interfaccia di rete non è in grado di determinare se il segmento ricevuto è un ACK duplicato, perché non mantiene alcuno stato. Pertanto, il segmento deve essere considerato come un ACK puro come segue:
È necessario tenere traccia di un nuovo SCU, a partire da questo segmento.
Il DupAckCount per la nuova SCU deve essere impostato su zero.
Il DupAckCount deve essere incrementato di 1 per ogni ACK duplicato aggiuntivo ricevuto.
In questo caso, DupAckCount sarà uguale a 1 in meno rispetto al numero effettivo di ACK duplicati. Lo stack host gestirà correttamente il conteggio.
Esenzione ACK duplicata
Il driver miniport può trattare un segmento ACK duplicato come equivalente a un ACK puro e non aggregarlo. In questo caso, deve finalizzare l'SCU corrente (se presente) per l'indicazione e indicare il segmento ACK duplicato come singolo segmento. Poiché i client Windows usano SACK per impostazione predefinita, un segmento ACK duplicato genererà probabilmente un'eccezione. Per un esempio, vedere la sezione Esempi di coalescenza dei segmenti di ricezione. Questa esenzione non si applica ai segmenti di aggiornamento delle finestre.
Unione di segmenti con l'opzione del timestamp
L'opzione timestamp TCP è l'unica opzione che può essere validamente unita. L'unione di segmenti con questa opzione viene lasciata come decisione specifica dell'implementazione. Se il driver miniport unisce i segmenti con l'opzione di timestamp, deve seguire le regole descritte nel diagramma di flusso seguente.
Nota
Il controllo SEG.TSval>= H.TSval dev'essere eseguito usando un'aritmetica modulo-232 simile a quella utilizzata per i numeri di sequenza TCP. Vedere RFC 793, sezione 3.3.
Quando si indica un segmento coalesciuto, è necessario specificare le seguenti informazioni fuori banda impostando il membro NetBufferListInfo della struttura NET_BUFFER_LIST che descrive il segmento coalesciuto.
Il numero di segmenti raggruppati deve essere archiviato nel NetBufferListInfo[TcpRecvSegCoalesceInfo].membro CoalescedSegCount. Questo numero rappresenta solo i segmenti di dati uniti. L'unione ACK pura è vietata e i segmenti di aggiornamento delle finestre non devono essere conteggiati come parte di questo campo.
Il conteggio ACK duplicato deve essere archiviato nel NetBufferListInfo[TcpRecvSegCoalesceInfo].membro DupAckCount. Il primo diagramma di flusso precedente illustra come viene calcolato questo valore.
Quando i segmenti con l'opzione timestamp TCP vengono uniti, NetBufferListInfo[RscTcpTimestampDelta] deve essere riempito con il delta assoluto tra il valore di timestamp TCP più recente e quello più recente visualizzato nella sequenza di segmenti uniti che comprendono SCU. L'SCU deve contenere il valore di timestamp TCP più recente visualizzato nella sequenza di segmenti uniti.
I membri DupAckCount e RscTcpTimestampDelta vengono interpretati se e solo se il membro CoalescedSegCount è maggiore di zero. Se il CoalescedSegCount è zero, il segmento è considerato un segmento non coalescente 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 messo in OR per tutti i segmenti coalescenti. In altre parole, se il bit PSH è stato impostato in uno dei singoli segmenti, il driver miniport deve impostare il bit PSH nell'SCU.
La finalizzazione di una SCU comporta:
Ricalcolazione del tcp e, se applicabile, del checksum IPv4.
Aggiornamento delle intestazioni IP come descritto in Aggiornamento delle intestazioni IP per segmenti coalescenti.
Impostazione dei bit ECN e dei campi ECN nelle intestazioni TCP e IP con gli 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 Determinare le funzionalità RSC di una scheda di rete. Tuttavia, se supporta l'offload dei compiti IPsec, non deve tentare di aggregare segmenti protetti da IPsec.