http和tcp连接小记 TCP 短连接与长连接 短连接与长连接的关键区分在于,是否复用TCP连接,短连接每次使用完毕都会释放连接,长连接则会将连接放入池中,等待下次使用。 所以实现长连接一般都会有几个关键参数: 最大连接数: 其实就是连接池中保存连接数上限 过期时间: 当请求数下降时,我们没有必要再维护这么多连接,所以我们需要给每条连接设置过期时间,当过期后及时从池中移除 在 http1.0 协议中,需要指定 Connection: keep-alive 来启用 TCP 长连接,http1.1 中已经成为默认值,无需指定,但是很多浏览器依旧会发送这个字段来兼容一些遗留的 web 服务。 这里可能需要区分另一个用于 watch 结果的实现方式,我们知道一般有三种方式: 短轮询, 长轮询, websockt,长轮询当中会把请求 hold 住一段时间,让其也变成了 http 协议上的长连接,但是并不是我们 讨论的 tcp 协议上的长连接 长连接消息的传输 传输编码:Transfer-Encoding, 内容编码: Content-Encoding 在长连接当中,由于连接不会断开,所以客户端无法知道消息是否已发送完毕,所以出现了 Content-Length 字段来告诉浏览器消息已传输完毕。但是很多情况下要计算出完整的响应体都是一件不容易的事情,为了计算出这个字段,我们需要把内容全部加载到内存中,这种实现非常不友好。所以出现了 Transfer-Encoding,一般为 chunked 代表分块传输。它不但解决动态内容长度的问题,同时还可以配合内容编码 (一般为 gzip or deflate or br,其中 br 是google 2013 产出的,具有更好的压缩效果,但是兼容性较差,很多库都尚未实现 ) 进行边压缩边发送而无需预先知道压缩之前的内容大小。 分块格式 如果一个HTTP消息(包括客户端发送的请求消息或服务器返回的应答消息)的Transfer-Encoding消息头的值为chunked,那么,消息体由数量未定的块组成,并以最后一个大小为0的块为结束。 每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。在一些实现中,块大小和CRLF之间填充有白空格(0x20)。 最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段。 消息最后以CRLF结尾, 例子: 25 This is the data in the first chunk 1C and this is the second one 3 con 8 sequence 0 更详细内容参考:分块传输编码, HTTP 协议中的 Transfer-Encoding