Transportschicht – ausführliche Erläuterung des TCP-Prinzips

Inhaltsverzeichnis

Vorwort

1. TCP-Protokoll

2.TCP-Protokollsegmentformat

3. So entpacken und teilen Sie es

4. Die Beziehung zwischen Netzwerkprotokollstapel und Dateien

5. So verstehen Sie den TCP-Header

6. Eigenschaften von TCP

7.TCP-Feld

7.1 16-Bit-Fenstergröße

7.2 Flag-Bit

8. Timeout-Neuübertragung

9. Verbindungsverwaltungsmechanismus

10. Schiebefenster

11. Staukontrolle

12.Verzögerte Reaktion

13. Huckepack-Antwort

14. Verstehen Sie den byteorientierten Stream von TCP

15. Problem mit klebrigen Beuteln

16.TCP-Ausnahme

17.TCP-Zusammenfassung

18.TCP/UDP-Vergleich

19. So erreichen Sie mit UDP eine zuverlässige Übertragung

20. Verstehen Sie den zweiten Parameter von Listen

Zusammenfassen


Vorwort

       Im vorherigen Artikel haben wir vorgestellt, wie UDP implementiert wird. Heute stellen wir TCP vor. In Bezug auf das TCP-Protokoll haben wir zuvor gesagt, dass es zuverlässig ist. Heute werfen wir einen Blick darauf, warum das TCP-Protokoll zuverlässig ist. Über welche Strategien dienen der zuverlässigen Umsetzung.

1. TCP-Protokoll

TCP steht für „Transmission Control Protocol“. Wie der Name schon sagt, erfordert es eine detaillierte Kontrolle der Datenübertragung;

Wenn die Daten in die Transportschicht kopiert werden, verfügt das Betriebssystem über eine eigene Übertragungsstrategie, wenn die Daten weiterhin nach unten übertragen werden. Daher wird das TCP-Protokoll als Übertragungssteuerungsprotokoll bezeichnet. Das TCP-Protokoll verfügt sowohl über einen Sendepuffer als auch über einen Empfangspuffer , TCP ist also Vollduplex

wie das Bild zeigt:

2.TCP-Protokollsegmentformat

a. Der TCP-Protokoll-Header hat eine Standardlänge von 20 Bytes. Lesen Sie beim Lesen zuerst 20 Bytes.

b. Konvertieren Sie in strukturierte Daten, extrahieren Sie die vierstellige Headerlänge des Standardheaders und vereinbaren Sie, dass die Gesamtlänge der TCP-Nachricht =

4-stellige Header-Länge * 4 Byte [0,60], wenn unser Header 20 Byte groß ist, dann sollte die 4-stellige Header-Länge mit 5 x * 4 Byte = 20 x = 5 ausgefüllt werden [0101] 

c. Ermitteln Sie die verbleibende Größe des nachfolgenden Headers: x*4 - 20 = 0; x * 4 - 20 = n;

d. Solange der Header verarbeitet wird, ist der Rest die Nutzlast

3. So entpacken und teilen Sie es

Auspacken: Wie oben beschrieben auspacken

Dezentralisierung: Anhand der Zielportnummer im Header kann der Prozess der Anwendungsschicht gefunden und die Daten nach oben übermittelt werden.

4. Die Beziehung zwischen Netzwerkprotokollstapel und Dateien

wie das Bild zeigt:

5. So verstehen Sie den TCP-Header

Der Header ist eine Art strukturierte Daten auf Sprachebene:

struct tcp_ hdr
{
    uint32_t src_port:16;
    uint32_t dst_port:16;
    uint32_t seq;
    uint32_t ack_seq;
    uint32_t header_length:4;
    ....
};

6. Eigenschaften von TCP

Zuverlässigkeit und hohe Übertragungseffizienz

a. Zuverlässigkeit verstehen:
Warum Unzuverlässigkeit besteht: Der wesentliche Grund für die Unzuverlässigkeit bei der Netzwerkübertragung ist, dass die Übertragungsentfernung länger geworden ist.
Unzuverlässige Szenarien: Paketverlust, Störung, Überprüfungsfehler, Duplizierung ... ...
Wie stellt b.tcp sicher? Zuverlässigkeit:
Wahrnehmungsverständnis der Zuverlässigkeit
A- und B-Kommunikation:

Wird die Distanz größer, gibt es keine absolute Zuverlässigkeit, wohl aber eine relative Zuverlässigkeit.
So stellen Sie eine relative Zuverlässigkeit sicher:
Solange eine Nachricht eine Antwort erhält. Die Zuverlässigkeit der Nachricht kann garantiert werden!
TCP verwendet einen Bestätigungs-Antwort-Mechanismus, um die Zuverlässigkeit sicherzustellen. In der Kommunikation zwischen den beiden Parteien müssen die neuesten Nachrichten vorhanden sein. Wenn keine Antwort erfolgt, können die neuesten Nachrichten im Allgemeinen keine Zuverlässigkeit garantieren.

