Une négociation TCP à trois voies est-elle requise pour un HTTP POST?

10

Je ne comprends pas très bien si je publie des données de formulaire http du navigateur vers le serveur, le protocole doit-il toujours établir une négociation à trois (syn-ack-data) ou ne fonctionne que pour les requêtes HTTP GET?

Елена Кокчева
la source

Réponses:

12

HTTP GET et HTTP POSTS utilisent TCP. Si vous demandez si un POST nécessite également une négociation TCP à 3 voies (syn-synack-ack), il fait comme n'importe quelle autre connexion TCP. La négociation TCP est requise avant que tout protocole d'application (tel que HTTP) ne commence à fonctionner.

Pour info, votre prise de contact à trois voies est incorrecte; ce devrait être "syn-synack-ack"

AJOUTER:

Si le navigateur utilise QUIC (Quick UDP Internet Connections, prononcé rapide. Proposé par Google), le protocole HTTP est possible pour éviter une négociation TCP à 3 voies. Mais AFAIK, il a pris en charge dans Chrome et Google.

La plupart des logiciels préfèrent HTTP / 2 qui est toujours TCP mais avec de nombreuses fonctionnalités, il utilise une connexion persistante, puis une négociation à trois est effectuée une fois pour chaque serveur.

Si ce protocole est utilisé, le hanshake à 3 voies peut être évité par toute demande, y compris GET.

mmv-ru
la source
24

Si vous posez une question dans un sens général, alors la réponse est certainement "oui", toute méthode HTTP (comme POST) nécessite une connexion TCP, et la seule façon d'initier une connexion TCP est d'utiliser la poignée de main à trois.

SI, cependant, vous demandez dans un cas spécifique, peut-être si vous capturez votre propre trafic et ne voyez pas la poignée de main à 3 voies après avoir soumis du contenu à un site Web, alors la réponse est un peu moins simple. Nous devrons discuter de quelques concepts liés à HTTP avant de pouvoir y répondre correctement ...


Dans la version d'origine de HTTP1.0, chaque objet que vous avez demandé à partir d'une page Web nécessitait la création d'une nouvelle connexion TCP pour chaque objet. Prenez le site Web simpliste suivant qui comprend du texte et deux images:

<HTML>
  <HEAD>
    <TITLE>My Title</TITLE>
  </HEAD>
  <BODY>
    Stack Exchange Rules!
    <IMG SRC="a.gif">
    <IMG SRC="b.gif">
  </BODY>
</HTML>

Dans HTTP1.0 traditionnel, pour charger ce site Web dans votre navigateur, il faudrait trois connexions TCP (chacune avec sa propre poignée de main à 3 voies et sa fermeture à 4 voies).

HTTP 1.0:

--> SYN
                SYN ACK <--
--> ACK

--> GET /index.html
           <index.html> <--

--> FIN
                    ACK <--
                    FIN <--
--> ACK

.

--> SYN
                SYN ACK <--
--> ACK

--> GET /a.gif
                <a.gif> <--

--> FIN
                    ACK <--
                    FIN <--
--> ACK

.

--> SYN
                SYN ACK <--
--> ACK

--> GET /b.gif
                <b.gif> <--

--> FIN
                    ACK <--
                    FIN <--
--> ACK

Notez qu'il y a 27 paquets ci-dessus, juste pour télécharger trois éléments: la page HTML elle-même (index.html), l'image a.gif et l'image b.gif. (il y aurait en fait plus de 27 paquets, mais pour économiser de l'espace vertical, j'ai seulement inclus les ACK dans la poignée de main à 3 voies et la fermeture à 4 voies, et j'ai omis les ACK dans le flux de données)

Pour améliorer l'efficacité de HTTP, une fonctionnalité appelée "Connexion Keepalive" a été introduite, qui permet à HTTP de réutiliser la même connexion TCP pour demander plusieurs objets. Le transfert ci-dessus serait réduit comme suit:

HTTP 1.1 avec connexion Keepalive

--> SYN
                SYN ACK <--
--> ACK

--> GET /index.html
           <index.html> <--
--> GET /a.gif
                <a.gif> <--
--> GET /b.gif
                <b.gif> <--

--> FIN
                    ACK <--
                    FIN <--
--> ACK

