2012-05-04 7 views
15

Ich versuche zu verstehen, wie die Sequenznummern des TCP-Headers generiert werden.TCP-Sequenznummer

An einigen Stellen habe ich gelesen, dass es der "Index des ersten Bytes im Paket" ist (link here), auf einigen anderen Seiten ist es eine zufällige 32bit generierte Nummer, die dann inkrementiert wird.

Ich weiß nicht wirklich, was hier was, so sind einige Fragen:

  • Wie wird die Anfangssequenznummer generiert? (RFC-Nummer, wenn es eine gibt)
  • Wie wird es erhöht?
  • Wie wird der geheime Schlüssel generiert?

I wie RFC 6528 einige der RFCs lesen, RFC 793 und RFC 1948 aber ich kann tatsächlich umgesetzt, die man nicht scheinen zu verstehen. Ich lese über den Status "std" aber stil ...

Vielen Dank im Voraus!

+1

Welche Implementierung? Was ist mit der Quelle dieser Implementierung, nach der Sie konkret fragen? – geoffspear

+0

Oh, tut mir leid. Ich meine, wenn Sie im Internet surfen (HTTP/TCP/IP), was benutzt Ihr Computer, um diese Sequenznummern zu generieren? Wie funktioniert es ? –

+0

Das ist also überhaupt keine Programmierfrage? – geoffspear

Antwort

27

Jeder Endpunkt einer TCP-Verbindung erstellt eine Startsequenznummer für Pakete, die er sendet, und sendet diese Nummer im SYN-Paket, das er beim Herstellen einer Verbindung sendet.

Es gibt keine Anforderung für jedes Ende, um eine bestimmte Prozedur bei der Auswahl der Startsequenznummer zu folgen. Das Betriebssystem ist frei, jeden Mechanismus zu verwenden, den es mag, aber im Allgemeinen ist es am besten, wenn es eine zufällige Zahl wählt, da diese sicherer ist.

Von diesem Startpunkt aus enthält jedes von beiden Enden gesendete Paket zwei Sequenznummern - eine, um anzugeben, wo im Stream das Paket ist, und eine ACK-Sequenznummer, die die Anzahl der empfangenen Bytes angibt. Beide Nummern sind um die Startsequenznummer versetzt.

Lesen Sie alles darüber in Wikipedia natürlich - suchen Sie nach "Sequenznummer" auf dieser Seite, um alle blutigen Details zu erhalten.

+0

Ah danke für deine schnelle Antwort! = D Ich verstehe es besser wissen. Nur zwei weitere Fragen ^^: Weißt du, wie die Zufallszahl generiert wird? und wissen Sie, zu welcher RFC-Nummer das von Ihnen beschriebene Verfahren gehört? Danke nochmal! –

+2

@AwakeZoldiek wie erklärt, die erste Sequenznummer kann durch _any_ Methode gewählt werden, obwohl für die beste Sicherheit sollte mit einem guten Zufallszahlengenerator gewählt werden. Die SYN- und ACK-Folgenummern befinden sich alle im Kerndokument RFC 793. – Alnitak

+0

Vielen Dank für Ihre Antworten! =) –

2

In 4.4BSD (und den meisten von Berkeley abgeleiteten Implementierungen) wird beim Initialisieren des Systems die initiale Sendesequenznummer auf 1 initialisiert. Diese Vorgehensweise verletzt den RFC für Hostanforderungen. (Ein Kommentar im Code bestätigt, dass dies falsch ist.) Diese Variable wird dann jede halbe Sekunde um 64.000 erhöht und etwa alle 9,5 Stunden wieder auf 0 zurückgesetzt. (Dies entspricht einem Zähler, der alle 8 Mikrosekunden, nicht alle 4 Mikrosekunden, inkrementiert wird.) Außerdem wird diese Variable jedes Mal, wenn eine Verbindung hergestellt wird, um 64.000 inkrementiert.