Verstehen Sie den Arbeitsmodus von TCP:

Um die Zuverlässigkeit sicherzustellen, ist eine Antwort erforderlich, sei es vom Client zum Server oder vom Server zum Client. Wenn die beiden Parteien kommunizieren, können sie zusätzlich zu den normalen Datensegmenten auch Bestätigungsdatensegmente enthalten.

Der eigentliche Arbeitsmodus von TCP:

Bei der Übertragung von TCP-Protokolldaten stimmt die Reihenfolge, in der sie die Gegenseite erreichen, nicht unbedingt mit der Reihenfolge überein, in der sie gesendet werden.
Um das obige Problem zu lösen: Es muss eine Möglichkeit geben, das Datensegment selbst zu identifizieren. Das Datensegment selbst wird durch die Seriennummer und die Bestätigungsseriennummer identifiziert.
Die Seriennummer und die Bestätigungsseriennummer verstehen:

Bestätigen Sie, dass die Seriennummer = Seriennummer + 1 und fortlaufend ist

Warum gibt es zwei Sätze von Sequenznummern: Da TCP Vollduplex ist, sendet der Client Nachrichten an den Server und der Server sendet Nachrichten an den Client

Echte Sequenznummer: Da die vom TCP-Protokoll übertragenen Daten bytestromorientiert sind, ist jedes Datenbyte nummeriert, dh die Sequenznummer.

Jede ACK trägt eine entsprechende Bestätigungssequenznummer, die dem Absender mitteilt, welche Daten ich erhalten habe und wohin er das nächste Mal mit dem Senden beginnen soll.

7.TCP-Feld

7.1 16-Bit-Fenstergröße

Wenn TCP Daten sendet, darf es weder schnell noch langsam sein. Wie kann sichergestellt werden, dass die richtigen Daten gesendet werden?
Lösung: Die 16-Bit-Fenstergröße ist im Wesentlichen ein Puffer. Wenn eine Partei Daten an die andere Partei sendet, wird die Größe des verbleibender Platz im Puffer im Header! Die Flusskontrolle während der Datenübertragung erfolgt über ein 16-Bit-Fenster

7.2 Flag-Bit

Der Server empfängt eine Vielzahl von Nachrichten, und der Empfänger muss je nach Nachricht unterschiedliche Aktionen ausführen. TCP-Nachrichten haben auch Typen, einige sind normale Datensegmente und einige sind Bestätigungsdatensegmente, je nach Flag-Bit. Machen Sie es anders Aktionen.

Klassifizierung der TCP-Nachrichtentypen: URG. ACK. PSH, RST, SYN, FIN


SYN: Wenn die Verbindung hergestellt ist, setzen Sie das Flag-Bit auf 1.
FIN: Wenn die Verbindung getrennt wird, setzen Sie das Flag-Bit auf 1.
ACK: Wenn die Nachricht vom Bestätigungstyp ist, setzen Sie das Flag-Bit auf 1.
PSH: Beim Empfang Wenn der Puffer der anderen Partei voll ist, fordert der Absender die empfangende Partei auf, die Daten so schnell wie möglich zu entfernen, diese Informationen mitzuteilen und das Flag auf 1 zu setzen

URG:


Für den Empfänger sind Daten außerhalb der Reihenfolge selbst ein Zeichen von Unzuverlässigkeit. Daher müssen die empfangenen Daten sortiert werden, um sicherzustellen, dass die Daten rechtzeitig ankommen! Wie wird sortiert? Verwenden Sie zum Sortieren die Seriennummernmethode. Nach dem Sortieren: Puffer A des Empfängers Zone ist eine Warteschlange.
Wenn es Daten gibt, die zu diesem Zeitpunkt in die Warteschlange springen möchten? Wenn es Daten gibt, die in die Warteschlange springen möchten, setzen Sie den URG im Datenpaket auf 1. Das Datenpaket
mit dem URG-Satz ist Blockiert durch den 16-Bit-Notfallzeiger. Identifiziert
einen 16-Bit-Notfallzeiger: den Offset in der Nutzlast.
Wie viele Bytes haben die Daten? Im TCP-Protokoll sind die Daten nur ein Byte.
Zu diesem Zeitpunkt können die Daten von der Anwendungsschicht gefunden und im Voraus gelesen werden. Implementierung Datenwarteschlangenspringen

Diese Art von Daten wird im Allgemeinen als Out-of-Band-Daten bezeichnet.
Verwendungsszenario: Ermitteln des Status des Servers.
Wie werden Out-of-Band-Daten auf der Anwendungsebene identifiziert?

发送方:
send .
ssize_t send(int sockfd, const void *buf, size_t len,int flags) ;
flags: MSG_ OOB
接受方: recv
ssize_t recv(int sockfd, void *buf, size_ t len,int flags) ;
flags: MSG_ OOB

