2. TCP Window Scale Option (TCP-Fensterskalierungsoption)
2. TCP Window Scale Option (TCP-Fensterskalierungsoption)
2.1 Introduction (Einführung)
Die Fensterskalierungserweiterung erweitert die Definition des TCP-Fensters auf 32 Bit und verwendet dann einen Skalierungsfaktor, um diesen 32-Bit-Wert im 16-Bit-Fensterfeld des TCP-Headers (SEG.WND in RFC-793) zu transportieren. Der Skalierungsfaktor wird in einer neuen TCP-Option, Window Scale, transportiert. Diese Option wird nur in einem SYN-Segment (einem Segment mit aktiviertem SYN-Bit) gesendet, daher ist die Fensterskalierung in jeder Richtung festgelegt, wenn eine Verbindung geöffnet wird. (Eine andere Designwahl wäre, die Fensterskalierung in jedem TCP-Segment anzugeben. Es wäre falsch, eine Fensterskalierungsoption nur dann zu senden, wenn sich der Skalierungsfaktor ändert, da eine TCP-Option in einem Bestätigungssegment nicht zuverlässig zugestellt wird (es sei denn, der ACK wird zufällig mit Daten in der anderen Richtung mitgeführt). Das Festlegen der Skalierung beim Öffnen der Verbindung hat den Vorteil eines geringeren Overheads, aber den Nachteil, dass der Skalierungsfaktor während der Verbindung nicht geändert werden kann.)
Das maximale Empfangsfenster und damit der Skalierungsfaktor wird durch den maximalen Empfangspufferspeicher bestimmt. In einer typischen modernen Implementierung wird dieser maximale Pufferspeicher standardmäßig festgelegt, kann aber von einem Benutzerprogramm überschrieben werden, bevor eine TCP-Verbindung geöffnet wird. Dies bestimmt den Skalierungsfaktor, und daher ist keine neue Benutzerschnittstelle für die Fensterskalierung erforderlich.
2.2 Window Scale Option (Fensterskalierungsoption)
Die drei Byte große Window Scale-Option kann von einem TCP in einem SYN-Segment gesendet werden. Sie hat zwei Zwecke: (1) anzuzeigen, dass das TCP bereit ist, sowohl Sende- als auch Empfangsfensterskalierung durchzuführen, und (2) einen Skalierungsfaktor zu kommunizieren, der auf sein Empfangsfenster angewendet werden soll. Daher sollte ein TCP, das bereit ist, Fenster zu skalieren, die Option senden, auch wenn sein eigener Skalierungsfaktor 1 ist. Der Skalierungsfaktor ist auf eine Zweierpotenz beschränkt und logarithmisch codiert, sodass er durch binäre Shift-Operationen implementiert werden kann.
TCP Window Scale Option (WSopt):
Kind: 3 Length: 3 bytes
+---------+---------+---------+
| Kind=3 |Length=3 |shift.cnt|
+---------+---------+---------+
Diese Option ist ein Angebot, kein Versprechen; beide Seiten müssen Window Scale-Optionen in ihren SYN-Segmenten senden, um die Fensterskalierung in beiden Richtungen zu aktivieren. Wenn die Fensterskalierung aktiviert ist, verschiebt das TCP, das diese Option gesendet hat, seine echten Empfangsfensterwerte um 'shift.cnt' Bits nach rechts für die Übertragung in SEG.WND. Der Wert 'shift.cnt' kann null sein (Angebot zur Skalierung, während ein Skalierungsfaktor von 1 auf das Empfangsfenster angewendet wird).
Diese Option kann in einem anfänglichen `<SYN>`-Segment gesendet werden (d.h. einem Segment mit aktiviertem SYN-Bit und deaktiviertem ACK-Bit). Sie kann auch in einem `<SYN,ACK>`-Segment gesendet werden, aber nur, wenn eine Window Scale-Option im anfänglichen `<SYN>`-Segment empfangen wurde. Eine Window Scale-Option in einem Segment ohne SYN-Bit sollte ignoriert werden.
Das Fensterfeld in einem SYN-Segment (d.h. einem `<SYN>`- oder `<SYN,ACK>`-Segment) selbst wird niemals skaliert.
2.3 Using the Window Scale Option (Verwendung der Fensterskalierungsoption)
Eine Modellimplementierung der Fensterskalierung ist wie folgt, unter Verwendung der Notation von RFC-793 [Postel81]:
-
Alle Fenster werden als 32-Bit-Größen für die Speicherung im Verbindungssteuerungsblock und für lokale Berechnungen behandelt. Dies schließt die Sendefensterwerte (SND.WND) und die Empfangsfensterwerte (RCV.WND) sowie das Congestion-Fenster ein.
-
Der Verbindungszustand wird durch zwei Fensterverschiebungszähler erweitert, Snd.Wind.Scale und Rcv.Wind.Scale, die jeweils auf die eingehenden und ausgehenden Fensterfelder angewendet werden sollen.
-
Wenn ein TCP ein `<SYN>`-Segment empfängt, das eine Window Scale-Option enthält, sendet es seine eigene Window Scale-Option im `<SYN,ACK>`-Segment.
-
Die Window Scale-Option wird mit shift.cnt = R gesendet, wobei R der Wert ist, den das TCP für sein Empfangsfenster verwenden möchte.
-
Beim Empfang eines SYN-Segments mit einer Window Scale-Option, die shift.cnt = S enthält, setzt ein TCP Snd.Wind.Scale auf S und setzt Rcv.Wind.Scale auf R; andernfalls setzt es sowohl Snd.Wind.Scale als auch Rcv.Wind.Scale auf null.
-
Das Fensterfeld (SEG.WND) im Header jedes eingehenden Segments, mit Ausnahme von SYN-Segmenten, wird um Snd.Wind.Scale Bits nach links verschoben, bevor SND.WND aktualisiert wird:
SND.WND = SEG.WND << Snd.Wind.Scale(unter der Annahme, dass die anderen Bedingungen von RFC793 erfüllt sind, und unter Verwendung der "C"-Notation "<<" für Linksverschiebung).
-
Das Fensterfeld (SEG.WND) jedes ausgehenden Segments, mit Ausnahme von SYN-Segmenten, wird um Rcv.Wind.Scale Bits nach rechts verschoben:
SEG.WND = RCV.WND >> Rcv.Wind.Scale.
TCP bestimmt, ob ein Datensegment "alt" oder "neu" ist, indem es testet, ob seine Sequenznummer innerhalb von 231 Bytes vom linken Rand des Fensters liegt, und wenn nicht, verwirft es die Daten als "alt". Um sicherzustellen, dass neue Daten niemals fälschlicherweise als alt angesehen werden und umgekehrt, muss der linke Rand des Senderfensters höchstens 231 vom rechten Rand des Empfängerfensters entfernt sein. Ähnlich verhält es sich mit dem rechten Rand des Senders und dem linken Rand des Empfängers. Da sich die rechten und linken Ränder des Sender- oder Empfängerfensters um die Fenstergröße unterscheiden und da die Sender- und Empfängerfenster höchstens um die Fenstergröße außer Phase sein können, bedeuten die obigen Einschränkungen, dass 2 * die maximale Fenstergröße kleiner als 2**31 sein muss, oder
max window < 2**30
Da das maximale Fenster 2S (wobei S die Skalierungsverschiebungszählung ist) mal höchstens 216 - 1 (das maximale unskalierte Fenster) ist, ist garantiert, dass das maximale Fenster < 230 ist, wenn S <= 14. Daher muss die Verschiebungszählung auf 14 begrenzt werden (was Fenster von 230 = 1 GByte ermöglicht). Wenn eine Window Scale-Option mit einem shift.cnt-Wert über 14 empfangen wird, sollte das TCP den Fehler protokollieren, aber 14 anstelle des angegebenen Werts verwenden.
Der Skalierungsfaktor gilt nur für das Fensterfeld, wie es im TCP-Header übertragen wird; jedes TCP, das erweiterte Fenster verwendet, wird die Fensterwerte lokal als 32-Bit-Zahlen pflegen. Zum Beispiel wird das "Congestion-Fenster", das durch Slow Start und Congestion Avoidance berechnet wird, nicht vom Skalierungsfaktor beeinflusst, sodass die Fensterskalierung keine Quantisierung in das Congestion-Fenster einführt.