http协议总结笔记

2 篇文章 0 订阅
1 篇文章 0 订阅

http会话过程

一次普通的http会话过程

有代理服务器时的会话过程


URL(Uniform Resource Locator)

URL的格式为http://www.cnblogs.com:8080/

scheme://host[:port]/path/.../[;url-params][?query-string][#anchor]

方括号表示可选项目,其中:

scheme             指定协议(例如:http, https, ftp)

host                   服务器的IP地址或域名

port                   服务器的端口。http服务的默认端口是80,如果使用别的端口,必须指明,例如http://www.cnblogs.com:8080/

path                  资源路径

url-params        参数

query-string      发送给服务器的数据。多个数据之间以&连接

anchor              锚

例如,http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff


request的结构

请求方式(如GET,POST等) URI(要操作的资源) HTTP/http协议的版本号(这一行称为请求行)

字段1:值1

字段2:值2

...

字段N:值N(这几行称为请求头)

(空行)

[请求正文]

圆括号内的只是注释,所有的换行都是\r\n,即使没有请求正文也必须有空行。

例如,

GET /index.jsp HTTP/1.1

Host: www.javathinker.org

URI中开始的那个“/”表示服务器根目录。


请求方式

GET,POST,PUT,DELETE分别对应于资源的查,改,增,删四项基本操作。

GET资源的时候有时要先把少量数据发给服务器(比如登陆时),这些数据要放在URL的query-string中而不是请求正文中,例如EditPosts.aspx?name=test1&id=123456.

由于浏览器对URL的长度有限制,所以只能发送少量的数据。

另外,由于用户名和密码在URL中可见,所以翻看历史纪录就能够得知用户名和密码,因此,这样的GET请求有风险。

POST请求把要提交的数据放在请求正文中,对数据的长度无限制。


请求头

Host字段:指明服务器的域名和端口,同样的,如果端口是80则可以省略。

例如:Host:http://www.guet.edu.cn:8088

Content-Length字段:请求正文的长度。

例如,Content-Length: 38

Content-Type字段:请求正文向服务器提交时所采用的编码类型。

例如,Content-Type: application/x-www-form-urlencoded

User-Agent字段:客户端浏览器的名称和版本。

例如,User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

Accept字段:浏览器可以接受的资源类型。

例如,Accept: text/html,代表客户端可以接受text/html类型的资源,如果服务器无法返回text/html资源,则返回406 non acceptable.

