HTTP(超文本传输协议:HyperText Transfer Protocol)是浏览器和服务器通过internet进行相互通信的协议,也是网络上应用最为广泛的一种网络协议。HTTP规范由World Wide Web Consortium(W3C)和Internet Engineering Task Force(IETF)进行编制,文档是RFC2616。HTTP1.1是如今比较常用的版本,但是有些浏览器和服务器仍在使用老版本1.0。


  HTTP协议由请求和响应构成。浏览器端向特定的URL发送HTTP请求,URL对应的服务器经过处理请求,然后返回HTTP响应。和许多Internet服务一样,HTTP协议同样使用的是简单的纯文本格式。请求的类型比较多:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE,注意为符合HTTP协议规范,请尽量使用大写。我们经常使用到的类型,GET、POST请求,REST规范使用到了GET、PUT、DELETE、POST类型。

  Get请求包含一个URL,还有headers也就是头信息。HTTP响应包含状态码、头和响应主体。下面是Firxbug中抓取的HTTP头信息。

  压缩

  先来看看request headers部分,accept-encoding表示可以使用压缩来减小响应的大小,前提是浏览器和服务器支持。这也是web优化最有效的技巧之一,HTML文件通过compressor格式化,再通过gzip进行压缩,通常都能减少50%-60%的大小,别小看这50%,对于高访问量的门户网站来说,这可是白花花的银子。另外,服务端进行了GZIP压缩,可以通过响应的content-encoding进行确认。上述图片中的响应,并不存在这个字段,也就说明服务端并没哟执行相应格式的压缩。

  缓存

  目前,不论是前端还是后端,还是数据库,随处可见缓存技术,GET请求也使用了这技巧。而检测缓存中的副本是否有效,通常是对比最后的修改时间。基于响应中的Last-Modified头信息,可以知道文件的最后的修改时间,请求端使用If-Modified-Since头将最后修改时间发送给服务器。服务器端便会进行比较判断,如果日期相同,就不会再发送响应主体,否则发送最新的响应主体,如此便可达到更快响应的性能优化效果。

  过期

  说到了缓存,不得不说说缓存副本过期时间,顾名思义,副本的过期时间小于当下时间,也就是它已经过期,不能再使用,必须获取服务器端最新的版本;否则,服务端返回状态码304,也即是没有修改,并且缓存没有过期,可以正常使用,那么浏览器将不会发出http请求,体现在firebug的样式是,timeline是绿色的时间条。

  在response headers中,expires代表要过期的具体时间,Cache-Control表示缓存可以保存的时间,图1为21600秒。

  connection

  HTTP构建在Transmission Control Protocol(TCP)之上,通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回响应信息。在HTTP的早期实现中,每个HTTP请求都要打开一个socket连接,这样做的效率非常低下,因为一个web页面中有许多HTTP请求指向同一个服务器。比较常见的,请求许多图片一般指向同一个图片服务器。这个时候,引入了持久连接来解决多对一请求服务器导致的socket连接效率低下的问题。它可以使浏览器再一个单独的连接上进行多个请求。浏览器和服务器使用Connection头信息来表示Keep-Alive的支持。

  当然Connection:Keep-Alive并不是必需的,但大部分浏览器和服务器都包含它。

  这里只是对HTTP进行一个简单的概述,如果需要深入学习,可以阅读本文参详的文章或书籍。

参详信息:

1、HTTP规范:http://www.ietf.org/rfc/rfc2616.txt

2、MDN:https://developer.mozilla.org/en-US/docs/HTTP/Headers

3、重点推荐:《HTTP:The Definitive Guide》

