[Computernetzwerk] Detaillierte Erklärung von Tcp

Vorwort

Wir haben früher etwas über das Transportschichtprotokoll Udp gelernt. Heute lernen wir etwas über Tcp. Tcp ist komplexer als Udp, aber zuverlässig. Viele Szenarien erfordern diese Zuverlässigkeit.

TCP-Protokollsegmentformat

Fügen Sie hier eine Bildbeschreibung ein

Allein aus Formatsicht ist Tcp viel komplexer als Udp. Wie sollten also Tcp-Header und Payloads getrennt werden?

Zuerst müssen die ersten 20 Bytes des Headers festgelegt werden. Wir extrahieren zuerst die ersten 20 Bytes und ermitteln die 4-stellige Header-Länge. Anschließend prüfen wir die
Header-Länge * 4 -20, um zu sehen, ob es Optionen gibt.
Schließlich lesen wir die Bytes der Optionen, der Rest sind Daten.

TCP-Zuverlässigkeit

Eine große Anzahl von Paketverlusten, Fehlern in der Reihenfolge, Duplikaten, Verifizierungsfehlern, langsamer Übertragung und Netzwerkausfällen sind Ausdruck von Unzuverlässigkeit. Gerade weil die Übertragungsentfernung länger wird, entstehen so viele Zuverlässigkeitsprobleme. Um diese zu lösen Probleme. TCP führte das Antwortsystem ein .

Wenn C ein Datenelement an S sendet, geht C erst dann davon aus, dass seine Daten an S gesendet wurden, wenn S auf C antwortet. Wenn die Antwort nach einer gewissen Zeit nicht empfangen wird, geht C davon aus, dass die Daten, die es gesendet hat, an S gesendet wurden wurde an S gesendet. Bei Verlust wird eine Timeout-Neuübertragung ausgelöst.

Um die Effizienz des Sendens zu verbessern, werden mehrere TCP-Nachrichten gleichzeitig übertragen, was dazu führt, dass die am anderen Ende ankommenden Daten nicht in der richtigen Reihenfolge sind. Nicht in der richtigen Reihenfolge ist genau das, was wir mit Zuverlässigkeit erreichen wollen, und das gilt auch für TCP-Nachrichten dazu bestimmt, nummeriert zu werden .

Byte-Stream-orientiert

Die Anwendungsschicht kopiert die Daten in den TCP-Sendepuffer und unterteilt den gesamten Sendepuffer in uint8-Einheiten. Daher ist der Sendepuffer natürlich nummeriert (Array-Index).

Reaktionsmechanismus

Wir wissen oben, dass TCP eine Antwort und eine Nummer erfordert. Die Antwort ist eigentlich eine TCP-Nachricht mit einem ACK-Feld, und die 32-Bit-Sequenznummer nennen wir die Nummer. Der Peer muss uns hierfür mit einer ACK antworten Sequenznummer.

Beispiel: Das C-Ende sendet eine 32-Bit-Nachricht mit der Sequenznummer 10 und das S-Ende sendet eine 32-Bit-Bestätigungsnachricht mit der Sequenznummer 11 zurück.

Sendesequenznummer: die Nummer der aktuellen Nachricht.
Bestätigungssequenznummer: Zeigt an, dass alle vorherigen Nachrichten empfangen wurden und ab dieser Sequenznummer gesendet werden sollen.

Da die Tcp-Nachricht über einen Huckepack-Antwortmechanismus verfügt, dh wenn S eine ACK sendet, enthält sie auch Informationen, die sie an C senden möchte. Daher muss sie als zwei unabhängige Felder konzipiert sein und kann nicht zusammen gemultiplext werden.

Timeout-Neuübertragung

Zwei Möglichkeiten für Datenverlust:
1. Die Daten gehen wirklich auf halbem Weg verloren.
2. Die Daten gehen nicht verloren, aber die ACK geht auf halbem Weg verloren.

