Checksum TCP: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(→IPv4) |
(→IPv6) |
||
| (7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 12: | Zeile 12: | ||
=IPv4= | =IPv4= | ||
{|class="wikitable" style="text-align:center; | {|class="wikitable" style="text-align:center; | ||
| + | !colspan="32"|32 Bit | ||
| + | |- | ||
!colspan="32" style="background-color:lightblue" |Pseudo TCP header | !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: | + | |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 | ||
| + | |} | ||
| + | |||
| + | =IPv6= | ||
| + | {|class="wikitable" style="text-align:center; | ||
| + | !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 | ||
| Zeile 51: | 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.