RST:

Der Drei-Wege-Handshake stellt die Verbindung erfolgreich her. Auch wenn die Verbindung erfolgreich ist, kann es zu einseitigen Problemen während des Kommunikationsprozesses kommen.
Für einen Teilnehmer besteht die Verbindung noch. Für den Teilnehmer mit dem Problem besteht die Verbindung nicht mehr, ist aber da Für die Partei, die das Problem hat, stellt dies kein Problem dar. Wenn sie denkt, dass die Verbindung noch besteht, sendet sie Daten an die andere Partei. Wenn zu diesem Zeitpunkt die Daten an die Partei gesendet werden, die das Problem hat, erkennt die Partei, die das Problem hat, dies Die Verbindung wurde getrennt, es werden jedoch weiterhin Daten gesendet. Zu diesem Zeitpunkt wird das RST-Flag gesetzt. Auf 1 gesetzt, um die Wiederherstellung der Verbindung anzuzeigen

8. Timeout-Neuübertragung

So verstehen Sie den Paketverlust während der Datenübertragung:
Es gibt zwei Möglichkeiten für den Paketverlust:
1. Die Daten gehen beim Senden verloren.
2. Die vom Empfänger an den Absender gesendete Antwort geht verloren.
Das TCP-Protokoll ist für die beiden oben genannten Situationen angepasst. Die Strategie besteht in der Timeout-Neuübertragung.
Im zweiten Fall sendet der Absender zwei Kopien derselben Daten an den Empfänger. Zu diesem Zeitpunkt ist eine Deduplizierung erforderlich. Wie dedupliziert man? Sie können Sequenznummern zum Deduplizieren verwenden! Da es diese
gibt Die Möglichkeit einer erneuten Übermittlung führt dazu, dass die vom Absender übermittelten Daten nicht unmittelbar nach der Übermittlung entfernt werden.

 

