1、什么是Keep-Alive模式?

我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成 之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。

http 1.0中默认是关闭的,需要在http头加入"Connection: Keep-Alive",才能启用Keep-Alive;http 1.1中默认启用Keep-Alive,如果加入"Connection: close ",才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。

2、启用Keep-Alive的优点

从上面的分析来看,启用Keep-Alive模式肯定更高效,性能更高。因为避免了建立/释放连接的开销。

3、客户端/服务器如何判断数据大小

Http协议的请求报文和回复报文都有header和body,body就是你要获取的资源,例如一个html页面,一个jpeg图片,而header是用来做某些约定的。例如客户端与服务端商定一些传输格式,客户端先获取头部,得知一些格式信息,然后才开始读取body。

客户端: Accept-Encoding:gzip (给我压缩一下,我用的是流量,先下载下来我再慢慢解压吧)

服务端1:Content-Encoding:null(没有Content-Encoding头。 我不给压缩,CPU没空,你爱要不要)

服务端2:Content-Encoding:gzip (给你节省流量,压缩一下)

客户端:Connection: keep-alive (大哥,咱好不容易建了个TCP连接,下次接着用)

服务端1: Connection: keep-alive (都不容易,接着用)

服务端2: Connection: close (谁跟你接着用,我们这个TCP是一次性的,下次再找我还得重新连)

http协议没有三次握手,一般客户端向服务端请求资源时,以服务端为准。还有一些header并没有协商的过程,而是服务端直接告诉客户端按什么来。例如上述的Content-Length,是服务端告诉客户端body的大小有多大。但是!服务端并不一定能准确的提前告诉你body有多大。服务端要先写header,再写body,如果要在header里把body大小写进去,就得提前知道body大小。如果这个body是动态生成的,服务端先生成完,再开始写header,这样需要很多额外的开销,所以header里不一定有content-length。

那客户端怎么知道body的大小呢?服务器有三种方式告诉你。

1.服务器已经知道资源大小,通过content-length这个header告诉你。

Content-Length:1076(body的大小是1076B,你读取1076B就可以完成任务了)
Transfer-Encoding: null

2.服务器没法提前知道资源的大小,或者不愿意花费资源提前计算资源大小,就会把http回复报文中加一个header叫Transfer-Encoding:chunked,就是分块传输的意思。每一块都使用固定的格式,前边是块的大小,后面是数据,然后最后一块大小是0。这样客户端解析的时候就需要注意去掉一些无用的字段。

Content-Length:null
Transfer-Encoding:chunked (接下来的body我要一块一块的传,每一块开始是这一块的大小,等我传到大小为0的块时,就没了)

3.服务器不知道资源的大小,同时也不支持chunked的传输模式,那么就既没有content-length头,也没有transfer-encoding头,这种情况下必须使用短连接,以连接结束来标示数据传输结束,传输结束就能知道大小了。这时候服务器返回的header里Connection一定是close。

Content-Length:nullTransfer-Encoding:nullConnection:close(我不知道大小,我也用不了chunked,啥时候我关了tcp连接,就说明传输结束了)

总结

一个好的http客户端,必须充分实现协议,不然就可能出问题,浏览器对于服务端可能产生的各种情况都很好的做了处理,但是自己实现http协议的解析时一定得注意考虑多种情况。