javascript —— HTTP头文件详解的更多相关文章

  1. jni.h头文件详解二

    作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shao ...

  2. 【转】 jni.h头文件详解(二)

    原文网址:http://blog.csdn.net/shaohuazuo/article/details/42932813 作者:左少华 博客:http://blog.csdn.net/shaohua ...

  3. jni.h头文件详解一

    1.jni.h头文件路径: /usr/lib/jvm/jdk_1.6.0_43/include/jni.h 2.jni.h头文件组成分析图: 3.下面通过上图进行分析讲解jni.h头文件. 一. jn ...

  4. Linux 头文件详解

    概览: 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,Linux子目录中有10个,sys子目录中有5个. <a.out.h>:a.out头文件,定义了a. ...

  5. http请求头、响应头文件详解

    HTTP Request Header 请求头   解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏 ...

  6. Linux中/proc目录下文件详解

    转载于:http://blog.chinaunix.net/uid-10449864-id-2956854.html Linux中/proc目录下文件详解(一)/proc文件系统下的多种文件提供的系统 ...

  7. Javascript 异步加载详解

    Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...

  8. PE文件详解(六)

    这篇文章转载自小甲鱼的PE文件详解系列原文传送门 之前简单提了一下节表和数据目录表,那么他们有什么区别? 其实这些东西都是人为规定的,一个数据在文件中或者在内存中的位置基本是固定的,通过数据目录表进行 ...

  9. PE文件详解(四)

    本文转自小甲鱼的PE文件详解系列原文传送门 到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到SectionTable (区块表,也成节表). ...

随机推荐

  1. ListView 连接数据库的增删改查

    private string link = "server=.;database=list;user=sa;pwd=123"; public void chaxun() //创建一 ...

  2. bzoj4127

    肯定是树链剖分+线段树,关键是怎么维护 绝对值和这个东西显然不能简单的合并标记 因为对于负数,加之后绝对值和是变小的 那我们考虑对负数和非负数数分别维护 下面的问题就是经过操作如果负数变成了正数怎么办 ...

  3. 【开发必备】吐血推荐珍藏的Chrome插件

    [开发必备]吐血推荐珍藏的Chrome插件 一:(Lying人生感悟.可忽略) 青春浪漫,往往难敌事故变迁.生命对每一个人都是平等的,彼此所经历的那就一定是彼此所必须经历的,它一定不是只为了折磨.消耗 ...

  4. HDU 1858 Max Partial Value I

    求连续子序列的最大和 为毛简单的入门DP没有思路啊.. 学习下别人的解法,理解起来倒还是很容易的. //#define LOCAL #include <iostream> #include ...

  5. MVC+Ef项目(2) 如何更改项目的生成顺序;数据库访问层Repository仓储层的实现

    我们现在先来看看数据库的生成顺序   居然是 Idal层排在第一,而 web层在第二,model层反而在第三 了   我们需要把 coomon 公用层放在第一,Model层放在第二,接下来是 Idal ...

  6. iso中AutoLayout和Autoresizing Mask的区别

    •在iOS6之前,关于屏幕旋转的适配和iPhone,iPad屏幕的自动适配,基本都是由Autoresizing Mask来完成的.但是随着大家对iOS App的要求越来越高,以及今后可能出现的多种屏幕 ...

  7. UVALive 5532 King(差分约束,spfa)

    题意:假设一个序列S有n个元素,现在有一堆约束,限制在某些连续子序列之和上,分别有符号>和<.问序列S是否存在?(看题意都看了半小时了!) 注意所给的形式是(a,b,c,d),表示:区间之 ...

  8. (六)6.16 Neurons Networks linear decoders and its implements

    Sparse AutoEncoder是一个三层结构的网络,分别为输入输出与隐层,前边自编码器的描述可知,神经网络中的神经元都采用相同的激励函数,Linear Decoders 修改了自编码器的定义,对 ...

  9. php flock注意事项

    对于实际的运用,必须将其添加到所有使用的文件脚本中 但注意:其函数无法再NFS或其他网络文件系统中使用也无法在多线程服务器API中使用.

  10. c# 修改appConfig文件节点

    配置文件对于程序的帮助是不可小视的,尤其是java工程师们,当然了,我这里说的是c#的配置文件.废话不多说了,直接上代码了,想必大家一看就会明白了 private string UpdateConfi ...