So verstehen Sie die Zeitüberschreitung:
Die Zeitüberschreitung wird basierend auf den Netzwerkbedingungen bestimmt und ist ein gleitendes Zeitintervall!
Im Idealfall finden Sie im Allgemeinen eine Mindestzeit, um sicherzustellen, dass „die Bestätigungsantwort innerhalb dieser Zeit zurückgegeben werden muss“. Unter
Linux (BSDUnix (Das Gleiche gilt für Windows.) Die Zeitüberschreitung wird in Einheiten von 500 ms gesteuert und die Zeitüberschreitungszeit für jede erneute Übertragung ist ein ganzzahliges Vielfaches von 500 ms. Wenn Sie nach einer erneuten Übertragung immer noch keine Antwort erhalten, warten Sie 2*500 ms, bevor Sie erneut
übertragen . Übertragung
Wenn immer noch keine Antwort empfangen wird, warten Sie 4*500 ms auf eine erneute Übertragung. Und so weiter, exponentiell ansteigend. Wenn eine
bestimmte Anzahl von erneuten Übertragungen akkumuliert wird, geht TCP davon aus, dass eine Anomalie im Netzwerk oder auf dem gegenüberliegenden Host vorliegt, und erzwingt die Schließung die Verbindung.

9. Verbindungsverwaltungsmechanismus

Unter normalen Umständen erfordert TCP drei Handshakes zum Herstellen einer Verbindung und vier Wellen zum Trennen der Verbindung.

So verstehen Sie den Drei-Wege-Handshake:
Der Drei-Wege-Handshake ist eine angepasste Strategie zum Aufbau einer Verbindung im TCP-Protokoll. Der Drei-Wege-Handshake garantiert nicht unbedingt, dass die Verbindung erfolgreich ist! Ist
ein Handshake oder zwei Handshakes in Ordnung? „
Die Antwort lautet definitiv nicht, denn wenn Client und Server eine Verbindung herstellen, muss die Verbindung vom Betriebssystem verwaltet werden. Die Verwaltungsmethode wird zuerst beschrieben und dann organisiert.
Die Verwaltung muss Zeit und Platz kosten. Wenn ein Handshake oder zwei Handshakes die Verbindung erfolgreich herstellen können, kann der Server vom Client angegriffen werden. Dieser Angriff wird im Allgemeinen als SYN-Flood bezeichnet.

Merkmale des Drei-Wege-Handshakes:
a. Überprüfen Sie mit minimalen Kosten, ob der Vollduplex-Kommunikationskanal reibungslos funktioniert.
B. Der Drei-Wege-Handshake kann effektiv verhindern, dass ein einzelner Computer den Server angreift.
So verstehen Sie, dass TCP eingerichtet wird Eine Verbindung?
TCP stellt eine Verbindung her, weil es Zuverlässigkeit gewährleisten muss.
Wie kann die Zuverlässigkeit sichergestellt werden?
Das Strukturfeld stellt die Datenstrukturbasis der Zuverlässigkeit sicher. Der Drei-Wege-Handshake ist die Grundlage für die Erstellung der Verbindungsstruktur. Auf diese Weise wird die Zuverlässigkeit von TCP indirekt garantiert!

So verstehen Sie den Verbindungsaufbau mit mehr als drei Handshakes : Ein Verbindungsaufbau kann mit mehr als drei Handshakes erfolgen, verursacht aber unnötige Ressourcenverschwendung!
So verstehen Sie die Vier-Wege-Welle : Der Verbindungsabbau ist Sache beider Parteien und bedarf der Zustimmung beider Parteien.

Das sogenannte Nicht-Senden von Daten bedeutet hier, dass keine Benutzerdaten gesendet werden, was nicht bedeutet, dass es auf der untersten Ebene keine Interaktion von Verwaltungsnachrichten gibt.

Woher weiß TCP, dass die Daten gesendet wurden und die Verbindung getrennt werden muss?
Die Antwort lautet: TCP weiß es nicht, aber die obere Schicht ruft close (sock) auf. Das Schließen des Dateideskriptors zeigt an, dass die Daten übertragen wurden und Die Verbindung muss getrennt werden.

Der Status ändert sich, wenn viermal gewinkt wird:
Die Partei, die aktiv die Verbindung trennt, ist der Endzustand TIME_WAIT
; die Partei, die passiv die Verbindung trennt, ist der Endzustand CLOSE_WAIT. Die
beiden oben genannten Zustände haben nichts damit zu tun, ob die beiden Parteien Clients oder Server sind . , denn TCP ist ein Peer-to-Peer-Protokoll!


Wenn close_wait in großer Zahl auf dem Server auftritt:
1. Der Server hat einen Fehler und schließt den Dateideskriptor nicht.
2. Der Server steht unter Druck und hat möglicherweise Nachrichten an den Client gesendet, sodass keine Zeit zum Schließen blieb.

Vier Wink-Aktionen sind abgeschlossen, aber die Partei, die die Verbindung aktiv trennt, muss TIME_WAIT für einen bestimmten Zeitraum aufrechterhalten:
Warum? Wie lange dauert es normalerweise und warum?
Normalerweise sind zwei MSLs erforderlich, um in den GESCHLOSSEN-Zustand zurückzukehren!
Warum brauchen Sie? warten?
1 .Dies liegt daran, dass die letzte ACK-Antwort möglicherweise verloren geht. Sobald sie verloren geht, ist eine erneute Übertragung aufgrund einer Zeitüberschreitung erforderlich. Wenn keine solche Wartezeit vorhanden ist, kann die letzte ACK-Antwort verloren gehen. Ein Ende glaubt, dass die Verbindung nicht getrennt wurde und Sendet weiterhin. Information, es handelt sich hierbei um einen Fehler.
2. Wenn beide Parteien die Verbindung trennen, verbleiben immer noch Pakete im Netzwerk. Stellen Sie sicher, dass die verbleibenden Pakete verteilt werden.

So verstehen Sie MSL:
MSL ist die maximale Überlebenszeit von TCP-Paketen.
Sie können den Wert von ms1 über cat /proc/ sys/net/ ipv4/tcp_ fin_ timeout: 60 anzeigen.
So verstehen Sie den Grund, warum der Server manchmal sein kann neu gestartet, kann aber manchmal nicht neu gestartet werden. Bindungsfehler:
Wenn der Server aktiv die Verbindung trennt, befindet sich der Server im Status TIME_WAIT und die Bindung kann zu diesem Zeitpunkt nicht erfolgreich sein!

So lösen Sie dieses Problem: 

Verwenden Sie setsockopt(), um die Socket-Deskriptoroption SO_REUSEADDR auf 1 zu setzen, was bedeutet, dass mehrere Socket-Deskriptoren mit derselben Portnummer, aber unterschiedlichen IP-Adressen erstellt werden dürfen.

10. Schiebefenster

So verstehen Sie das Schiebefenster:
Erstens können Daten verloren gehen. Daher gibt es einen Timeout-Neuübertragungsmechanismus, der festlegt, dass die Daten nicht gelöscht werden, nachdem das sendende Ende die Daten gesendet hat, sondern im Sendepuffer gespeichert werden. und der Sendepuffer wird mit einer Geldstrafe belegt. Unterteilt in:

wie das Bild zeigt

Die erste Hälfte: wurde gesendet und hat eine Antwort erhalten
. Die Mitte: Schiebefenster -> wurde gesendet, aber es wurde keine Antwort empfangen!
Der hintere Teil: Die Daten wurden noch nicht gesendet.
Der letzte Teil: nur keine Daten Raum.

So denken Sie über Schiebefenster nach:

Wie wird die Fenstergröße zunächst eingestellt und wie wird sie in Zukunft geändert?
win_ start = 0; win_ end = win_ start + tcp_ win -> Egal wie es sich in Zukunft bewegt, es muss sichergestellt werden, dass die andere Partei Kann es normal akzeptieren! Also die Größe des Startschiebefensters = die andere Partei informiert Wird das Größenfenster meiner eigenen Akzeptanzkapazität
nach links verschoben? Wird es definitiv nach rechts verschoben?
Die Antwort ist nicht nach links. Es
kann nach links verschoben werden rechts, oder es kann unverändert bleiben. Bleibt
das Schiebefenster gleich? Es wird größer. Wird es kleiner? Was ist die Grundlage für die Änderung?
Die Antwort ist, dass das Schiebefenster möglicherweise unverändert bleibt, es kann größer werden , oder es kann kleiner werden. Die Grundlage für die Änderung basiert auf der Größe des Puffers, den die andere Partei akzeptieren kann!
Was soll ich bei der Bestätigung der Antwort tun, wenn es sich nicht um die Bestätigung der auf der anderen Seite gesendeten Nachricht handelt? links, aber die Mitte und das Ende?
Wenn die Bestätigung der Antwort nicht empfangen wird, bedeutet dies, dass
das Paket verloren geht: Es gibt zwei Fälle von Verlust:
1. Die Daten gehen nicht verloren, aber die Antwort geht verloren.
2. Die Daten gehen wirklich verloren.
Für den ersten Fall: Da die Definition der Bestätigungssequenznummer ACK seq X + 1 ist, bedeutet dies, dass alle Daten vor X + 1 empfangen wurden win_start+X+1 Für die zweite Situation
: Die Daten gehen wirklich verloren, die zurückgegebene Bestätigungssequenznummer ist immer noch die vorherige Bestätigungssequenznummer. Es wird festgelegt, dass drei aufeinanderfolgende Bestätigungssequenznummern mit derselben Sequenznummer den Neuübertragungsmechanismus auslösen, um rückwärts zu rutschen. Was soll ich tun, wenn dies nicht der Fall ist
? genug Platz? 

Der Sendepuffer ist als Ringstruktur im Kernel aufgebaut

11. Staukontrolle

So verstehen Sie Staukontrolle:

Wenn der Client eine Nachricht an den Server sendet, besteht möglicherweise das Problem, dass 1 bis 2 Nachrichten verloren gehen. Zu diesem Zeitpunkt kann der Neuübertragungsmechanismus zum erneuten Senden verwendet werden. Wenn der Client jedoch 1000 Nachrichten an den Server sendet, gehen 999 verloren .Nachricht, zu diesem Zeitpunkt liegt möglicherweise ein Problem mit dem Netzwerk vor. Da ein Problem mit dem Netzwerk vorliegt, kann der Timeout-Neuübertragungsmechanismus nicht zum Übertragen einer großen Anzahl von Nachrichten an das Netzwerk verwendet werden. Nach der Übertragung kann es zu einem Netzwerkproblem kommen schwerwiegender werden. Verwenden Sie daher bei Netzwerkproblemen Lösungen zur Überlastungskontrolle!

Der Mechanismus der Staukontrolle:

TCP führt einen langsamen Startmechanismus ein, um zunächst eine kleine Datenmenge zu senden, den Pfad zu erkunden, den aktuellen Netzwerküberlastungsstatus herauszufinden und dann zu entscheiden, mit welcher Geschwindigkeit die Daten übertragen werden sollen.

Transport im exponentiellen Wachstumsmodus

Wenn der Client Daten an den Server sendet, verfügt der Client über ein Schiebefenster. Beim Senden von Daten werden diese durch das Netzwerk geleitet und die Fähigkeit des Netzwerks ermittelt, Daten zu akzeptieren. Verwenden Sie das Überlastungsfenster. Die Eigenschaften des Überlastungsfensters: 1. Wenn die Übertragung beginnt
,
definieren Sie die Größe des Überlastungsfensters auf 1
2. Jedes Mal, wenn eine ACK-Antwort empfangen wird, beträgt das Überlastungsfenster +1
3. Jedes Mal, wenn ein Datenpaket gesendet wird, wird das Überlastungsfenster mit der von zurückgemeldeten Fenstergröße verglichen Der empfangende Host, und der kleinere Wert wird als tatsächlich verwendet. Die Größe des sendenden Fensters -> Schiebefenster = min (unterstützendes Fenster, Fenstergröße (Akzeptanzfähigkeit des Servers))

Die Wachstumsrate des Überlastungsfensters ist exponentiell:
Langsamer Start bedeutet, dass es zunächst langsam ist, aber die Wachstumsrate ist sehr schnell, sodass das Überlastungsfenster aus Kontrollgründen nicht einfach exponentiell wachsen kann. Die verwendete Methode: Verwenden Sie einen Schwellenwert als Wenn das
Überlastungsfenster diesen Schwellenwert überschreitet, wächst es nicht mehr exponentiell, sondern linear!

Wenn TCP zu starten beginnt, entspricht der Schwellenwert für den langsamen Start dem Maximalwert des Fensters.
Bei jedem Timeout und jeder erneuten Übertragung wird der Schwellenwert für den langsamen Start auf die Hälfte des ursprünglichen Werts reduziert und das Überlastungsfenster wird auf 1 zurückgesetzt.

Zusammenfassen:

Bei einem kleinen Paketverlust lösen wir lediglich eine Timeout-Neuübertragung aus. Bei einem großen Paketverlust denken wir, dass das Netzwerk überlastet ist.
Wenn die TCP-Kommunikation beginnt, erhöht sich der Netzwerkdurchsatz allmählich. Wenn das Netzwerk überlastet wird, erhöht sich der Durchsatz sofort verringern;
Überlastungskontrolle ist letztendlich eine Kompromisslösung, bei der das TCP-Protokoll Daten so schnell wie möglich an die andere Partei übertragen möchte, aber vermeiden möchte, zu viel Druck auf das Netzwerk auszuüben.

12.Verzögerte Reaktion

Der Zweck der verzögerten Reaktion besteht darin, die Übertragungseffizienz so weit wie möglich zu verbessern, ohne eine Netzwerküberlastung zu berücksichtigen.
So verstehen Sie die verzögerte Reaktion:

Der Kern der verzögerten Antwort besteht darin, dass beim Empfang einer Nachricht nicht sofort, sondern erst nach einem bestimmten Zeitintervall geantwortet wird. Der Zweck dieser Methode besteht darin, dass die obere Schicht den Puffer während dieses Zeitintervalls entfernen kann. Daten, wenn geantwortet wird Informieren Sie den Client dieses Mal darüber, dass der Empfangspuffer auf der Serverseite größer geworden ist, und sendet dann mehr Daten, um die Effizienz der Datenübertragung zu verbessern!

Zum Beispiel:

Angenommen, der Puffer am Empfangsende ist 1 MB groß. Es werden 500 KB Daten gleichzeitig empfangen. Wenn die Antwort sofort erfolgt, beträgt das zurückgegebene Fenster 500 KB. Tatsächlich kann die Verarbeitungsgeschwindigkeit
am Verarbeitungsende jedoch sehr hoch sein und 500 KB Daten umfassen wird innerhalb von 10 ms aus dem Puffer verbraucht. ;
In diesem Fall stößt die Verarbeitung des Empfängers noch lange nicht an ihre Grenzen. Selbst wenn das Fenster vergrößert wird, kann es noch verarbeitet werden; wenn der Empfänger beispielsweise eine Weile wartet, bevor er antwortet ,
wartet 200 ms, bevor es antwortet, und wird dann zu diesem Zeitpunkt zurückgegeben. Die Fenstergröße beträgt 1 MB;

Kann auf alle Pakete verzögert reagiert werden? 
Mengenbegrenzung: einmal alle N Pakete antworten;
Zeitlimit: einmal antworten, wenn die maximale Verzögerungszeit überschritten wird;
die spezifische Anzahl und Timeout-Zeit variieren je nach Betriebssystem; im Allgemeinen ist N 2 , die Timeout-Zeit beträgt 200 ms;

Wie verstehen wir, dass wir durch eine einmalige Antwort auf jeweils n Pakete sicherstellen können, dass der Server die Daten empfangen hat?
Der Grund: Dies wird durch die Eigenschaften der Bestätigungssequenznummer bestimmt.
Der Empfang der aktuellen Bestätigungssequenznummer bedeutet, dass alle vorherigen Der Inhalt wurde empfangen!

13. Huckepack-Antwort

Der Client sendet Daten an den Server. Nachdem der Server die Daten empfangen hat, sendet er auch Daten an den Client. Beim Senden der Daten wird die Antwort auf die vom Client zuletzt gesendeten Daten gesendet. Zu diesem Zeitpunkt diese Antwort Die Methode heißt „Huckepack auf Antworten“ und verbessert die Effizienz der Datenübertragung erheblich!

14. Verstehen Sie den byteorientierten Stream von TCP

Erstellen Sie einen TCP-Socket und erstellen Sie einen Sendepuffer und einen Empfangspuffer im Kernel.
Beim Aufruf von write werden die Daten zuerst in den Sendepuffer geschrieben.
Wenn die Anzahl der gesendeten Bytes zu groß ist, werden sie in mehrere A aufgeteilt Das TCP-Datenpaket wird gesendet.
Wenn die Anzahl der gesendeten Bytes zu gering ist, wird im Puffer gewartet, bis die Pufferlänge nahezu gleich ist, oder es wird zu einem anderen geeigneten Zeitpunkt gesendet. Beim
Empfangen von Daten werden die Daten ebenfalls gesendet Die Netzwerkkarte Das Programm erreicht den Empfangspuffer des Kernels.
Anschließend kann die Anwendung read aufrufen, um Daten aus dem Empfangspuffer abzurufen.


Aufgrund der Existenz des Puffers müssen die Lese- und Schreibvorgänge des TCP-Programms nicht nacheinander übereinstimmen. Beispiel:
Wenn Sie 100 Byte Daten schreiben, können Sie write einmal aufrufen, um 100 Byte zu schreiben, oder Sie können write aufrufen 100 Mal, jedes Mal ein Wort schreiben. Abschnitt:
Beim Lesen von 100 Bytes an Daten muss nicht darüber nachgedacht werden, wie diese geschrieben werden sollen. Sie können jeweils 100 Bytes lesen oder jeweils ein Byte lesen und dies 100 Mal wiederholen.

15. Problem mit klebrigen Beuteln

Zunächst müssen wir klarstellen, dass sich das „Paket“ im Sticky-Problem auf das Datenpaket der Anwendungsschicht bezieht.
Im Protokollheader von TCP gibt es kein Feld wie „Nachrichtenlänge“ wie UDP, aber ein Feld B. die Sequenznummer.
Aus Sicht der Transportschicht kommen TCP-Pakete einzeln an. Sie werden in der Reihenfolge entsprechend der Sequenznummer im Puffer abgelegt. Aus Sicht
eine Reihe von Paketen Kontinuierliche Bytedaten.
Dann das Anwendungsprogramm Nachdem ich eine solche Reihe von Bytedaten gesehen habe, weiß ich nicht, welcher Teil von welchem ​​Teil beginnt und welcher Teil ein vollständiges Datenpaket der Anwendungsschicht ist.

Wie kann man also das Problem der Sticky-Pakete vermeiden? Die Quintessenz besteht darin, die Grenze zwischen den beiden Paketen zu klären. Stellen Sie
bei Paketen mit fester Länge sicher, dass sie jedes Mal mit einer festen Größe gelesen werden. 
Bei Paketen mit variabler Länge können Sie dies angeben Vereinbaren Sie im Header des Pakets Position ein Feld mit der Gesamtlänge des Paket-Headers, damit Sie die Endposition des Pakets kennen;
für Pakete variabler Länge können Sie auch klare Trennzeichen zwischen Paketen verwenden (Anwendungsschicht). Protokoll wird vom Programmierer selbst bestimmt, solange das Trennzeichen nicht mit dem Text in Konflikt steht);