Im ersten Fall müssen wir die Daten erneut übertragen, was erfordert, dass TCP die Daten vorübergehend speichern kann, um die erneute Übertragung zu unterstützen.
Im zweiten Fall können Sie auf andere ACKs verweisen, denn wenn nur das ACK verloren geht, ändern sich die Bestätigungssequenznummern anderer ACKs nicht.

Wartezeit: Jede Plattform ist anders. Unter Linux basiert sie auf 500 ms und wird dynamisch auf n*500-Art angepasst.

Ablaufsteuerung

TCP verfügt über einen Empfangspuffer und einen Sendepuffer, die ebenfalls Vollduplex sind, aber solange der Puffer eine Größe hat, stellen Sie sich dieses Szenario vor:

C sendet die Nachricht an S, aber der Empfangspuffer von S kann sie nicht aufnehmen. In diesem Fall kann S die verworfenen Pakete nur verwerfen, ohne zu antworten. Nach einer Weile wird C die Pakete erneut übertragen.

Wenn Sie genauer hinschauen, werden Sie feststellen, dass dies sehr ineffizient ist. Die Nachricht wird bis zum Gegenhost übertragen, aber verworfen, da die Gegenseite sie nicht empfangen kann. Um dieses Problem zu lösen, verfügen TCP-Nachrichten über ein Feld Dieses Feld wird als 16-Bit-Fenstergröße bezeichnet . Dieses Feld wird mit der Größe seines eigenen Empfangspuffers gefüllt. Wenn die andere Partei die Nachricht erhält, sieht sie diese Größe und passt die Geschwindigkeit und Größe der gesendeten Daten an (erhöht oder verringert). basierend auf dieser Größe.

Fenstererkennung:
Beide Enden senden regelmäßig TCP-Nachrichten ohne Daten an die andere Partei, um sich über die Empfangsfähigkeiten der anderen Partei zu erkundigen und die Geschwindigkeit und Größe der gesendeten Daten anzupassen (dieser Vorgang erfolgt in beide Richtungen).

Schiebefenster (wichtig)

Für das TCP-Protokoll ist die Zuverlässigkeit das Hauptforschungsthema, aber auch die Effizienz ist ein Thema, das TCP berücksichtigen muss.

Der Absender kann nur dann gleichzeitig senden, wenn die andere Partei es empfangen kann.

1. Allgemeine Situation
Fügen Sie hier eine Bildbeschreibung ein

Ein Sendepuffer wird durch ein Schiebefenster in drei Bereiche unterteilt.

Der Bereich links: Daten, die gesendet und bestätigt wurden – können überschrieben werden.
Der Bereich in der Mitte: kann direkt gesendet werden (Größenbeschränkung), aber es wurde keine Antwort empfangen.
Der Bereich rechts: der Datenbereich, der wurde noch nicht gesendet.

Die Größe des Schiebefensters sollte sich an der Empfangsfähigkeit der anderen Partei orientieren.

1.5. Wie man Schiebefenster versteht

Byte-Stream

2. Besondere Umstände

1. Das Schiebefenster kann nur nach rechts verschoben werden, da die Daten auf der linken Seite keine Bedeutung haben.

2. Das Wesentliche beim Vergrößern oder Verkleinern ist die Anpassung des Winends, das von der Fenstergröße der anderen Partei abhängt. Das Schiebefenster schwebt.

3. Es wird 0, was darauf hinweist, dass die andere Partei keine Daten empfangen kann (Fenstererkennung und Fensterbenachrichtigung durchführen).

4. Antworten müssen ebenfalls in der richtigen Reihenfolge eintreffen.
Antwortnummer: winstart = seq;
Größe des Antwortfensters: winend = winstart + win;

5. Verlustproblem

a. Der erste ist verloren.
Erneut übertragen und erneut ausstellen.

b. Das mittlere ist verloren.
Wischen Sie nach rechts und es wird zum ersten.

c. Wenn das letzte verloren geht,
wird es auch das ganz linke.

