前言

B/S网络架构的核心是HTTP,掌握HTTP对一个从事互联网工作的程序员来说非常重要。要理解HTTP,最重要的是要熟悉HTTP的HTTP Header,HTTP Header控制着互联网上成千上万用户的数据传输。最关键的是,它控制着用户浏览器的渲染行为和服务器的执行逻辑。例如,当服务器没有用户请求的数据的时候就会返回一个404状态码,告诉浏览器没有要请求的数据,通常浏览器就会展示一个非常不愿意看到的该页面不存在的错误信息。OK,接下来开始对于HTTP的学习。

HTTP是什么

HTTP,英文全称为HyperText Transfer Protocol,即超文本传输协议,是互联网上应用最为广泛的一种网络协议。HTTP是一种属于应用层的面向对象的协议,一次HTTP操作称为一个实物,其简单工作过程如图:

其工作过程可以分为四步:

1、首先客户端与服务器需要建立连接,只需要单击某个超级链接,HTTP的工作开始

2、建立连接后,客户端发送一个请求给服务器(默认请求服务器的80端口),请求方式的格式为:统一资源标识符(URL)+协议版本号+MIME信息包括请求修饰符、客户端信息和可能的内容

3、服务器接收到请求后,给予响应的相应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后面是MIME信息包括服务器信息、实体信息和可能的内容

4、客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户端和服务器断开连接

以上的过程中任意一步出错,那么产生的错误信息将返回到客户端,由显示屏输出。对于用户来说,这些过程都是HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。HTTP协议的主要特点可以概括如下:

1、支持客户端/服务器模式

2、简单快速,客户端向服务器发送请求服务时,只需要传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度快

3、灵活,HTTP允许传输任意类型的数据对象,正在传输的类型由Content-Type加以标记

4、无连接,无连接的含义是限制每次连接只处理一个请求,服务器处理完成客户端的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间

5、无状态,HTTP协议是无状态协议,无状态是指协议对于事物处理没有记忆能力,血少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传输的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

HTTP请求头

请  求  头 说      明
Accept 指定客户端能够接收的内容类型,如Accept:text/plain,text/html
Accept-Charset 指定客户端可以接受的字符集编码,如Accept-Charset:UTF-8
Accept-Encoding 指定浏览器可以支持的Web服务器返回内容压缩编码类型,如Accept-Encoding:gzip,deflate
Accept-Language 指定浏览器可以接受的语言,如Accept-Language:zh-cn,zn,en
Authorization HTTP授权的授权证书,如Authorization:Basic...
Cache-Control 指定请求和响应遵循的缓存机制,如Cache-Control:no-cache
Connection 表示是否需要持久连接(HTTP1.1默认进行持久链接),如Connection:close
Cookie HTTP请求发送时会把保存在该请求域名下的所有cookie值一起发送给Web服务器,如Cookie:$Version=1;Skin=new;
Content-Length 表示请求的请求体的内容长度,这个长度是经过了压缩后的长度,如Content-Length:348
 Content-Type 表示请求的请求体对应的MIME信息,如Content-Type:application/x-www/form-urlencoded 
 Date 表示请求发送的日期和时间,如Date:Oct, 24 Nov 2015 20:12:30 GMT
 Host 表示请求的服务器的域名和端口号,如Host:home.cnblogs.com
 Pragma 表示用来包含实现特定的指令,如Pragma:no-cache 
 Referer 表示从哪个链接链到当前地址,如Referer:http://www.cnblogs.com/ 
 User-Agent 表示发出请求的用户信息(如用户操作系统、浏览器和其他属性),如User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64)

一个HTTP请求头的例子,比如我访问了我的空间:

HTTP响应头

响  应  头 说      明
Allow 表示对某网络资源的有效请求行为,不允许则返回405,如Allow:GET,HEAD
Cache-Control 表示告诉所有的缓存机制是否可以缓存及哪种缓存类型,如Cache-Control:no-cache
Content-Encoding 表示Web服务器只是的返回内容压缩编码类型,如Content-Encoding:gzip
Content-Language 表示响应体的语言,如Content-Language:en,zh
Content-Length 表示响应体的内容长度,这个长度是经过了压缩后的长度,如Content-Language:348
Content-Type 表示返回内容的MIME类型,如Content-Type:text/html;charset=utf-8
 Date 表示原始服务器消息发出的时间,如Date:Oct, 24 Nov 2015 20:12:30 GMT
 Expires 表示响应过期的日期和时间,如Expires:Sat, 24 Oct 2015 20:45:30 GMT 
Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源,如Location:http://www.sina.com.cn/
 Last-Modified 表示资源的最后修改时间,如Last-Modified: 表示响应过期的日期和时间,如Expires:Sat, 24 Oct 2015 20:45:30 GMT 
 Retry-After 表示如果响应体如果暂时不可取得,客户端在指定时间之后再尝试,如Retry-After:120 
 Server 表示Web服务器软件名称,如Server:Apache/1.3.6(Unix) 
Set-Cookie  表示设置Http Cookie,如Set-Cookie:UserID=RickyXu;Max-Age=3600;Version=1 
 Transfer-Encoding 表示文件传输编码,如Transfer-Encoding-chunked 
www.Authenticate  表示客户端请求实体应该使用的授权方案,如WWW-Authenticate:Basic 

一个HTTP响应头的例子,比如我访问了我的空间:

最后几个"X-"开头估计是有特殊用途而通过代码设置到HTTP HEADER里面去的内容

HTTP状态码

列举一下常见的HTTP状态码:

