2017-06-17 5 views
2

Ich lese ein Netzwerk Buch und von dem, was ich über das TCP-Protokoll gelesen habe, stellt es sicher, dass die Daten gesendet werden. Ich möchte etwas Code schreiben, um eine Dateiübertragung durchzuführen. Vor dem bekommen, die ich in den Python-Dokumente lesen auch diese Passage:kann TCP wirklich die Lieferung garantieren?

„Anwendungen sind dafür verantwortlich, dass alle Daten gesendet wurde, wenn nur ein Teil der Daten übertragen wurde, muss die Anwendung versuchen, Lieferung der restlichen Daten "

Dies scheint zu widersprechen, was ich im Netzwerkbuch gelesen habe. Der obige Abschnitt besagt, dass Anwendungen für die verlorenen Daten verantwortlich sind.

ich so sein Unverständnis kann ich ein paar Fragen stellen will:

1-Wenn ich, dass die Daten überprüfen, warum dann TCP gesendet werden?

2-Ich habe im Netzwerkbuch gelesen, dass TCP die Berechnungen durchführt, um sicherzustellen, dass die Daten vorhanden sind. Warum nutzt TCP dann keine Zeitverschwendung?

3- Die Python-Dokumente haben keine Puffergröße angegeben. Was ist die maximale Größe des zu sendenden Puffers?

4-Ich las im Netzwerkbuch, dass der Server die Menge der Daten erhöhen kann, die es senden kann, wenn es weiß, dass der Client es empfangen kann. kann dies die Größe des Puffers mehr als die maximale Anzahl ändern?

Hier mein Code Versuch ist so weit:

Server Code:

import socket 
s = socket.socket() 
host = socket.gethostname() 
port = 3000 
s.bind((host,port)) 
s.listen(1) 
c,addr = s.accept() 
with open("Filetosend","rb") as File: 
    data= File.read(1024) 
    while data: 
     c.send(data) 
     data = File.read(1024) 
s.close() 

Client-Code:

import socket 
s= socket.socket() 
host = socket.gethostname() 
port = 3000 
s.connect((host,port)) 
with open("Filetowrite","wb") as File: 
    data = s.recv(1024) 
    while data: 
     File.write(data) 
     data = s.recv(1024) 
s.close() 

Antwort

5

TCP zu gewährleisten versucht, dass, wenn die Daten geliefert werden, ist es richtig und in Ordnung. Es verwendet Prüfsummen, um sicherzustellen, dass Daten nicht beschädigt sind, und Sequenznummern, um sicherzustellen, dass die Daten in der richtigen Reihenfolge und ohne Lücken geliefert werden. Und es verwendet Bestätigungen, so dass der Absender weiß, dass Daten empfangen wurden.

Aber angenommen, es gibt einen Netzwerkausfall mitten in einer Übertragung. Wenn dies geschieht, nachdem das Datensegment empfangen wurde, aber bevor die Bestätigung zurückgesendet wird, weiß der Sender nicht, dass die Daten empfangen wurden. Der Absender wird weiterhin versuchen, die Daten erneut zu senden, und wird eventuell eine Zeitüberschreitung vornehmen und der Anwendung einen Fehler melden.

Die meisten TCP-APIs ermöglichen es der Anwendung nicht, genau herauszufinden, wo in der Kommunikation der Fehler aufgetreten ist. Wenn Sie ein Megabyte gesendet haben und einen Fehler erhalten haben, könnte dies am Anfang geschehen sein, wenn kaum etwas gesendet wurde, oder am Ende, wenn die meisten Daten gesendet wurden. Es könnte sogar passieren, nachdem alle Daten gesendet wurden - vielleicht war nur der letzte ACK verloren.

Darüber hinaus legt der Systemaufruf write() im Allgemeinen nur die Daten in einem Kernel-Puffer. Es wartet nicht darauf, dass die Daten an das Netzwerk gesendet werden, und wartet nicht darauf, dass der Empfänger es bestätigt.

Selbst wenn Sie die Verbindung erfolgreich schließen, können Sie sich nicht ganz sicher sein. Wenn Sie die Verbindung schließen, sendet der Absender eine Nachricht an den Empfänger, dass er mit dem Senden der Daten fertig ist.Wenn die Verbindung jedoch nur im Netzwerkstapel in die Warteschlange gestellt wird, wartet sie nicht darauf, dass das andere System sie bestätigt.

Dies ist der Grund, warum Anwendungsprotokolle über das grundlegende TCP-Protokoll eine eigene Bestätigungsstufe haben. Zum Beispiel sendet der Client im SMTP-Protokoll den Nachrichteninhalt gefolgt von einer Zeile mit ., um das Ende anzuzeigen, und wartet dann darauf, dass der Server einen Antwortcode zurücksendet, der anzeigt, dass die Nachricht erfolgreich empfangen wurde und übermittelt wird oder in die Warteschlange gestellt. Die TCP-Überprüfung stellt sicher, dass der Nachrichteninhalt intakt gesendet wird, wenn Sie diese Antwort erhalten.

In Bezug auf die allgemeine Fähigkeit eines Protokolls, die perfekte Lieferung aller Nachrichten zu garantieren, sollten Sie über die Two Generals' Problem. lesen Egal, was Sie tun, gibt es keine Möglichkeit, die Lieferung aller Nachrichten in jeder Kommunikation zu überprüfen, weil die einzige Möglichkeit zu bestätigen dass die letzte Nachricht zugestellt wurde, ist durch Senden einer weiteren Nachricht als Antwort, und diese Antwort ist die letzte Nachricht und muss bestätigt werden.

+0

Es ist erwähnenswert das Verhalten des Systems 'write()' Aufruf, der nicht garantiert, dass der gesamte Puffer gesendet wird. Ich habe das starke Gefühl, dass die erwähnte Dokumentation darauf verweist. – ArturFH

Verwandte Themen