Schnelle Neuübertragung: (Hochgeschwindigkeits-Neuübertragung)
Wenn eine Nachricht verloren geht und drei identische Bestätigungen hintereinander empfangen werden, wird sie sofort erneut übertragen.

Die untere Grenze der Neuübertragung: Timeout-Neuübertragung.
Die Obergrenze der Neuübertragung: schnelle Neuübertragung

Staukontrolle

Wenn es ein Problem mit dem Netzwerk gibt, implementiert TCP auch die Richtlinienkontrolle.

Auch der Paketverlust ist derselbe, und es gibt einen Unterschied zwischen weniger Verlust und mehr Verlust. Wenn der Paketverlust anhält, handelt es sich um ein Netzwerkproblem.

Wenn eine große Anzahl von Paketen verloren geht, besteht die Sendestrategie des Absenders darin, zu warten und erneut zu senden! !

Wenn das Netzwerk lahmgelegt ist, übertragen alle Hosts erneut, was die Wiederherstellung des lahmgelegten Netzwerks erschwert. Daher besteht unsere Strategie darin, die Übertragungsmenge zu reduzieren, wenn eine Netzwerküberlastung festgestellt wird. Generell müssen folgende zwei Voraussetzungen erfüllt sein:

1. Stellen Sie sicher, dass die Netzwerküberlastung nicht zunimmt.
2. Wenn sich die Netzwerkwiederherstellung verbessert, stellen Sie die Netzwerkkommunikation so schnell wie möglich wieder her.

TCP führt einen langsamen Startmechanismus ein :

Wenn eine Netzwerküberlastung auftritt, muss der Absender grundsätzlich den Schweregrad der Netzwerküberlastung kennen und den Netzwerkstatus erkennen.

Überlastungsfenster.
Netzwerkbedingungen müssen gemessen werden – Überlastungsfenster

Der Netzwerkstatus ändert sich von Zeit zu Zeit. Um den Gesundheitszustand des Netzwerks zu messen, muss sich die Größe des Überlastungsfensters ändern.

因此发送方的滑动窗口 = min(16位窗口大小,网络的拥塞窗口)

Die Wachstumsrate des Überlastungsfensters ist exponentiell. Langsamer Start bedeutet langsam in der frühen Phase und sehr schnell in der späteren Phase.

1. Es gibt einen Schwellenwert für den langsamen Start.
2. Wenn das Überlastungsfenster diesen Schwellenwert überschreitet, wächst es nicht mehr exponentiell, sondern linear.
3. Jedes Mal, wenn das Zeitlimit überschritten wird und die Übertragung erneut erfolgt, wird der Schwellenwert für den langsamen Start (ssthresh) halbiert des ursprünglichen Wertes. Gleichzeitig wird das Überlastungsfenster auf 1 gesetzt (multiplikativ reduziert)

verspätete Antwort

Eine ACK-Antwort wird sofort zurückgegeben und die zurückgegebene Fenstergröße kann kleiner sein.

Durch die Ankündigung einer größeren Gewinngröße an die andere Partei kann die andere Partei die Übertragungseffizienz mit größerer Wahrscheinlichkeit verbessern. Geben Sie der oberen Schicht mehr Zeit zum Lesen, lesen Sie in dieser Zeit so schnell wie möglich und lesen Sie mehr.

Huckepack-Antwort

ACK trampt.

Flag-Bit

  • Die Natur von Flaggen

Ein binäres Bit zur Identifizierung verschiedener Nachrichtentypen

  • Warum gibt es eine Flagge?

Verschiedene Flags bieten unterschiedliche Dienste.

Spezifische Flaggenposition

