如何理解“连接:保持活跃,接近”?(How to interpret “Connection: ke

2019-06-26 06:01发布

从我的理解,一个HTTP连接既可以是keep-aliveclose

我送一个HTTP请求到服务器:

GET /page1/ HTTP/1.1
Host: server.com
Connection: keep-alive

它回应:

HTTP/1.1 200 OK
Connection: keep-alive, close

从本质上讲,我相信服务器窃听,因为像一个响应keep-alive, close是不明确的。

然而,由于接收器 ,我们应该如何处理这样的消息? 我们要解释这个头的值作为keep-aliveclose

Answer 1:

TL; DR:铬将此解释响应头作为keep-alive和保持peristent连接而Firefox关闭每个连接。

我偶然发现了这个问题,因为我想优化页面加载时间为我的网站。

在所涉及的RFC我也没找到有关如何在多个条目的任何Connection头可以得到妥善处理。 在我看来,像实施可以从两个possibilites选择:

  1. 如果有多个条目,你可以选择最适合您的需要
  2. 如果有一个close里面,你可以关闭传输连接后

所以,我需要找到答案。 让我们做一些顺藤摸瓜:

我注意到,浏览器总是发送一个HTTP / 1.1请求与Connection: keep-alive和我的Apache默认配置总是以响应Connection: close标头。 于是我开始调查,并采取了看使用Wireshark的TCP段。

Chrome提供了获取14元,显示的网站,主要是他们的喜欢的图像或CSS文件一成不变的东西。 并参加了完整的14个TCP连接,并且花了很多的时间(大约1,2秒)。 用于图像在每个请求之后(例如)出现了与所述一个TCP段FIN设置为1的标志。

那么,关于Chrome浏览器Firefox的对比? 铬似乎有并发连接的最大数目为6,一台服务器Firefox有一个更精细的配置和distinguishs持久(6最大信号,在约看出:配置)和非持久性(最大数不同很多不同的来源)。 别急......两个,Chrome和Firefox正在发送HTTP / 1.1请求头的Connection: keep-alive ,这样既应限制在6(因为这是开放的持久连接的请求)。

我决定尝试一个简单的技巧,并添加以下行到我.htaccess在Web根文件夹:

<ifModule mod_headers.c>
Header set Connection keep-alive
</ifModule>

现在,服务器会回应:

Connection: keep-alive, close

现在,我又看了看TCP报文段:有在Chrome上我的服务器现在只有9连接,只有3与FIN设置为1的标志那么这一招似乎工作。 但是,为什么在那里的3个连接,即关闭数据传输之后的连接? 这些是PHP请求,如HTTP报头X-Powered-By: PHP/5.4.11证实。

什么关于Firefox? 仍然有那些14个请求!

如何解决这个问题,并得到了FCGI进程与保活过工作吗?

我添加以下行httpd.conf配置的我的虚拟主机部分:

KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100

并删除在加入的影片.htaccess 。 现在服务器不发送任何混乱- Connection: keep-alive, close ,但只Connection: keep-alive ,一切工作正常!

结论:

与连接字段设置为一个标题

HTTP/1.1 200 OK
Connection: keep-alive, close

将Chrome浏览器解释为keep-alive而Firefox似乎关闭每个连接。 这似乎取决于实际执行。

所以,如果你愿意落实处理包含响应头一个客户端Connection: keep-alive, close ,我建议使用保活,如果你需要一个以上的请求尝试。 最糟糕的事情可能会发生:服务器将关闭连接,你需要重新连接(这正是你本来还有其他选择!)



Answer 2:

这意味着服务器不会做持久连接,并且将关闭这个请求之后的连接。



Answer 3:

答案是在RFC 7230 - 6.1。 连接 。 它说:

Connection头字段的值具有以下语法:

  Connection = 1#connection-option connection-option = token 

在互联网RFC的说法, 1#connection-option意味着至少一个,最多任意数量的connection-option 。 这意味着可能有多个选项,其中,接收器将它的人喜欢。 这不是一个歧义,这是一个选择。



Answer 4:

您正在使用HTTP/1.1和您指定Connection: keep-alive

HTTP/1.1的所有连接均保持活跃在默认情况下,和Connection: keep-alive头已被弃用,所以你不应该把它。

Connection: keep-alive是用于早在所谓的一个小黑客HTTP/1.0+天。 (本+代表“来得到它的工作必要的黑客。”)

HTTP:权威指南由布赖恩·托蒂,马乔萨耶尔,Sailu雷迪,安舒AGGARWAL,大卫·葛丽由O'Reilly我们读到:

保持活动已被弃用,在当前的HTTP / 1.1规范中没有记载。 然而,保活的握手仍然在通过浏览器和服务器相对通用,所以HTTP实现者应准备与它进行互操作。

该服务器可能是“互操作”和曳你是多余的。



文章来源: How to interpret “Connection: keep-alive, close”?