状  态  码 语      法
200 表示客户端请求成功,通常这表示服务器提供了请求的网页
201 表示客户端请求成功并且服务器创建了新的资源
202 表示服务器已经接受请求但尚未处理
204 表示服务器成功处理了请求但没有任何返回内容
302 表示临时跳转,跳转的地址通过Location指定
400 表示客户端请求有语法错误,不能被服务器识别
403 表示服务器收到请求,但是拒绝提供服务
404 表示服务器找不到请求的资源
500 表示服务器发生了不可预期的错误
503 表示服务器目前无法使用(由于超载或停机维护),通常这只是暂时状态
505 表示服务器不支持请求中所使用的HTTP协议版本

HTTP缓存

想想现在的大型网站,随便一个页面都是一两百个请求,每天PV量过千万、过亿,如果没有缓存,用户体验会急剧下降,同时服务器压力和网络带宽都面临严重的考验。

缓存分为服务端缓存和客户端缓存,客户端缓存一般指的是浏览器缓存,目的就是加速各种静态资源的访问。浏览器缓存有两种机制:HTML Meta标签和HTTP HEADER信息。

1、HTML META标签

浏览器缓存机制主要是HTTP协议定义的缓存机制(如Expires、Cache-Control等),但是也有非HTTP协议定义的缓存机制,如使用HTML META标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下:

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

上述代码的作用是告诉浏览器当前页面不被缓存,每次访问都需要去服务器读取。使用上很简单,但只有部分浏览器支持,而且所有缓存代理服务器都不支持,因为代理不解析HTML内容本身,而广泛应用的还是HTTP HEADER信息来控制缓存。

2、HTTP HEADER信息

当使用了HTTP HEADER信息来控制缓存,那么浏览器第一次请求时:

浏览器再次请求时:

几个重要的概念:

(1)Expires策略

Expires策略是Web服务器响应消息头字段,在响应HTTP请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据而无须再次请求。不过Expires策略在HTTP1.1基本忽略,因为Expires返回的到期时间是服务器的时间,如果客户端和服务器的时间相差很大,那么误差就很大。

(2)Cache-Control策略

Cache-Control策略与Expires策略的作用一致,都是致命当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发送请求到服务器取数据。只不过Cache-Control的选择更多、被各浏览器支持得更好、设置得更细致,如果同时设置的话,其优先级也比较高(高于Expires),Cache-Control的选择有:

选    择 作    用
public 表示响应可被任何缓存区缓存,在响应头中设置
private 表示对于单个用户的整个或部分响应消息,不能被共享缓存处理,在响应头中设置
no-cache 表示请求或响应消息不被缓存,在请求头和响应头中都可以设置
no-store 表示防止重要的信息被无意发布,所有内容都不会被缓存到缓存中或者Internet临时文件中,在响应头中设置
must-revalidate/proxy-revaliate 表示如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证,在请求头中设置
max-age=xxx 表示缓存的内容将在xxx秒后失效,这个选项只有HTTP1.1可用,在响应头中设置

Pragma是为了兼容HTTP1.0,它的的作用和Cache-Control是一样的。

如果我们使用Ctrl+F5组合件刷新一个页面时,那么在HTTP请求头中会增加一些信息,它告诉服务器我们要获取的是最新的数据而不是缓存。

HTTP解析的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  3. Html Agility Pack 解析Html

    Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面  用Fir ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  6. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  7. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  8. 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye

    一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...

  9. SQL Server 数据加密功能解析

    SQL Server 数据加密功能解析 转载自: 腾云阁 https://www.qcloud.com/community/article/194 数据加密是数据库被破解.物理介质被盗.备份被窃取的最 ...

  10. .NetCore中的日志(1)日志组件解析

    .NetCore中的日志(1)日志组件解析 0x00 问题的产生 日志记录功能在开发中很常用,可以记录程序运行的细节,也可以记录用户的行为.在之前开发时我一般都是用自己写的小工具来记录日志,输出目标包 ...

随机推荐

  1. jQuery将悬停效果加到菜单项

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 在CMMI推广过程中EPG常犯的错误(转)

    本文转自: http://developer.51cto.com/art/200807/86953.htm 仅用于个人收藏,学习.如有转载,请联系原作者. ---------------------- ...

  3. 基类用的this指针

    结论:基类构造函数中的this指针指向的是派生类的对象 测试代码: #include <iostream> using namespace std; class father; fathe ...

  4. 几个开源XMPP Android客户端简单比较

      想做个基于xmpp的即时通讯工具,服务端已经基本成型了.当然需要客户端需要配合,PC端基于spark进行改造,手机端先从Android入手(IOS估计一个人是搞不过来了). 原本Android开发 ...

  5. xenomai for at91

    http://www.at91.com/linux4sam/bin/view/Linux4SAM/RealTime#Xenomai

  6. DIV页面布局,开局代码

    DIV页面布局,开局代码 主要是style部分和body部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN ...

  7. 怎么计算Oracle的表一条记录占用空间的大小

    如何计算Oracle的表一条记录占用空间的大小? 如何计算Oracle的表记录占用空间的大小? 是把所有字段的大小都加起来吗?varchar(256),char,number算几个字节? ------ ...

  8. win7下Arduino Mega 2560驱动安装失败解决办法

    因为玩四轴用的apm的飞控板,而其需要安装此驱动,曾经在win8使用其,但是因为win8有相对应的数字证书保护措施(应该是这样的,因为好久了记不清楚了),以至于我每次都需要长按shift重启电脑关闭此 ...

  9. .net配置文件读取

    public static string LogPath { get { return AppSettingValue(); } } public static string AppSettingVa ...

  10. 【记忆化搜索】bzoj1652 [Usaco2006 Feb]Treats for the Cows

    跟某NOIP的<矩阵取数游戏>很像. f(i,j)表示从左边取i个,从右边取j个的答案. f[x][y]=max(dp(x-1,y)+a[x]*(x+y),dp(x,y-1)+a[n-y+ ...