ACK: Bestätigungsantwortnachricht, kann Daten übertragen (Piggyback-Antwort)
SYN: Verbindungsanforderungsnachricht (Drei-Wege-Handshake)
FIN: Verbindungstrennungsnachricht (vier Wellen)
PSH: Fordern Sie die Anwendungsschicht der anderen Partei auf, die Pufferdaten so schnell wie möglich abzurufen Go ( 多路转接)
RST: Sagen Sie der anderen Partei, dass sie die Verbindung wiederherstellen soll (die Verbindung wurde zurückgesetzt)
​​URG: Ankunft in Ordnung, aber wir wollen uns einreihen? (Dringende Daten) 16-Bit-Dringlichkeitszeiger, Offset der dringenden Daten in der Nutzlast. Dringende Daten (Out-of-Band-Daten) umfassen nur ein Byte. (Stornierungsfall herunterladen) MSG_OOB-Option von recvfrom.

drei Händeschütteln

Fügen Sie hier eine Bildbeschreibung ein

  • 1. Was ist Verbindung?
    Innerhalb eines Betriebssystems müssen mehrere Verbindungen hergestellt werden, und das Betriebssystem muss diese Verbindungen verwalten.
    Die Aufrechterhaltung von Verbindungen ist kostspielig und muss CPU- und Speicherressourcen verbrauchen.

  • 2. Warum dreimal?
    Während des Drei-Wege-Handshake-Prozesses vervollständigen die Betriebssysteme beider Parteien den TCP unabhängig
    . Verbinden: Lösen Sie die Verbindung aus und warten Sie auf den Abschluss.
    Akzeptieren: Warten Sie, bis der Aufbau abgeschlossen ist, und stellen Sie die Verbindung her.

    Für den Client gilt die Verbindung als hergestellt, solange das letzte ACK gesendet wird.
    Für den Server verbraucht der Server erst nach Erhalt der letzten ACK Ressourcen zum Erstellen.

    Daher besteht der Kern des Drei-Wege-Handshakes darin, dass der Server die letzte ACK erhalten hat. Wenn kein ACK empfangen wird, stellen die beiden kognitive Inkonsistenzen fest. Zu diesem Zeitpunkt sendet der Client eine Nachricht an den Server und der Server antwortet mit einem RST, um die Verbindung zurückzusetzen.

    • Bei zwei Handshakes werden Ressourcen verschwendet, solange SYN + ACK ausgegeben wird. Ganz einfach SYN洪水攻击. Beachten Sie, dass TCP selbst keine Lösung von Sicherheitsproblemen in Betracht zieht, TCP jedoch keine Sicherheitslücken aufweisen darf! Daher müssen SYN-Überschwemmungen vermieden werden.
    • Bei mehr als 3 Handshakes kann das letzte ACK-Problem immer noch nicht gelöst werden. Handelt es sich um einen geraden Handshake, trägt der Server das Risiko für den letzten ACK und der Client das Risiko für die ungeraden Handshakes . Auf der Serverseite werden große Datenmengen gespeichert, und Ausnahmen sind unvermeidlich. Zwei oder sogar Handshakes sind jedoch unangemessen.
    • Die Vorteile des 3-Wege-Handshakes:
      1. Es gibt keine offensichtlichen Lücken. Wenn eine Ausnahme auftritt, werden die Kosten auf den Client übertragen.
      2. Überprüfen Sie, ob der Kommunikationskanal zwischen beiden Parteien reibungslos funktioniert. Dies sind die minimalen Kosten für die Überprüfung glatt (Vollduplex) (Empfangen und Senden)
  • 3. Statusänderung
    SYN_SENT:
    SYN_RCVD wird synchron gesendet:
    ESTABLiSH wird synchron empfangen: Aufbau abgeschlossen

viermal winken

Fügen Sie hier eine Bildbeschreibung ein
Viermaliges Winken ist für beide Parteien der minimale Aufwand, um einen Konsens über die Verbindung und Trennung zu erzielen! Beide Parteien müssen zustimmen (keiner von ihnen sendet eine Nachricht)!

Statusänderungen:

Wenn der Client beendet wird und der Server nicht close aufruft, wechselt der Server in den Status CLOSE_WAIT und der Server in den Status FIN_WAIT2.

