从我的理解,一个HTTP连接既可以是keep-alive
或close
。
我送一个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-alive
或close
?
TL; DR:铬将此解释响应头作为keep-alive
和保持peristent连接而Firefox关闭每个连接。
我偶然发现了这个问题,因为我想优化页面加载时间为我的网站。
在所涉及的RFC我也没找到有关如何在多个条目的任何Connection
头可以得到妥善处理。 在我看来,像实施可以从两个possibilites选择:
- 如果有多个条目,你可以选择最适合您的需要
- 如果有一个
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
,我建议使用保活,如果你需要一个以上的请求尝试。 最糟糕的事情可能会发生:服务器将关闭连接,你需要重新连接(这正是你本来还有其他选择!)
这意味着服务器不会做持久连接,并且将关闭这个请求之后的连接。
答案是在RFC 7230 - 6.1。 连接 。 它说:
Connection头字段的值具有以下语法:
Connection = 1#connection-option connection-option = token
在互联网RFC的说法, 1#connection-option
意味着至少一个,最多任意数量的connection-option
。 这意味着可能有多个选项,其中,接收器将它的人喜欢。 这不是一个歧义,这是一个选择。
您正在使用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实现者应准备与它进行互操作。
该服务器可能是“互操作”和曳你是多余的。