Gibt es für das UDP-Protokoll auch ein „Sticky-Packet-Problem“?
Wenn für UDP die obere Schicht die Daten noch nicht geliefert hat, ist die UDP-Nachrichtenlänge immer noch vorhanden. Gleichzeitig liefert UDP die Daten an die Anwendungsschicht Eins nach dem anderen. Es gibt viele Klare Datengrenzen.
Aus Sicht der Anwendungsschicht erhalten Sie bei Verwendung von UDP entweder eine vollständige UDP-Nachricht oder nicht. Es wird keine „halbe“ Situation geben.

16.TCP-Ausnahme

Prozessbeendigung: Durch die Prozessbeendigung wird der Dateideskriptor freigegeben und FIN kann weiterhin gesendet werden. Es gibt keinen Unterschied zum normalen Herunterfahren. Maschinenneustart:
Gleiche Situation wie bei der Prozessbeendigung.
Stromausfall der Maschine/Trennung des Netzwerkkabels: Das empfangende Ende geht davon aus, dass die Verbindung besteht ist nach dem Empfang immer noch da. Wenn am Ende eine Schreiboperation stattfindet und die empfangende Seite feststellt, dass die Verbindung nicht mehr besteht, wird sie zurückgesetzt. Auch wenn keine Schreiboperation erfolgt, verfügt TCP selbst über eine integrierte Aufbewahrungsfunktion. Alive-Timer, der regelmäßig fragt, ob die andere Partei noch da ist. Wenn die andere Partei nicht da ist, wird auch die Verbindung freigegeben. Darüber hinaus verfügen
einige Protokolle auf der Anwendungsebene auch über solche Erkennungsmechanismen, beispielsweise in HTTP Bei langen Verbindungen wird der Status der anderen Partei regelmäßig erkannt. Beispielsweise versucht QQ auch regelmäßig, die Verbindung wiederherzustellen, nachdem QQ getrennt wurde.