Fügen Sie hier eine Bildbeschreibung ein

Nach einer Weile verschwindet FIN_WAIT2 des Clients und der Server befindet sich immer noch im Status CLOSE_WAIT. Schalten Sie daher serverseitig den Dateideskriptor aus!

Nach dem Aufruf von close wechselt der Server sofort in den Status LAST_ACK und sendet FIN an den Peer. Wenn der Peer geschlossen wurde, wird der Server auch nach mehreren erneuten Übertragungen die Verbindung trennen.

Die Partei, die die Verbindung aktiv trennt, muss in den Status TIME_WAIT wechseln. Wenn sie sofort neu starten möchte, schlägt dies fehl, da sich die zugrunde liegende Verbindung noch im Status TIME_WAIT befindet.

  • 1. Warum TIME_WAIT eingeben?

    Das TCP-Protokoll schreibt vor, dass die Partei, die aktiv die Verbindung trennt, zwei MSL-Zeiten warten muss (die maximale Zeit, die eine Nachricht im Netzwerk existieren kann).

    • 1. Lassen Sie die Pakete im Netzwerk so schnell wie möglich verschwinden, um Auswirkungen auf neue Verbindungen zu vermeiden.
    • 2. Stellen Sie sicher, dass die letzte Bestätigung von der anderen Partei empfangen wird. Wenn die andere Partei das letzte ACK nicht erhält, sendet sie eine weitere FIN.
  • 2. Wenn der Server nicht warten möchte

    //设置地址可以复用,令服务器立马重启
    setsockopt(int sockfd,int level,int optname,const void* optval,socklen_t optlen)
    参数:
    sockfd:套接字
    level:当前在哪一层(SOL_SOCKET)
    optname:(SO_REUSEADDR | SO_REUSEPORT)
    optval:1
    optlen:len
    

Problem mit klebrigen Beuteln

TCP verfügt nicht über das Nachrichtenlängenfeld in UDP. Wir kennen die Grenze zwischen den beiden Daten nicht. Dieses Problem ist das Packet-Sticking-Problem.

Lösung: Klären Sie die Grenze zwischen den beiden Paketen (durch die obere Ebene zu vervollständigen).

TCP-Ausnahmen

Prozessbeendigung/Maschinenneustart: Die Prozessbeendigung gibt den Dateideskriptor frei und sendet weiterhin FIN, genau wie beim normalen Herunterfahren (das Betriebssystem recycelt alle zugehörigen Ressourcen).

Die Maschine ist ausgeschaltet/das Netzwerkkabel ist nicht angeschlossen: Der Peer geht davon aus, dass die Verbindung noch besteht. Sobald der Empfänger einen Schreibvorgang durchführt und feststellt, dass die Verbindung nicht mehr besteht, wird er zurückgesetzt. Der Server sendet ein Keep-Alive Timer, und das sendende Ende kann auch zurückgesetzt werden.

Der zweite Parameter von listen

Setzen Sie den zweiten Parameter auf 1, um eine Verbindung zum Server herzustellen. Geben Sie nach einer bestimmten Ebene SYN_RECV ein, dh es können nur noch zwei Verbindungen hergestellt werden.

Das TCP-Protokoll muss eine vollständige Verbindungswarteschlange auf der untersten Ebene aufrechterhalten. Die maximale Länge beträgt: zweiter Parameter + 1

Es wird keine Verbindung zur halbverbundenen Warteschlange geben und die Zeit wird sehr diskontinuierlich sein.

Die vollständige Verbindungswarteschlange darf weder zu lang noch leer sein. Die Länge einer vollständigen Verbindung ist nicht die vom Server verarbeitete Länge, sondern ein „Warteschlangen“-Platz.

1. Es verbraucht zu viele Betriebssystemressourcen. Es ist besser, es auf dem Server zu verwenden.
2. Die Wartezeit am Ende ist zu lang.

おすすめ

転載: blog.csdn.net/m0_73209194/article/details/132276237
おすすめ