*是通配符,一般浏览器发给服务器的都是Accept: */*,表示浏览器可以处理任何类型。

Accept-Encoding字段:为了节约带宽,服务器把数据发给客户端前先进行压缩,本字段给出客户端浏览器所支持的压缩编码方式。

例如,Accept-Encoding: gzip,deflate

Accept-Language字段:指明浏览器所接受的语言。

例如,Accept-Language: zh-cn

Accept-Charset字段:指明浏览器所接受的字符集。

例如,Accept-Charset: gb2312

注意语言和字符集不是一个概念,比如中文有多种字符集:big5,gb2312,gbk.

If-Modified-Since字段:浏览器缓存的页面的最后修改时间。

例如,If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

服务器会把它与服务器上实际文件的最后修改时间进行比对。如果时间一致,则返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

If-None-Match字段:上次请求该资源时,服务器response中的Etag字段值。

例如,If-None-Match: "03f2b33c0bfcc1:0"

如果服务器发现资源现在的Etag相比上次请求时没有改变,说明资源没更新,就返回304告诉客户端使用本地缓存文件,否则将返回200以及新的资源和Etag.

Cookie字段:通过本字段将所请求域名下的所有cookie发给服务器。

编码类型有两种,application/x-www-form-urlencoded(默认值)和multipart/form-data。前者主要用于向服务器发送表单数据,前者发送大量数据、包含非ASCII字符的文本和二进制数据时编码效率很低;而后者既可以发送文本数据,也可以发送二进制数据,提交文件时一般采用后者。

Referer字段:告诉服务器客户是从哪个页面点链接到达这里的。

例如:Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

如果在网页A上有网页B的链接,那么网页B所在的服务器就可以根据Referer字段统计出每天有多少人通过网页A进入网页B。

Connection字段:Connection: keep-alive表示本次会话完成后,TCP连接暂时先不要断,下次和这个服务器会话时还用这条连接,这样就省去了TCP连接建立和关闭的开销。连接保持的时间可以通过Keep-Alive字段指定,单位是秒,例如Keep-Alive: 300

HTTP/1.1中,keep-alive默认是开启的,HTTP/1.0中需要手动开启。

Connection: close表示本次会话完成后关闭TCP连接。

以上很多字段的值可能都会有多个,值与值之间用逗号分开,如果要表达对各个值的偏好程度,则在值的后面跟一个分号,再跟上q=多少。q值介于0-1之间,默认为1,q值越大表示越偏好。例如,Accept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c表示浏览器最喜欢text/html和text/x-c型资源,text/x-dvi也行,text/plain也能接受但是喜欢程度最低。


response的结构

HTTP/http协议的版本号 状态码 状态描述(这一行称为响应行)

字段1:值1

字段2:值2

...

字段N:值N(这几行称为响应头)

(空行)

[响应正文]

所有的换行都是\r\n,即使没有响应正文也必须有空行。


HTTP/1.1定义的状态码

1XX  请求已被成功接收,继续处理

2XX  成功,请求已被成功地接收,理解,并接受

3XX  重定向,要完成请求,客户端必须进行进一步处理

4XX  客户端错误,非法请求

5XX  服务器端错误,服务器未能实现合法的请求

常见的状态码:

200 OK

302 Found,重定向,新的URL在响应头的Location字段给出,浏览器将会用新的URL重新发出request

304 Not Modified,上次缓存完文件之后,文件并没有改变,缓存文件还可以用

400 BadRequest,request的语法有误,服务器无法理解

403 Forbidden,服务器理解请求,但是拒绝提供服务

404 Not Found,请求的资源不存在,一般是URI输错了

500 Internal Server Error,服务器发生了不可预知的错误,一般是服务器源码有误

502 Bad Gateway,作为网关或代理的服务器执行请求时,从上游服务器收到无效的响应

503 Service Unavailable,服务器当前不能处理客户端的请求,过一段时间后可能恢复正常。可能是由于服务器过载引起的


响应头

Date字段:产生响应的时间。

例如,Date: Sat, 11 Feb 2012 11:35:14 GMT

Expires字段:响应过期的时间,在此之前浏览器都会使用本地缓存。

例如,Expires: Tue, 08 Feb 2022 11:35:14 GMT

Location字段:需要重定向时在本字段指明新的URL.

Content-Length字段:响应正文的长度,以字节为单位,十进制表示。

例如,Content-Length: 19847

Content-Type字段:服务器返回数据的类型和字符集。

例如,Content-Type: text/html; charset=utf-8

Content-Type: image/jpeg

Content-Encoding字段:服务器返回数据的压缩方式(gzip,deflate)。

例如,Content-Encoding: gzip

Content-Language字段:服务器返回数据的语言。

例如,Conent-Language: zh

Last-Modified字段:资源最后修改的日期和时间。

例如,Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

Etag字段:前面If-None-Match那里说过了。

Set-Cookie字段:用于把cookie发送到客户端浏览器。

例如,Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

可以连续地使用Set-Cookie字段向客户端浏览器发cookie.

Server字段:指明服务器的软件信息。

例如,Server: Microsoft-IIS/7.5

X-AspNet-Version字段:如果网站是用ASP.NET开发的,用本字段给出ASP.NET的版本。

例如,X-AspNet-Version: 4.0.30319

X-Powered-By字段:指明网站是用什么技术开发的。

例如,X-Powered-By: ASP.NET

Connection字段:Connection: keep-alive和Connection: close的用法和请求头一样。


参考资料:HTTP协议详解,http://kb.cnblogs.com/page/130970/

HTTP HEADER详解,http://www.open-open.com/lib/view/open1342064478859.html

更多关于请求头、响应头字段的详细介绍参见http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值