Keep-Alive模式

我们都知道HTTP是基于TCP的,每一个HTTP请求都需要进行三步握手。如果一个页面对某一个域名有多个请求,就会进行频繁的建立连接和断开连接。所以HTTP 1.0中出现了Connection: keep-alive,用于建立长连接,即我们所说的Keep-Alive模式。下图是普通模式和长连接模式的请求对比:

HTTP/1.0中默认使用Connection: close。在HTTP/1.1中已经默认使用Connection: keep-alive。

通过对比可以看出,Keep-Alive模式更加高效,因为避免了连接建立和释放的开销。但是,如果一个连接是不会断开的,那么多个请求之间如何进行区分呢?也就是说浏览器是如何知道当前请求已经完成了呢?为了解决这个问题,HTTP对header中又添加了一个Content-Length字段。

Content-Length

Content-Length表示实体内容的长度。浏览器通过这个字段来判断当前请求的数据是否已经全部接收。 
所以,当浏览器请求的是一个静态资源时,即服务器能明确知道返回内容的长度时,可以设置Content-Length来控制请求的结束。但当服务器并不知道请求结果的长度时,如一个动态的页面或者数据,Content-Length就无法解决上面的问题,这个时候就需要用到Transfer-Encoding字段。

Transfer-Encoding

Transfer-Encoding是指传输编码,还有一个类似的字段叫做:Content-Encoding。两者的区别是Content-Encoding用于对实体内容的压缩编码,比如Content-Encoding: gzipTransfer-Encoding则改变了报文的格式,比如上面的问题中,当服务端无法知道实体内容的长度时,就可以通过指定Transfer-Encoding: chunked来告知浏览器当前的编码是将数据分成一块一块传递的。当然, 还可以指定Transfer-Encoding: gzip, chunked表明实体内容不仅是gzip压缩的,还是分块传递的。最后,当浏览器接收到一个长度为0的chunked时, 知道当前请求内容已全部接收。

最新文章

  1. AngularJS 2 Typescript 相关
  2. Ambari工具之认识学习01
  3. mapreduce 模板
  4. 对list进行切片
  5. ADO,OLEDB,ODBC,DAO的区别
  6. javax.management
  7. .Net语言中关于AOP 的实现详解
  8. Educational Codeforces Round 15_B. Powers of Two
  9. RabbitMQ 消息队列 配置
  10. 记一次结合PHP多进程和socket.io解决问题的经历
  11. Loj #2495. 「AHOI / HNOI2018」转盘
  12. windows安装并配置 nginx
  13. EntityFramework Core并发深挖详解,一纸长文,你准备好看完了吗?
  14. MySQL之IDE工具介绍及数据备份
  15. java.lang.OutOfMemoryError:GC overhead limit exceeded
  16. HBase Filter
  17. UICollectionView自定义cell布局layout
  18. FormData 数据转化为 json 数据
  19. Android 6.0 变更
  20. Serilog简介

热门文章

  1. php之快速入门学习-5(常量)
  2. vue单文件(sfc)编译为js的流程
  3. ebay分布式事务方案中文版
  4. Java编程思想(十五) —— 类型信息之反射
  5. python之模块csv之 读取CSV文件(reader和DictReader2个方法)
  6. html 链接外部css js文件
  7. java 在控制台上输入密码时,密码不显示在控制台上
  8. 网址URL中特殊字符转义编码
  9. PHP中一些有用的函数
  10. java学习之第五章编程题示例(初学篇)