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则不会这么做 。
推荐阅读
- 手机游戏|3年内不得转会FNC!G2老板被爆与C9达成秘密协议,Perkz转会受阻
- 热血传奇|热血传奇:当年心中的巅峰,随便一件无比骄傲
- 手办|原神:“肝帝”再现!玩家花30天自制胡桃手办,手中的护摩亮了
- edg战队|EDG夺冠可谓是小说中的梦幻剧情,先破RNG再废GEN.G,豪虐DK夺冠
- 亚运会|LOL入选亚运会正赛,你心中的阵容怎么选?
- 孙权|三国杀:背景帝!武将皮肤中的最强客串王,孙十万果然名不虚传
- 夏侯惇|王者荣耀之中的“最强坦克”, 夏侯惇和程咬金你更喜欢谁?
- 穿越火线|轻松上手,赶超雷神:盘点CF中那些神枪中的天之骄子
- 明日之后|消逝的光芒2设计师:明日之后打造了我心目中的人尸大决战
- 老玩家|天龙网游:天龙游戏中的神奇玩法,没有经历过别说自己是老玩家