17.TCP-Zusammenfassung

Zuverlässigkeitsgarantie:
Prüfsumme, Sequenznummer, Bestätigung, Timeout-Neuübertragung, Verbindungsmanagement, Flusskontrolle, Überlastungskontrolle.
Leistungsverbesserung:
Schiebefenster, schnelle Neuübertragung, verzögerte Antwort, Huckepack-Antwort.
TCP-basiertes Protokoll der Anwendungsschicht:
HTTP
HTTPS
SSH
Telnet
FTP
SMTP

18.TCP/UDP-Vergleich

Wir haben gesagt, dass TCP eine zuverlässige Verbindung ist, also ist TCP definitiv besser als UDP? Die Vor- und Nachteile zwischen TCP und UDP können nicht einfach und absolut verglichen werden.

TCP wird für zuverlässige Übertragungen, Dateiübertragungen, wichtige Statusaktualisierungen und andere Szenarien verwendet.
UDP wird in Kommunikationsbereichen verwendet, die eine Hochgeschwindigkeitsübertragung und Echtzeitleistung erfordern, wie z. B. frühe QQ, Videoübertragung usw. Darüber hinaus wird UDP verwendet kann für die Ausstrahlung verwendet werden;

Letztlich sind TCP und UDP beides Werkzeuge für Programmierer. Wann und wie sie eingesetzt werden, muss anhand spezifischer Bedarfsszenarien festgelegt werden.

