我不太了解我是否将http表单数据从浏览器发布到服务器,该协议是否仍需要进行三次握手(syn-ack-data)或仅适用于GET http请求?

#1 楼

HTTP GET和HTTP POSTS都使用TCP。如果您询问POST是否还需要三向TCP握手(syn-synack-ack),则它与任何其他TCP连接一样。在任何应用程序协议(例如HTTP)开始工作之前,都需要TCP握手。

FYI,您的三向握手不正确;如果浏览器对HTTP使用QUIC(Quick UDP Internet Connections,发音为quick。由Google提出)协议,则应为“ syn-synack-ack”

ADD:

避免3向TCP握手。然后对每个服务器服务器进行一次3次握手。

如果使用此协议,则可以通过任何请求(包括GET)避免进行3次握手。

#2 楼

如果从一般意义上讲,那么答案肯定是“是”,任何HTTP方法(如POST)都需要TCP连接,而启动TCP连接的唯一方法是使用三种方式的握手。 />
但是,如果您在特定情况下询问,也许如果您正在捕获自己的流量并且在向网站提交内容后没有看到三向握手,那么答案会少一些简单。在正确回答之前,我们必须讨论一些与HTTP相关的概念...



在HTTP1.0的原始版本中,您请求的每个对象一个网页要求为每个对象形成一个新的TCP连接。以以下包含一些文本和两个图像的简单网站为例:每个都有自己的三向握手和四向闭合)。

HTTP 1.0:

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



<请注意,上面有27个数据包,仅用于下载以下三项:HTML页面本身(索引。 html),图片a.gif和图片b.gif。 (实际上会有27个以上的数据包,但是为了节省垂直空间,我只在3向握手和4向关闭中包括了ACK,而在数据流中省略了ACK)。

为了提高HTTP的效率,引入了一个称为“连接保持活动”的功能,该功能允许HTTP重新使用相同的TCP连接来请求多个对象。上面的传输将减少为以下内容:

带有连接Keepalive的HTTP 1.1

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

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

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


请注意,只有一个TCP连接用于请求所有三个对象。这次只用了13个数据包,与之前的27个相比有了很大改进。

我们必须讨论的最后一个对HTTP的改进是称为流水线的功能。此功能使HTTP可以使客户端一次请求多个选项,而不必等待接收先前询问的对象,从而进一步提高了HTTP的效率。让我向您展示:

带管道的HTTP1.1

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

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

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


我们仍然只使用一个TCP连接,并且我们仍然仅使用9个数据包。但是,我们不必等待客户端和服务器之间在请求和接收每个对象之间花费的往返时间(RTT)。如果您需要类推,想象一下您在一家餐厅里,并且需要盐,胡椒粉和番茄酱。一次向您的服务员/女服务员索取所有三个物品,还是一次提出一个请求,然后等他们回来再提出下一个请求,效率更高?

(流水线是与您的问题没有直接关系,但是通常与Keepalives和其他HTTP效率功能结合使用,因此出于完整性考虑,我决定将其包含在此答案中)


现在我们终于可以回到您的问题:


如果HTTP POST需要进行TCP三向握手?


如果打开与服务器的连接Web服务器并使用GET方法下载网页,并且该Web服务器支持连接keepalive。对该Web服务器的后续请求,包括POST方法,可能只是简单地重用已经存在的TCP连接。因此,该特定的POST不需要新的3向握手,因为数据将在一个已经存在的TCP连接中传输。因此,如果下载网页后,您在发送POST之前等待了一段时间,则原始TCP连接可能已经关闭,在这种情况下,您的浏览器将不得不打开一个新的TCP连接来对您的数据进行POST,这显然需要启动3次握手。

由于许多浏览器和Web服务器使用不同的计时器来确定希望它们的“连接保持活动”功能保持连接有效的时间,因此我无法为您提供可靠的数字,通常需要多少时间。

评论


这是一个更完整的答案。非常感谢。绝对值得推荐。

– Manikandan Sigamani
16-11-22在18:56

如何说明HTTP / 2:p?

–animaacija
17年1月25日在23:49

实际上,三向握手并不是打开TCP连接的唯一方法。提及其他方式,至少同时打开连接和拆分握手。

– juhist
17 Mar 5 '17 at 13:04

如果所有答案都像这样一个详细,世界将会是一个更好的地方!做得好,很好的解释。

–dawez
18年5月24日在20:53

使用TCP优化路由器或代理,当服务器仍在与客户端环境的最外部部分建立连接时,浏览器可能会在看到来自本地代理的虚假TCP连接建立后开始发送HTTP数据。让我们考虑一下,如果TCP优化器在中间环境或服务器环境中运行!

–鳗鱼ghEEz
18/12/17在18:52



#3 楼

确实。但是无论如何,仍然有一种提高效率的方法-可以将数据放入SYN-SYNACK-ACK数据包中,尽管在完成握手之前,数据无法使用。