通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态
TIME_WAIT状态的时间是2倍的MSL(最大生存时间),在TIME_WAIT状态TCP连接实际上已经断掉,但是该插口又不能被新的连接实例使用。这种情况一般都是程序中建立了大量的短连接。
那么http 服务是谁主动关闭连接呢?
http .0时代,如果不设置KeepAlive,默认都是短连接,服务器主动关,否则就看本地浏览器和web各自的设置了,基本都是某个间隔不活跃就断开,两边都可以。HTTP .1时代,默认就是长连接,类似HTTP .0外加KeepAlive,那边主动关都可以,依然看本地浏览器设置和web服务器设置。
在http1.1协议中,对于客户端(browser)的一个请求,如果返回Connection:Close,不是告诉客户端让客户端关闭连接,而是服务端之后主动关闭连接 http://www.zhihu.com/question/24338653
HTTP是请求-响应模式的,而有时候会以关闭连接来表示数据发送完毕,所以在其协议定义中有个字段来表示谁关闭连接。 HTTP1./.1都支持持久连接 在1.1中,如果客户端在请求中使用Connection: Close ,服务器端就会在发送完响应后从容关闭连接。但是即使客户端要求使用持久连接,但是服务器也有权在响应完请求后主动关闭连接,但是要在响应头在包含Connection: Close 。 .0和1.1一样,但是HTTP1.1默认是持久连接的,而且HTTP1.0不是
考虑两种方式:持久连接和非持久连接
这两种连接方式首先取决于http服务器是否支持
标准HTTP服务器支持这两种方式,特殊HTTP服务器只支持非持久连接 持久连接和非持久连接都是服务器端/IE端均可控制的
控制方式是用Connection : xxxxx字段
Connection: Close告诉对方这次传输结束以后关闭socket
Connection: Alive告诉对方这次传输结束以后可以再次利用这个socket 以下模拟持久连接:
IE Request 包含Connection:Alive -> HTTP服务器返回网页,HTTP头部包含 Connection: Alive -> IE在HTTP头部描述的字节数接收完毕以后提交下一个请求,其中继续包含 Connection: Alive -> HTTP服务器继续返回网页 以下模拟非持久连接:
IE Request 包含Connection:Alive -> HTTP服务器返回网页,HTTP头部包含 Connection: Close,表示自己无视IE的Alive请求 -> IE在HTTP头部描述的字节数接收完毕以后关闭socket 需要说明的是,对于持久连接,Server返回的HTTP头部必须包含一个内容大小字段用来确定IE需要接收的data字节,否则持久连接就会发生问题,因为IE无法获知自己什么时候应该发送下一个请求.所以无法确定data字段大小的时候,服务器必须在适当的时候(通常是data发送结束)主动关闭socket