Checksum TCP: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
 
(26 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
=Absender=
 +
*Man bildet aus den 16-Bit-Wörtern ein Einerkomplement.
 +
*Diese Wörter werden ohne Übertrag addiert.
 +
*Das Ergebnis wird wieder als Einerkomplement genommen.
 +
*Das resultierende Einerkomplement wird im Checksum-Feld eingetragen.
 +
=Empfänger=
 +
*Die 16-Bit-Wörter werden ein Einerkomplement genommen.
 +
*Diese Wörter werden ohne Übertrag addiert.
 +
*Das Ergebnis wird wieder als Einerkomplement genommen.
 +
*Das resultierende Einerkomplement wird mit dem im Header empfangenen Checksum verglichen.
 +
*Wenn sie stimmen werden die Daten an die oberen Schichten ausgeliefert
 +
=IPv4=
 
{|class="wikitable" style="text-align:center;
 
{|class="wikitable" style="text-align:center;
 
!colspan="32"|32 Bit
 
!colspan="32"|32 Bit
 
|-
 
|-
|colspan="32" style="width:100%;" |Source Address
+
!colspan="32" style="background-color:lightblue" |Pseudo TCP header
 
|-
 
|-
|colspan="32" style="width:10%;" |Destination Address
+
|colspan="32" style="width:100%;" style="background-color:salmon" |Source Address
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:khaki" |Destination Address
 +
|-
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="8" style="width:25%;"|Proto
 +
|colspan="16" style="width:50%;"|TCP-Length
 +
|-
 +
!colspan="32" style="background-color:lightgreen"|TCP Header
 +
|-
 +
|colspan="16" style="width:50%;" |Source Port
 +
|colspan="16" style="width:50%;" |Destination Port
 +
|-
 +
|colspan="32"|Sequence Number
 +
|-
 +
|colspan="32"|Acknowledge Number
 +
|-
 +
|colspan="4"|Offset
 +
|colspan="6"|Reserved
 +
|colspan="6"|Flags
 +
|colspan="16"|Window
 +
|-
 +
|colspan="16"|Checksum = 0000000000000000
 +
|colspan="16"|Urgent Pointer
 +
|-
 +
|colspan="10"|Options
 +
|colspan="22"|Paddings
 +
|-
 +
|colspan="32" style="background-color:yellow"|Data
 
|}
 
|}
  
=TCP Header=
+
=IPv6=
 
{|class="wikitable" style="text-align:center;
 
{|class="wikitable" style="text-align:center;
 
!colspan="32"|32 Bit
 
!colspan="32"|32 Bit
 +
|-
 +
!colspan="32" style="background-color:lightblue" |Pseudo TCP header
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:salmon" |Source Address
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:salmon" |Source Address
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:salmon" |Source Address
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:salmon" |Source Address
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:khaki" |Destination Address
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:khaki" |Destination Address
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:khaki" |Destination Address
 +
|-
 +
|colspan="32" style="width:100%;" style="background-color:khaki" |Destination Address
 +
|-
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="1"|0
 +
|colspan="8" style="width:25%;"|Proto
 +
|colspan="16" style="width:50%;"|TCP-Length
 +
|-
 +
!colspan="32" style="background-color:lightgreen"|TCP Header
 
|-
 
|-
 
|colspan="16" style="width:50%;" |Source Port
 
|colspan="16" style="width:50%;" |Source Port
Zeile 23: Zeile 101:
 
|colspan="16"|Window
 
|colspan="16"|Window
 
|-
 
|-
|colspan="16"|Checksum
+
|colspan="16"|Checksum = 0000000000000000
 
|colspan="16"|Urgent Pointer
 
|colspan="16"|Urgent Pointer
 
|-
 
|-
Zeile 31: Zeile 109:
 
|colspan="32" style="background-color:yellow"|Data
 
|colspan="32" style="background-color:yellow"|Data
 
|}
 
|}
 +
=Ausführliche Erklärung=
 +
*Wenn wir Daten von der Anwendung erhalten, werden sie in kleinere Datenabschnitte zerlegt, da die gesamten Daten aus der Anwendung nicht direkt über das Netzwerk an den Empfänger-Host gesendet werden können.
 +
 +
*Das Protokoll, das wir in der OSI-Schicht im Transportschicht verwenden, ist TCP. Nachdem die Daten aus der Anwendungsschicht in kleinere Teile zerlegt wurden, bilden diese Teile den Körper des TCP.
 +
 +
*Der TCP-Header variiert normalerweise von 20 Bytes (wenn keine Bits der Optionsfelder verwendet werden) bis zu 60 Bytes (wenn alle Bits des Optionsfelds verwendet werden).
 +
 +
*Er enthält Felder wie Quell- und Ziel-Portadressen, Dringlichkeitszeiger, Prüfsumme usw.
 +
 +
*Die Prüfsumme des TCP wird berechnet, indem der TCP-Header, der TCP-Körper und der Pseudo-IP-Header berücksichtigt werden.
 +
 +
*Nun stellt sich die Hauptfrage, wie die Prüfsumme auf den IP-Header angewendet werden kann, da IP in der Schicht unterhalb der Transportschicht ins Spiel kommt.
 +
 +
*In einfachen Worten bedeutet dies, dass wir uns in der Transportschicht befinden und das IP-Datenpaket in der Netzwerkschicht erstellt wird.
 +
 +
*Dann, wie können wir die Größe des IP-Headers aus der Transportschicht schätzen, da die Vermutung/Schätzung definitiv falsch wäre und somit kein Sinn darin bestünde, die Prüfsumme auf ein Feld zu berechnen, das von Anfang an falsch ist?
 +
 +
*Die Fehlerüberprüfungsfähigkeit von TCP/UDP in der Transportschicht erhält Unterstützung von der Netzwerkschicht für eine ordnungsgemäße Fehlererkennung.
 +
 +
*Die wichtige Konzeptanmerkung hier ist jedoch, dass wir tatsächlich nicht den IP-Header verwenden, sondern einen Teil des IP-Headers.
 +
 +
*Um all diese Fehler zu überwinden und die Fehlerüberprüfungsfähigkeit zu erhöhen, verwenden wir einen Pseudo-IP-Header.
 +
 +
;Pseudo-IP-Header:
 +
*Der Pseudo-Header ist kein IP-Header, sondern ein Teil des IP-Headers.
 +
*Wir verwenden den IP-Header nicht direkt, weil im IP-Header viele Felder enthalten sind, die sich ständig ändern, wenn die Pakete im Netzwerk bewegt werden.
 +
*Daher wird ein Teil des IP-Headers berücksichtigt, der sich nicht ändert, wenn das IP-Paket im Netzwerk bewegt wird.
 +
 +
;Die Felder des Pseudo-IP-Headers sind:
 +
 +
*IP der Quelle
 +
*IP des Ziels
 +
*TCP/UDP-Segmentlänge
 +
*Protokoll (Angabe des verwendeten Protokolltyps)
 +
*Fixierte 8 Bits
 +
 +
*Die Gesamtgröße des Pseudo-Headers (12 Bytes) = IP der Quelle (32 Bits) + IP des Ziels (32 Bits) + TCP/UDP-Segmentlänge (16 Bit) + Protokoll (8 Bit) + Fixierte 8 Bits.
 +
 +
;Ein wichtiges Konzept sollte beachtet werden:
 +
*Dieser Pseudo-Header wird in der Transportschicht erstellt, um die Berechnung durchzuführen, und nach Abschluss der Berechnung wird der Pseudo-Header verworfen.
 +
*Die Prüfsumme wird dann mit der üblichen Prüfsummenmethode berechnet.
 +
 +
;Die TCP-Prüfsumme umfasst also:
 +
 +
*Pseudo-IP-Header
 +
*TCP-Header
 +
*TCP-Körper
 +
 +
*Nach der Berechnung der Prüfsumme unter Verwendung dieser drei Felder wird das Prüfsummenresultat in das Prüfsummenfeld des TCP-Headers eingetragen.
 +
 +
*Da bereits festgestellt wurde, dass der Pseudo-Header verworfen wird und nicht an den Zielhost übertragen wird, stellt sich die Frage, wie der Zielhost überprüfen kann, ob die Daten korrekt empfangen wurden oder nicht.
 +
*Daher wird der Pseudo-Header erneut in der Transportschicht des Zielhosts erstellt, und dann wird die Prüfsumme in der Transportschicht des Zielhosts erneut berechnet.
 +
*Schließlich wird die Prüfsumme mithilfe der üblichen Prüfsummenmethode berechnet und überprüft, ob die empfangenen Daten korrekt sind oder nicht.
 +
 +
*Warum ist eine doppelte Überprüfung der IP-Headerfehler erforderlich?
 +
*Der IP-Header wird zweimal überprüft, das erste Mal in der Transportschicht und das zweite Mal in der Netzwerkschicht.
 +
*Die doppelte Überprüfung gewährleistet, dass Fehler im IP-Header mit ausreichender Genauigkeit erkannt werden können.

Aktuelle Version vom 31. Januar 2024, 07:49 Uhr

Absender

  • Man bildet aus den 16-Bit-Wörtern ein Einerkomplement.
  • Diese Wörter werden ohne Übertrag addiert.
  • Das Ergebnis wird wieder als Einerkomplement genommen.
  • Das resultierende Einerkomplement wird im Checksum-Feld eingetragen.

Empfänger

  • Die 16-Bit-Wörter werden ein Einerkomplement genommen.
  • Diese Wörter werden ohne Übertrag addiert.
  • Das Ergebnis wird wieder als Einerkomplement genommen.
  • Das resultierende Einerkomplement wird mit dem im Header empfangenen Checksum verglichen.
  • Wenn sie stimmen werden die Daten an die oberen Schichten ausgeliefert

IPv4

32 Bit
Pseudo TCP header
Source Address
Destination Address
0 0 0 0 0 0 0 0 Proto TCP-Length
TCP Header
Source Port Destination Port
Sequence Number
Acknowledge Number
Offset Reserved Flags Window
Checksum = 0000000000000000 Urgent Pointer
Options Paddings
Data

IPv6

32 Bit
Pseudo TCP header
Source Address
Source Address
Source Address
Source Address
Destination Address
Destination Address
Destination Address
Destination Address
0 0 0 0 0 0 0 0 Proto TCP-Length
TCP Header
Source Port Destination Port
Sequence Number
Acknowledge Number
Offset Reserved Flags Window
Checksum = 0000000000000000 Urgent Pointer
Options Paddings
Data

Ausführliche Erklärung

  • Wenn wir Daten von der Anwendung erhalten, werden sie in kleinere Datenabschnitte zerlegt, da die gesamten Daten aus der Anwendung nicht direkt über das Netzwerk an den Empfänger-Host gesendet werden können.
  • Das Protokoll, das wir in der OSI-Schicht im Transportschicht verwenden, ist TCP. Nachdem die Daten aus der Anwendungsschicht in kleinere Teile zerlegt wurden, bilden diese Teile den Körper des TCP.
  • Der TCP-Header variiert normalerweise von 20 Bytes (wenn keine Bits der Optionsfelder verwendet werden) bis zu 60 Bytes (wenn alle Bits des Optionsfelds verwendet werden).
  • Er enthält Felder wie Quell- und Ziel-Portadressen, Dringlichkeitszeiger, Prüfsumme usw.
  • Die Prüfsumme des TCP wird berechnet, indem der TCP-Header, der TCP-Körper und der Pseudo-IP-Header berücksichtigt werden.
  • Nun stellt sich die Hauptfrage, wie die Prüfsumme auf den IP-Header angewendet werden kann, da IP in der Schicht unterhalb der Transportschicht ins Spiel kommt.
  • In einfachen Worten bedeutet dies, dass wir uns in der Transportschicht befinden und das IP-Datenpaket in der Netzwerkschicht erstellt wird.
  • Dann, wie können wir die Größe des IP-Headers aus der Transportschicht schätzen, da die Vermutung/Schätzung definitiv falsch wäre und somit kein Sinn darin bestünde, die Prüfsumme auf ein Feld zu berechnen, das von Anfang an falsch ist?
  • Die Fehlerüberprüfungsfähigkeit von TCP/UDP in der Transportschicht erhält Unterstützung von der Netzwerkschicht für eine ordnungsgemäße Fehlererkennung.
  • Die wichtige Konzeptanmerkung hier ist jedoch, dass wir tatsächlich nicht den IP-Header verwenden, sondern einen Teil des IP-Headers.
  • Um all diese Fehler zu überwinden und die Fehlerüberprüfungsfähigkeit zu erhöhen, verwenden wir einen Pseudo-IP-Header.
Pseudo-IP-Header
  • Der Pseudo-Header ist kein IP-Header, sondern ein Teil des IP-Headers.
  • Wir verwenden den IP-Header nicht direkt, weil im IP-Header viele Felder enthalten sind, die sich ständig ändern, wenn die Pakete im Netzwerk bewegt werden.
  • Daher wird ein Teil des IP-Headers berücksichtigt, der sich nicht ändert, wenn das IP-Paket im Netzwerk bewegt wird.
Die Felder des Pseudo-IP-Headers sind
  • IP der Quelle
  • IP des Ziels
  • TCP/UDP-Segmentlänge
  • Protokoll (Angabe des verwendeten Protokolltyps)
  • Fixierte 8 Bits
  • Die Gesamtgröße des Pseudo-Headers (12 Bytes) = IP der Quelle (32 Bits) + IP des Ziels (32 Bits) + TCP/UDP-Segmentlänge (16 Bit) + Protokoll (8 Bit) + Fixierte 8 Bits.
Ein wichtiges Konzept sollte beachtet werden
  • Dieser Pseudo-Header wird in der Transportschicht erstellt, um die Berechnung durchzuführen, und nach Abschluss der Berechnung wird der Pseudo-Header verworfen.
  • Die Prüfsumme wird dann mit der üblichen Prüfsummenmethode berechnet.
Die TCP-Prüfsumme umfasst also
  • Pseudo-IP-Header
  • TCP-Header
  • TCP-Körper
  • Nach der Berechnung der Prüfsumme unter Verwendung dieser drei Felder wird das Prüfsummenresultat in das Prüfsummenfeld des TCP-Headers eingetragen.
  • Da bereits festgestellt wurde, dass der Pseudo-Header verworfen wird und nicht an den Zielhost übertragen wird, stellt sich die Frage, wie der Zielhost überprüfen kann, ob die Daten korrekt empfangen wurden oder nicht.
  • Daher wird der Pseudo-Header erneut in der Transportschicht des Zielhosts erstellt, und dann wird die Prüfsumme in der Transportschicht des Zielhosts erneut berechnet.
  • Schließlich wird die Prüfsumme mithilfe der üblichen Prüfsummenmethode berechnet und überprüft, ob die empfangenen Daten korrekt sind oder nicht.
  • Warum ist eine doppelte Überprüfung der IP-Headerfehler erforderlich?
  • Der IP-Header wird zweimal überprüft, das erste Mal in der Transportschicht und das zweite Mal in der Netzwerkschicht.
  • Die doppelte Überprüfung gewährleistet, dass Fehler im IP-Header mit ausreichender Genauigkeit erkannt werden können.