HTTP协议
HTTP学习总结:
1.HTTP协议简介;
2.与HTTP协作的web服务器;
3.HTTP报文;
4.HTTP报文首部;
5.HTTP报文首部字段;
1.HTTP协议简介:
HTTP(超文本传输协议)协议用于客户端与服务器之间的通信。
通信方式:通过客户端请求与服务器响应;
客户端请求方式:GET,POST,PUT,HEAD,DELET,OPTIONS,TRACE,CONNECT (详见下表);
定位资源方式:请求的URI; 例如: GET http://hackr.jp/index.htm HTTP/1.1
通信状态:不保存状态,协议本身不具备保存之前发送过的请求或响应的功能,(借助COOKIE);
连接状态:每进行一次HTTP通信就要断开一次TCP连接,可借助持久连接(keep-alive)和管线化(pipelining),(目前都默认设置);
持久连接:只要任意一端没有明确提出断开连接,则保持TCP连接状态;
管线化:同时并行发送多个请求;
客户端请求方式:
方法 | 说明 | 支持HTTP协议 |
GET | 获取资源 | 1.0/1.1 |
POST | 传输实体主体 | 1.0/1.1 |
PUT | 传输文件(无验证机制,一般不采用) | 1.0/1.1 |
HEAD | 获得报文首部(只返回报文首部) | 1.0/1.1 |
DELET | 删除文件(无验证机制,一般不采用) | 1.0/1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径(会引发跨站追踪,不常用 | 1.1 |
CONNECT | 要求用隧道协议连接代理(SSL和TLS) | 1.1 |
2.与HTTP协作的web服务器
HTTP通信时,除客户端和服务器之外,还有一些用于通信数据转发的应用程序,例如代理,网关,隧道。配合服务器工作。
代理 | 转发功能,客户端与服务器之间可有多个代理 | 缓存代理:减少服务器压力, |
网关 | 同代理类似,并且可以提供非HTTP协议服务 | 利用网关可以提高通信的安全性 |
隧道 | 建立安全的通信线路,配合SSL加密等手段进行通信 | 可以安全和远距离服务器安全通信 |
3.HTTP报文:
用于HTTP协议交互的信息被称为HTTP报文.
简单的请求报文和响应报文实例
4.报文首部
HTTP协议的请求和响应报文中必定包含HTTP首部。
首部内容为客户端和服务器分别处理请求和响应提供所需要的信息。
请求报文首部:请求行,首部字段(请求首部字段,通用首部字段,实体首部字段)
请求行:方法,URI,HTTP版本组成, 例如:GET http://hackr.jp/index.htm HTTP/1.1
响应报文首部:状态行 ,首部字段(响应首部字段,通用首部字段,实体首部字段)
状态行:HTTP版本,状态码组成, 例如: HTTP/1.1 200OK
常用状态码有如下:
类型 | 状态码 | 解释 |
信息性状态码 | 1XX | 服务器接受请求,继续处理 |
成功状态码 | 200 OK | 请求处理成功,并返回资源(响应报文中含有实体主体) |
200 No Content | 请求处理成功,但没有资源可返回。(响应报文中无实体主体) | |
206 Partial Content | 客户端进行了范围请求,服务器成功执行并返回 | |
重定向状态码 | 301 Moved Permanently | 永久性重定向,资源URI重新分配 |
302 Found | 临时性重定向,资源URI临时分配 | |
303 See Other | 请求资源存在另一个URI,希望能够以GET方式重新请求新的URI | |
301,302,303情况下所有浏览器会把POST改为GET, 并删除请求报文主体,之后请求会动再发送。 | ||
304 Not Modified | 资源已找到,但未满足条件 | |
307 Temporary Redirect | 临时重定向,和302相似,但处理响应时,每个浏览器情况不一样 | |
客户端错误状态码 | 400 Bad Request | 请求报文中存在语法错误 |
| 401 Unauthorized | 未经过HTTP认证(BASIC认证,DIGEST认证) |
403 Forbidden | 不允许访问 | |
404 Not Found | 服务器上没有请求的资源 | |
服务器错误状态码 | 500 Internal Server Error | 服务器端执行时发生错误,也许web应用存在bug |
503 Service Unavailable | 服务器暂时超负载或停机维护 | |
504 Gateway Timeout | 为网关或代理的服务器,没有及时从源服务器收到响应(超时) |
注意:状态码和状况不一致的情况,比如web应用程序内部发生错误,状态码依然返回200ok,这样情况也经常遇到。
状态码用途:多用作判断,比如AJAX异步请求数据时,就需要用到200判断,只有成功了才会处理服务器返回的数据。
5.报文首部字段
在客户端与服务器之间以HTTP协议进行通信的过程中,无论是请求还是响应都会使用首部字段,它能起到传递额外重要信息的作用。
首部字段结构:字段名和字段值构成,中间用冒号“:”分隔,字段值对应单个HTTP首部字段可以有多个值。 (如果字段名重复,根据不同浏览器会有不同处理,应避免重复)
四种基本首部字段种类: 通用首部字段,请求首部字段,响应首部字段和实体首部字段。
还包括为COOKIE服务首部字段和其他自行扩展的常用首部字段。
通用首部字段:(请求和响应都会使用)
通用首部字段名 | 说明 |
Cache-Control | 控制缓存的行为 |
Pragma | no-cache(兼容1.0版本的缓存指令) |
Connection | 连接管理 |
Date | 创建报文的日期时间 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Ugrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误处理 |
通用首部字段详解:
Cache-Control 缓存,指令多通过控制缓存服务器进行缓存操作
客户端角度 | 服务器角度 | |
是否能缓存 | no-store 不缓存请求内容 | no-store 不缓存响应内容 |
public 所有用户都可以利用缓存服务器进行缓存 | ||
private 缓存服务器只对该特定用户提供资源缓存的服务 | ||
缓存期限和认证指令 | no-cache 不要缓存过期的资源 | no-cache 缓存服务器不缓存过期资源,每次使用需向源服务器确认 |
max-age=[秒] 判断缓存服务器上缓存资源的缓存时间比指定时间小,则直接使用缓存,否则请求源服务器 | max-age=[秒] 如果缓存时间小于指定之间,缓存服务器将不对资源的有效性再做确认,可以直接使用。 | |
max-stale(=[秒]) 接收过期缓存资源,如果未指定参数值,无论过期多久都可接收,如果指定参数值,则即使过期,只要在指定时间内,缓存任可接收。 | ||
min-fresh=[秒] 缓存服务器上在指定缓存时间内的的资源才能返回, | ||
s-maxage=[秒] 同max-age=[秒] 指令相同, s-maxage只适用于供多位用户使用的的公共缓存服务器。对于同一用户重复响应的服务器来说,该指令没有作用。 当使用s-maxage后,会直接忽略Expires和max-age指令操作。 | ||
only-if-cached 表示只接受是被缓存的内容 | ||
缓存认证指令 | must-revalidate 缓存代理可缓存,但必须再向源服务器进行验证是否有效 | |
proxy-revalidate 要求所有的缓存服务器响应缓存前必须再次验证缓存的有效性。 | ||
缓存代理其它操作 | no-transform 请求时缓存不能改变实体主体的媒体类型,防止缓存或代理压缩图片等类似操作。 | no-transform 响应时缓存不能改变实体主体的媒体类型,防止缓存或代理压缩图片等类似操作。 |
扩展 | cache-extension 创建新指令,仅对能理解新指令的缓存服务器才有意义 | cache-extension 创建新指令,仅对能理解新指令的缓存服务器才有意义 |
版本兼容性: HTTP/1.1 版本会优先处理max-age而忽略Expires指令, HTTP/1.0相反。0
Pragma:属于通用首部字段,但只在客户端使用,仅仅对缓存向HTTP/1.0版本兼容
Pragma:no-cache; 仅对仅对缓存向HTTP/1.0版本兼容 |
Cache-Control:no-cache; (该指令针对HTTP/1.1版本, |
Connection:管理持久连接和不再转发代理的首部字段名
指令 | 客户端或服务器说明 |
不再转发的首部字段名 | 请求或响应内,第一个代理或删除Connection后的字段名和值再转发。 |
close | 客户端或服务器主动断开连接。 |
keep-alive | 客户端或服务器建立持久连接(HTTP/1.1版本默认都是持久连接 |
Date:表明创建HTTP报文的日期和时间
Date格式如下: |
Date: Tue,03 Jul 2012 04:40:59 GMT |
Date: Tue,03-Jul-12 04:40:59 GMT |
Date: Tue Jul 03 04:40:59 2012 |
Trailer:报文主体后首部字段一览
Trailer: Expires;
…..
Expires: Tue, 28 Sep 2014 23:59:59 GMT
Trailer会事先说明报文主体后记录了哪些首部字段,该首部字段可因公在HTTP/1.1版本分块传输编码。
Transfer-Encoding:规定了传输报文主体时采用的编码方式。
HTTP/1.1的传输编码方式仅对分块传输编码有效。
Transfer-Encoding: chunked;
Upgrade:用于检测HTTP协议及其他协议是否使用更高的版本进行通讯。
Upgrade: TLS/1.0;
Connection:Upgrade;
Upgrade首部字段仅限于客户端和邻接服务器,因此多配合Connection一起使用。
Via:可以追踪客户端与服务器的请求和响应报文的传输路径。
报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发。
经常会和TRACE方法一起使用。
Warning:通常会告知用户一些与缓存相关的问题的警告。
格式:[警告码][警告的主机:端口号] “[警告内容]” ([日期时间])
例如:Warning: 113 gw.hackr.jp:8080 “Heuristic expiration” Tue,03 Jul 2012 05:09:44 GMT
警告码 | 警告内容 | 说明 |
110 | Response is stale (响应已过期) | 代理返回已过期的资源 |
111 | Revalidation failed(再验证失败) | 代理再验证资源有效性时失败 |
112 | Disconnection opration(断开连接操作) | 代理与互联网连接被故意切断 |
113 | Heuristic expiration(试探性过期) | 响应的使用期超过24小时 |
199 | Miscellaneous warning(杂项警告) | 任意的警告内容 |
214 | Transformation applied(使用了转换) | 代理对内容编码或媒体类型等执行了某些处理时 |
299 | Miscellaneous perisistent warning(持久杂项警告) | 任意的警告内容 |
请求首部字段:请求首部字段是从客户端往服务器发送请求报文中所使用的字段,
用于补充请求的附加信息,客户端信息,对优先级内容相关的优先级等内容。
请求首部字段 | 常见字段值 | 说明 | |
客户端信息 | User-Agent | Mozilla/5.0 | 客户端信息,也有可能会添加上代理服务器的信息 |
Form | info@hackr.jp | 用户的电子邮箱地址 | |
客户端可支持 | Accept | text/html;q=0.9 | 客户端可处理的媒体类型,接收多内容时,可加q权限值, |
资源的要求 | Accept-Charset | unicode-1-1;q=0.8 | 客户端支持的字符集及优先级 |
Accept-Encoding | gzip;q=0.8,deflate;q=0.7 | 客户端支持的(报文主体)内容编码及优先级 | |
TE | gzip,deflate;q=0.5 | 客户端能够处理响应的传输编码方式及相对优先级 | |
Accept-Language | zh-cn,zh;q=0.7, | 客户端支持的语言集 | |
客户端条件请求 | If-Match | “123456” | 比较实体标记Etag,匹配一致服务器才会接收请求, |
Etag和时间 | If-None-Match | * (星号匹配所有Etag) | 比较实体标记Etag,无法匹配服务器才会接收请求, 在GET/POST方法中使用该字段,可获取最新资源,与If-Modified-Since类似 |
If-Modified-Since | Thu,15 Apr 2004 00:00:00 GMT | 如果在指定日期时间后资源发生了更新,服务器才会接收请求 | |
If-Unmodified-Since | Thu,15 Apr 2004 00:00:00 GMT | 如果在指定日期时间后资源未发生了更新,服务器才会接收请求 | |
If-Rang Range | If-Rang:”123456” Range: bytes=2000-5000 | If-Rang字段值后跟的Etag值或更新时间与服务器上的资源匹配成功, 则返回指定Range范围的资源,如果匹配不成功,则返回全部。 | |
客户端认证信息 | Authorization | Basic dwvub3jgoanogoirg== | Web认证信息(多在401状态码响应后发送) 客户端与源服务器认证 |
Proxy-Authorization | Basic dwvub3jgoanogoirg== | Web认证信息, 客户端与代理服务器之间认证 | |
附加服务器信息 | Host | www.hackr.jp | 请求资源所在服务器域名(统一服务器区分多个域名) |
Referer | http://www.hackr.jp/index.html | 告知服务器请求的原始资源的URI | |
Expect | 100-continue | 期待服务器的特定行为 | |
Max-Forwards | 10 | 表示请求可经过的服务器最大数目,由最后一个服务器响应请求, 方便查找中途哪个服务器除了问题。 |
响应首部字段:响应首部字段是服务器端向客户端响应报文中所使用的字段,
用于补充响应的附加信息,服务器信息,以及对客户端的附加要求等信息。
响应首部字段 | 常见字段值 | 说明 | |
服务器信息 | Server | Apache/2.2.6 (Unix) PHP/5.2.5 | 告知客户端服务器相关信息 |
资源的条件请求 | Accept-Ranges | bytes/none | 告知客户端服务器是否能处理范围请求,bytes表示可以,none表示不可以 |
Age | 600[单位为秒] | 告知客户端源服务器在多久前建立了响应 如果为缓存服务器,则告知客户端缓存向源服务器认证后经过的时间, 代理创建响应时,必须加上首部字段Age | |
Etag | “usagi-1234”(强Etag值) w/"usagi-1234”(弱Etag值) | 资源标示,强Etag值:无论实体发生任何改变,Etag值都会改变 弱Etag值:只有实体发生根本改变Etag值才会改变,只用于提示资源是否相同 | |
认证信息 | Proxy-Authenticate | Basic realm=”Usagidesgin Auth” | 把代理服务器所要求的认证信息发送给客户端 |
WWW-Authenticate | Basic realm=”Usagidesgin Auth” | 用于HTTP访问认证 | |
访问控制 | Location | http://www.usagidesign.jp | 告知客户端请求重定向 |
Retry-After | 120 (具体时间秒数或指定时间) Wed, 04 Jul 2012 06:34:24 GMT | 告知客户端多久之后再次发送请求 | |
缓存控制 | Vary | Accept-Language | 源服务器告知缓存服务器,只能对相同自然语言的请求返回缓存 |
实体首部字段:实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,
用于补充内容的更新时间等与实体相关的信息。
服务器角度 | |
实体主体 | Content-Type: text/html 告知客户端实体主体内对象的媒体类型 |
基本信息 | Content-Language: zh-CN 告知客户端实体主体的自然语言 |
Content-Enconding: gzip 告知客户端服务器对实体的主体内容选用的压缩格式 | |
Content-Length: 15000 告知客户端实体主体部分的大小(若采用压缩传输,则不能再使用Content-Length 字段,计算方法复杂。 | |
Content-Location: http://www.hackr.jp/index-ja.html 报文主体部分相对应的URI,如:访问http://www.hackr.jp/ 返回的却是 http://www.hackr.jp/index-ja.html | |
Content-Range: bytes 5001-10000/10000 客户端范围请求时服务器返回指明范围 | |
Last-Modified: Web,23 May 2012 08:26:05 GMT 告知客户端资源最后修改的时间 | |
Content-MD5: 检测报文主体在传输过程中是否完整,(不过似乎并不完全可靠) | |
服务器支持方法 | Allow: GET,HEAD 告知客户端服务器所能够支持的HTTP方法 |
控制缓存 | Expires: Web,04 Jul 2012 08:26:05 GMT 源服务器告知缓存服务器缓存到期时间 |
为COOKIE服务的首部字段:Set-Cookie(响应首部字段)和Cookie(请求首部字段)
Set-cookie: status=enable; expires=Tue,05 Jul 2011 07:26:31 GMT; path=/; domain=.hackr.jp;secure; HttpOnly
属性 | 说明 |
NAME = VALUE | 赋予Cookie的名称和其值(必须项) |
expires = DATE | |
path=PATH | 将服务器上的文件目录作为Cookie的使用对象(若不指定,默认为文档所在的文件目录) (效果不佳) |
domain = 域名 | 作为Cookie适用对象的域名,(若不指定则默认为创建Cookie的服务器的域名) |
Secure | 仅在HTTPS安全通信时才会发送Cookie |
HttpOnly | 加以限制,使Cookie不能被JavaScript脚本访问,防止跨站脚本攻击(XXS)对Cookie的信息窃取 |
一旦Cookie从服务器端发送至客户端,服务器就不能显示删除Cookie,可通过设置Cookie为过期而使其失效。
Cookie: status=enable; 请求首部字段的Cookie会告知服务器端Cookie的相关信息。
其它扩展常用首部字段:HTTP首部字段是可以自行扩展的。
字段名 | 常见字段值 | 说明 | |
请求首部 | DNT | 0 (同意被追踪) 1 (拒绝被追踪) | DNT(Do Not Track) 拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。 |
响应首部 | X-Frame-Options | DENY(拒绝) / SAMEORIGIN (同源域名允许) | 控制网站内容在其它Web网站的Frame标签内的显示问题 |
响应首部 | X-XSS-Protection | 0 (将XSS过滤设置成无效状态) 1 (将XSS过滤设置成有效状态) | 针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关 |
响应首部 | P3P | CP=”CAO DSP LAW ……………” | 利用P3P(The Platform for Privacy Perferences在线隐私偏好平台)技术,可以让web网站上的个人隐私变成一种仅供程序可理解的形式,保护用户隐私。 |