19. So erreichen Sie mit UDP eine zuverlässige Übertragung

Beziehen Sie sich auf den Zuverlässigkeitsmechanismus von TCP, um eine ähnliche Logik auf der Anwendungsebene zu implementieren;
zum Beispiel:

Führen Sie Sequenznummern ein, um die Reihenfolge der Daten sicherzustellen;
führen Sie Bestätigungsantworten ein, um sicherzustellen, dass der Peer die Daten empfangen hat;
führen Sie eine Timeout-Neuübertragung ein, um die Daten erneut zu senden, wenn nach einer bestimmten Zeit keine Antwort erfolgt;

……

20. Verstehen Sie den zweiten Parameter von Listen

Lassen Sie mich ein Beispiel aus dem Leben geben:
Wenn beim Haidilao-Essen der Innenraum voll ist und weiterhin Kunden kommen, gibt es normalerweise draußen einen Tisch, an dem die Kunden sitzen und in der Schlange stehen können.
Das Wesentliche beim Anstehen ist: Wenn jemand nach dem Essen den Tisch verlässt, können die wartenden Kunden sofort Haidilao essen. Für den Chef verbessert sich die Auslastung des Tisches, was wiederum das Einkommen erhöht, das Warten in der Warteschlange jedoch nicht zu lange gut

