keep-alive模式
TCP的keep-alive
TCP内部自带的心跳包机制,简单讲就是,连接的一端(以服务器端举例)检测到超过一定时间(称为空闲时间,系统默认是 7200000 ms,即2个小时)没有数据传输,就会向client端发送一个keep-alive packet(该心跳包是ACK和当前TCP序列号减一的组合),如果收到client的响应,则重置计时器(即2小时重新计时),否则会每隔一定时间(通常默认是75s),重复尝试发送心跳包(通常默认是9次),如果一直没有收到client的响应,则终止此链接(release掉占用的资源)。
HTTP的Keep-Alive模式?
http一般是短连接,即一次请求结束后关闭连接,但如果有多个资源要请求(比如连续10张图片)中间连接建立和断开的开销就浪费了,因此可以通过keep-alive模式,将这个http连接通道保持一段时间。
http响应头中有一个Connection: Keep-Alive
表示开启Keep-Alive模式。在HTTP 1.1版本后,默认都开启Keep-Alive模式,只有Connection: close
才关闭。当然也可以设置Keep-Alive模式的属性,例如 Keep-Alive: timeout=5, max=100
,表示这个TCP通道可以保持5秒,max=100,表示这个长连接最多接收100次请求就断开。
Keep-Alive模式下如何知道某一次数据传输结束?:1. 根据响应头中的Content-Length字段。 2. 服务端关闭后,客户端一般是分块(chunk)读的,因此读取到的最后的一个数据块chunk的长度是0。