Notez qu'une seule connexion TCP a été utilisée pour demander les trois objets. Cette fois, il n'a fallu que 13 paquets, une grande amélioration par rapport aux 27 précédents.

La dernière amélioration de HTTP dont nous devons discuter est une fonctionnalité appelée Pipelining. Cette fonctionnalité a encore amélioré l'efficacité de HTTP, en permettant au client de demander plusieurs options à la fois, sans attendre de recevoir l'objet demandé précédemment. Laisse moi te montrer:

HTTP1.1 avec Pipelining

--> SYN
                SYN ACK <--
--> ACK

--> GET /index.html
--> GET /a.gif
--> GET /b.gif
           <index.html> <--
                <a.gif> <--
                <b.gif> <--

--> FIN
                    ACK <--
                    FIN <--
--> ACK

Nous n'utilisons toujours qu'une seule connexion TCP et nous n'utilisons toujours que 9 paquets. Cependant, nous n'avons pas à attendre le temps de trajet aller-retour (RTT) qu'il faut entre le client et le serveur entre demander et recevoir chaque objet. Si vous avez besoin d'une analogie, imaginez que vous êtes dans un restaurant et que vous avez besoin de sel, de poivre et de ketchup. Est-il plus efficace de demander à votre serveur / serveuse les trois articles en même temps, ou de les demander un à la fois et d'attendre qu'ils reviennent avant de faire la prochaine demande?

(Le pipeline n'est pas directement lié à votre question, mais est souvent décrit en conjonction avec Keepalives et d'autres fonctionnalités d'efficacité HTTP, j'ai donc décidé de l'inclure dans cette réponse pour être complet)


Maintenant, nous pouvons enfin revenir à votre question:

Une négociation TCP à trois voies est-elle requise pour un HTTP POST?

Si vous ouvrez une connexion à un serveur Web et téléchargez une page Web à l'aide de la méthode GET, et que ce serveur Web prend en charge la connexion persistante. Les demandes ultérieures adressées à ce serveur Web, y compris la méthode POST, peuvent simplement réutiliser la connexion TCP déjà existante. Par conséquent, ce POST particulier ne nécessiterait pas de nouvelle prise de contact à 3 voies, car les données seraient transférées dans une connexion TCP déjà existante.

La connexion Keepalive, cependant, n'a pas une durée infinie. Donc, si après avoir téléchargé la page Web, vous avez attendu un certain temps avant d'envoyer votre POST, la connexion TCP d'origine peut déjà être fermée, et dans ce cas, votre navigateur devrait ouvrir une nouvelle connexion TCP pour POST vos données, ce qui nécessiterait évidemment de démarrer avec la poignée de main à 3 voies.

Étant donné que de nombreux navigateurs et serveurs Web utilisent des minuteries différentes pendant combien de temps ils souhaitent que leur fonction de "connexion permanente" maintienne les connexions en vie, je ne serais pas en mesure de vous donner des chiffres fiables quant à la durée habituelle de la demande.

Eddie
la source
1
Ceci est une réponse plus complète. Merci beaucoup. Vaut vraiment le coup d'être voté.
Manikandan Sigamani
1
Que diriez-vous d'illustrer HTTP / 2: p?
animaacija
En fait, la prise de contact à trois voies n'est pas le seul moyen d'ouvrir des connexions TCP. Pour mentionner les autres façons, il existe au moins une connexion simultanée ouverte et une négociation partagée.
juhist
1
Le monde serait un meilleur endroit si toute la réponse était détaillée comme celle-ci! Bravo, très bien expliqué.
dawez
Avec un routeur d'optimisation TCP ou un proxy, le navigateur peut commencer à envoyer des données HTTP en voyant un faux établissement de connexion TCP de l'agent local lorsque le serveur établit toujours la connexion avec la partie la plus externe de l'environnement du client. Et réfléchissons une minute si un optimiseur TCP s'exécute au milieu ou dans l'environnement serveur!
anguille ghEEz
0

En effet. Mais de toute façon, il y a encore un moyen de le rendre plus efficace - les données peuvent être placées dans des paquets SYN-SYNACK-ACK, bien que jusqu'à ce que la prise de contact soit terminée, les données ne peuvent pas être utilisées.

poige
la source