首页 > 代码库 > HTTP协议小结
HTTP协议小结
HTTP/0.9
已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
HTTP/1.0
这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。
HTTP/1.1
当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
持久链接:1.1的Connection的默认值是keep-alive, 1.0默认值是close非持久链接
HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:
缓存处理
带宽优化及网络连接的使用
错误通知的管理
消息在网络中的发送
互联网地址的维护
安全性及完整性
统一资源标识符:
http://
username:passwd
@www.un.org
/subdir/file.html
?var=value&var2=value2
#hash
http://username:passwd@www.un.org/subdir/file.html?var=value&var2=value2#hash
其中#hash等额外参数 只能发送到前端浏览器,服务器获取不到, 可以用js获取 发送到服务器
HTTP/1.1协议中共定义了八种方法(也叫“动作”),方法名称是区分大小写的,来以不同方式操作指定的资源:
OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用‘*‘来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部份(内容体)。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法
POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
HTTP 请求
格式:
Request line
GET /dir/1.html HTTP/1.1
请求方法 资源位置 协议版本
HTTP headers
通用 header 、请求 header、实体 header
Content
HTTP Response
格式:
Status line
HTTP/1.1 200 OK
HTTP headers
通用 header、响应 header、实体 header
Content
<html>...</html>
响应值:
100-199:参考信息
200-299:成功
300-399:重定向
400-499:客户端错误
500-599:服务器错误
请求 header:
1,Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
参数为 Content Type
q 指定优先级[0-1],0为不接受,默认为1
如果不指定 */* ,则其他类型优先级为0
Accept表示浏览器支持的 MIME 类型;
MIME的英文全称是 Multipurpose Internet Mail Extensions(多功能 Internet 邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。
text/html,application/xhtml+xml,application/xml 都是 MIME 类型,也可以称为媒体类型和内容类型,斜杠前面的是 type(类型),斜杠后面的是 subtype(子类型);type 指定大的范围,subtype 是 type 中范围更明确的类型,即大类中的小类。
2,Accept-Charset: 浏览器支持的字符编码
utf-8;q=0.66,*;q=0.6
3,Accept-Encoding: 浏览器支持的压缩编码
gzip,deflate,sdch
4,Accept-Language: 浏览器所支持的语言类型
zh-CN,zh;q=0.8,en;q=0.6 优先顺序,中文简体,
zh-cn表示简体中文;zh 表示中文
5,Authorization: 授权验证
Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
401 Unauthorized
使用HTTP AUTH需要在server端配置http auth信息(一般是webserver启动的时候从配置文件里面读取相关信息)。
用中文简述一下http auth的过程:
客户端发送http请求
服务器发现配置了http auth,于是检查request里面有没有"Authorization"的http header
如果有,则判断Authorization里面的内容是否在用户列表里面,Authorization header的典型数据为"Authorization: Basic jdhaHY0=",其中Basic表示基础认证, jdhaHY0=是base64编码的"user:passwd"字符串。
如果没有,或者用户密码不对,则返回http code 401页面给客户端
标准的http浏览器在收到401页面之后,应该弹出一个对话框让用户输入帐号密码;并在用户点确认的时候再次发出请求,这次请求里面将带上Authorization header
一次典型的访问场景是:
浏览器发送http请求(没有Authorization header)
服务器端返回401页面
浏览器弹出认证对话框
用户输入帐号密码,并点确认
浏览器再次发出http请求(带着Authorization header)
服务器端认证通过,并返回页面
浏览器显示页面
使用http auth的场景不会用cookie,也就是说每次都会送帐号密码信息过去。然后我们都知道base64编码基本上等于明文。这削弱了安全。
由于种种缺点,http auth现在用的并不多。不过在路由器等场合还是有应用的,原因是http auth最简单,使用起来几乎是零成本。
6,Cookie: HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。
version=1; skin=new;
百度首页请求头中的cookie
Cookie BDUT=pfc827A04BCD53A0082260624BACA0F9A50A13b031e70272;
MCITY=-131%3A; BAIDUID=16FFD38173B664490E853F05898831CA:FG=1;
BDUSS=VibW5hdW53dk5iM0ZzekFBcUZiVGxaaHJxUUJ2Z2FzdGl2OHpuLUVSR2xGeUJUQVFBQUFBJCQAAAAAAAAAAAEAAACvU9En5~Hn9wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWK-FKlivhSMT;
H_PS_PSSID=5222_6552_6249_1455_5224_6582_6505_6477_4759_6017_6461_6428_6456_6501_6454_6529_6375;
BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1
7,User-Agent: Mozilla/5.0 (compatible;域名)
意思:使用的用户代理是 Mozilla/5.0 (compatible; 域名)。
详解:
User-Agent(用户代理),简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
Mozilla/5.0:Mozilla 是浏览器名,版本是 5.0;
compatible(兼容的)表示平台是兼容模式;
8,Host: 域名
Host表示请求的服务器网址;
9,TE: 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息
trailers, deflate
10,Referer: 先前网页的地址,当前请求网页紧随其后,即来路
http://www.sijiaomao.com/
11,Expect:指客户端要求的特殊服务器行为。若服务器不能理解或者满足 Expect域中的任何期望值,则必须返回417(Expectation Failed)状态
100-continue
12,From:发出请求的用户的Email
genesis@sijiaomao.com
14,If-Match:如果对象的 ETag 没有改变,其实也就意味着对象没有改变,才执行请求的动作
"aetaghash"
15,If-None-Match: 如果对象的 ETag 改变了,其实也就意味着对象也改变了,才执行请求的动作。
"aetaghash"
16,If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答,告诉浏览器该对象没有修改
Sun, 11 May 2014 05:39:55 GMT
17,If-Unmodified-Since:如果请求的内容在指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
Sun, 11 May 2014 05:39:55 GMT
18,If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。 浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。
"aetaghash"
Sun, 11 May 2014 05:39:55 GMT
19,Max-Forwards: 限制信息通过代理和网关传送的时间
2
20,Proxy-Authorization:连接到代理服务器的授权证书
Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
21,Range:只请求实体的一部分,指定范围
bytes=0-499, 1000-1499, 3000-
22,X-Requested-With: 在服务器端判断request来自Ajax请求还是传统请求
XMLHttpRequest
23,X-Forwarded-For: 是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段
client1, proxy1, 192.168.2.125
这一HTTP头一般格式如下:
X-Forwarded-For: client1, proxy1, proxy2
其中的值通过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。
鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。
响应 header:
1,Accept-Ranges: 表明服务器是否支持指定范围请求及哪种类型的分段请求
bytes
2,Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
231
3,Content-Disposition: Content-Disposition 属性是作为对下载文件的一个标识字段
attachment; filename="example.zip"
Content-Disposition属性有两种类型:inline 和 attachment
inline :将文件内容直接显示在页面
attachment:弹出对话框让用户下载具体例子
4,ETag:请求变量的实体标签的当前值,对象被修改,ETag也会改变,主要供服务器 判断一个对象是否改变了。
"abcdthisisatag"
5,Location:用来重定向接收方到非请求URL的位置来完成请求或标识新的资源
http://www.un.org
6,Refresh: 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
3; url=http://www.sijiaomao.com/
7,Retry-After: 如果实体暂时不可取,通知客户端在指定时间之后再次尝试
Tue, 15 Nov 2014 08:12:31 GMT
200
8,Server:web服务器软件名称
"Apache/2.4.2 (Unix)"
9,Set-Cookie: 设置Http Cookie
name=cat; domain=.sjm.org; path=/; expires=Tue, 21 May 2014 12:34:56 GMT; secure
10,Vary:告诉下游代理是使用缓存响应还是从原始服务器请求
Accept-Language, User-Agent
通用 header
1,Cache-Control: Cache-Control指定请求和响应遵循的缓存机制
max-age=600, no-cache="Set-Cookie"
在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。
请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,
响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。
网页的缓存通过HTTP消息头中的“Cache-control”来控制,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。
其作用根据不同的重新浏览方式分为以下几种情况:
(1)打开新窗口如果指定cache-control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如: Cache-control: max-age=5 表示当访问此网页后的5秒内再次访问不会去服务器。
(2)在地址栏回车如果值为private或must-revalidate(和网上说的不一样),则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。
(3)按后退按扭如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问。
(4)按刷新按扭无论为何值,都会重复访问 当指定Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。
2,Connection: Keep-Alive
Connection表示客户端与服务连接类型;
Keep-Alive,表示持久连接;
close,请求一次后立即关闭
3,Date: 原始服务器消息发出的时间
Tue, 21 May 2002 12:34:56 GMT
4,Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝,相当于 Cache-Control: no-cache。
no-cache
5,Keep-Alive:保持连接
300
6,Trailer: 指出头域在分块传输编码的尾部存在
Date
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
Trailer: Date
05
line1
05
line2
0
Date: Tue, 21 May 2012 12:34:56 GMT
7,Transfer-Encoding: 文件传输编码
chunked(分块)
8,Upgrade: 允许服务器指定一种新的协议或者新的协议版本,与响应编码101(切换协议)配合使用。
HTTP/2.0
TLS/1.0
9,Via: 通知中间网关或代理服务器地址,通信协议
192.168.11.12, example.com
proxy1, proxy2
10,Warning: 关于消息实体的警告信息
199 Miscellaneous warning
110 Response is stale
112 Disconnected operation
...
实体 header
1,Allow: 对某网络资源的有效的请求行为,不允许则返回405
GET, HEAD, POST
2,Content-MD5: 返回资源的MD5校验值
ZTFmZDA5MDYyYTMzZGQzMDMxMmIxMjc4YThhNTMyM2I=
3,Content-Range:在整个返回体中本部分的字节位置
600-900/1234
4,Content-Encoding: web服务器支持的返回内容压缩编码类型。
gzip
5,Content-Language:响应体的语言
zh_CN
6,Content-Length:响应体的长度
8848
7,Expires: 响应过期的日期和时间
Tue, 21 May 2016 12:34:56 GMT
8,Last-Modified:请求资源的最后修改时间
Tue, 21 May 2013 12:34:56 GMT