Der zweite Parameter von Listen besteht im Wesentlichen darin, die Größe einer Warteschlange beizubehalten.
Wenn der Client eine Anforderung zum Herstellen einer Verbindung an den Server sendet und die aktuelle Anzahl von Verbindungen voll ist, wird der Client, der eine Verbindung anfordert, zur hinzugefügt Warteschlange. Die Größe der Warteschlange ist der zweite Parameter von Listen.
Überprüfung: Stellen Sie die Größe des zweiten Parameters von Listen auf 3 ein
. Starten Sie zu diesem Zeitpunkt drei Clients, um gleichzeitig eine Verbindung zum Server herzustellen. Verwenden Sie zur Überprüfung Netstat der Serverstatus. Alles ist normal.
Aber beim Starten des vierten Clients wird der Server gefunden. Es gibt ein Problem mit dem Status der vierten Verbindung

wie das Bild zeigt:

Der Client-Status ist normal, aber die Serverseite erscheint im SYN_RECV-Status statt im ESTABLISHED-Status.
Dies liegt daran, dass der Linux-Kernel-Protokollstapel zwei Warteschlangen für eine TCP-Verbindungsverwaltung verwendet:

1. Semi-Link-Warteschlange (wird zum Speichern von Anforderungen im SYN_SENT- und SYN_RECV-Status verwendet)
2. Vollverbindungswarteschlange (Accpetd-Warteschlange) (wird zum Speichern von Anforderungen im etablierten Status verwendet, die Anwendungsschicht hat jedoch nicht „accept“ aufgerufen)
und die vollständige -Verbindungswarteschlange Die Länge wird durch den zweiten Parameter von listen beeinflusst.
Wenn die vollständige Verbindungswarteschlange voll ist, kann der aktuelle Verbindungsstatus nicht weiter in den etablierten Zustand wechseln.
Die Länge dieser Warteschlange kann aus dem obigen Experiment ermittelt werden der zweite Parameter von listen + 1 . 

Zusammenfassen

Das Obige ist der gesamte Inhalt der TCP-Protokollimplementierung. Ich glaube, dass TCP nach dem Lesen des Vergleichs zwischen der Implementierung des UDP-Protokolls und der Implementierung des TCP-Protokolls einige Strategien übernommen hat, um Zuverlässigkeit zu erreichen. Vielen Dank dafür Lektüre. Das war's mit der heutigen Einleitung. , bis zum nächsten Mal!

Ich denke du magst

Origin blog.csdn.net/qq_65307907/article/details/132258431
Empfohlen
Rangfolge