HTTP协议中的长连接,读完之后,大部分程序员收藏了...( 三 )

在实际使用中 , HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接 , 客户端和服务器端都可以无视这个值 , 也就是不按标准来 , 譬如我自己写的HTTP客户端多线程去下载文件 , 就可以不遵循这个标准 , 并发的或者连续的多次GET请求 , 都分开在多个TCP通道中 , 每一条TCP通道 , 只有一次GET , GET完之后 , 立即有TCP关闭的四次握手 , 这样写代码更简单 , 这时候虽然HTTP头有Connection: Keep-alive , 但不能说是长连接 。 正常情况下客户端浏览器、web服务端都有实现这个标准 , 因为它们的文件又小又多 , 保持长连接减少重新开TCP连接的开销很有价值 。

以前使用libcurl做的上传/下载 , 就是短连接 , 抓包可以看到:1、每一条TCP通道只有一个POST;2、在数据传输完毕可以看到四次握手包 。 只要不调用curl_easy_cleanup , curl的handle就可能一直有效 , 可复用 。 这里说可能 , 因为连接是双方的 , 如果服务器那边关掉了 , 那么我客户端这边保留着也不能实现长连接 。

如果是使用windows的WinHTTP库 , 则在POST/GET数据的时候 , 虽然我关闭了句柄 , 但这时候TCP连接并不会立即关闭 , 而是等一小会儿 , 这时候是WinHTTP库底层支持了跟Keep-alive所需要的功能:即便没有Keep-alive , WinHTTP库也可能会加上这种TCP通道复用的功能 , 而其它的网络库像libcurl则不会这么做 。

推荐阅读