HTTP协议头部与Keep-Alive模式详解-Content-Length Transfer-Encoding相关推荐

  1. OAuth2.0授权协议与客户端授权码模式详解

    本文来重点讲解下OAuth2.0授权协议与客户端授权码模式 文章目录 什么是OAuth协议 交互过程 客户端授权模式 授权码模式 简化模式 密码模式 客户端模式 接入公司内部系统 后台管理系统 前台业 ...

  2. HTTP协议头部与Keep-Alive模式详解

    HTTP协议头部与Keep-Alive模式详解 HTTP协议头部与Keep-Alive模式详解 - 玩命写博客 - 博客频道 - CSDN.NET HTTP协议头部与Keep-Alive模式详解 20 ...

  3. FTP协议主动(Port)模式和被动(Passive)两种模式详解

    FTP协议主动(Port)模式和被动(Passive)两种模式详解 FTP(File Transfer Protocol)是文件传输协议的简称. 正如其名所示: FTP的主要作用,就是让用户连接上一个 ...

  4. iOS里面MVC模式详解

    iOS里面MVC模式详解 MVC是IOS里面也是很多程序设计里面的一种设计模式,M是model,V是view,C是controller.MVC模式在ios开发里面可谓是用得淋漓尽致. 以下是对斯坦福大 ...

  5. Android  Doze and App Standby模式详解

    Android  Doze and App Standby模式详解 来源:腾云阁 https://www.qcloud.com/community Optimizing for Doze and Ap ...

  6. flannel 介绍(UTP、VXLAN、Host Gateway模式详解)

    flannel 介绍(UTP.VXLAN.Host Gateway模式详解) 使用kubernetes安装flannel flannel backend 详解(flannel 各种模式详解) 1.UD ...

  7. 趣谈网络协议-第二模块-底层网络知识详解:4陌生的数据中心2CDN和数据中心

    趣谈网络协议-第二模块-底层网络知识详解:4陌生的数据中心2CDN和数据中心 1:CDN:你去小卖部取过快递么? 使用"中间仓库"来优化 网络中的"就近配送" ...

  8. redis集群模式详解

    redis集群模式详解 一,redis集群 1,哨兵集群 2,redis Cluster 二,redis Cluster集群的搭建 1,配置文件 2,redis服务启动 三,springboot连接r ...

  9. 华为ensp交换机vlan划分三种接入模式详解-----网络通信原理

    华为ensp交换机vlan划分三种接入模式详解 冲突域.交换机.广播域 VLAN概述 VLAN帧格式 access端口 Trunk端口 Hybrid端口 冲突域.交换机.广播域 定义:在一个网络范围内 ...

  10. VM虚拟机三种网络模式详解

    感谢wuwenweijuan的优质文章,本文在该文基础上做了注和补充 目录 1 VM虚拟机三种网络模式详解 1.1 Bridged(桥接模式) 1.2 NAT(地址转换模式) 1.3 Host-Onl ...

最新文章

  1. Unicode/not set/multi-byte/部分常用函数
  2. DM368学习--捕获视频图像分辨率修改
  3. Java是如何实现跨平台的?原理是什么?
  4. httrack 拷贝网站到本地(好东西,但是发现考的不全)
  5. hive 查看 job 日志_日均TB级数据,携程支付统一日志框架
  6. Google 加入反 IE6 联盟:IE6 真的能被消灭吗?
  7. mysql_数据查询_单表查询
  8. redis服务器环境下mysql实现lnmp架构缓存
  9. 【学习笔记】程序设计导引及在线实践 数值转换问题(2)
  10. 哈夫曼树的构造和哈夫曼编码实现详细讲解(含例题详细讲解)
  11. 博主力推!!NRF52832 BLE 抓包sniffer来了!附带安装使用说明
  12. 工程经济作业1答案_国开电大工程经济与管理阶段作业1答案
  13. php 鼠标 移动 手型,JS实现的鼠标跟随代码(卡通手型点击效果)
  14. 判断ua字段中是否含有html5plus,浏览器UA,浏览器标识检测
  15. ​嘉楠往事:浮沉八载,如今剑指美股
  16. 走对路!在智能时代别捡了芝麻丢了西瓜!
  17. js动画requestAnimationFrame详解
  18. 学生综合测评系统C语言课程设计
  19. 调程序的小女孩(感谢安徒生)
  20. 庄子如何应对杠精? 什么, 庄子原来不是在诡辩? ---庄子与惠子游于濠梁之上解析

热门文章

  1. 从SQL过渡至MongoDB查询对照表
  2. 诗与远方:无题(五)
  3. SpringCloud创建Config多客户端公共配置
  4. Linux硬盘检测命令smartctl
  5. kafka发送mysql数据丢失_Kafka 如果丢了消息,怎么处理的?
  6. C# 操作Sqlite
  7. java types.varchar_java statement.registerOutParameter(5, java.sql.Types.VARCHAR)返回值长度限制...
  8. String,StringBuilder, StringBuffer
  9. [Java工具] 邮件发送工具
  10. Battle Encoder Shirase一款能限制进程CPU占有率的小东西