第一部分:HTTP协议之请求和响应

第一部分:HTTP协议之请求和响应


工具fiddler:http://www.telerik.com/fiddler

一、HTTP定义

协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则

超文本传输协议HTTP协议(Hyper Text Transfer Protocol是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器

最新版本:HTTP/1.1

二、请求和响应机制

实际上我们输入URL后,我们的浏览器给Web服务器发送了一个请求(Request, Web服务器接到请求(Request后进行处理,生成相应的响应(Response,然后发送给浏览器, 浏览器解析响应Response中的HTML,这样我们就看到了网页

如下图:

第一部分:HTTP协议之请求和响应


我们的Request 有可能是经过了代理服务器,最后才到达Web服务器的。

过程如下图所示

第一部分:HTTP协议之请求和响应

代理服务器就是网络信息的中转站,有什么功能

1. 提高访问速度, 大多数的代理服务器都有缓存功能。

2. 突破IP限制, 通过代理可以访问地区的服务器,扩展访问的范围

3. 隐藏身份,隐藏上网者的IP,以防受到攻击

一、URL详解

URL(Uniform Resource Locator) 地址用于描述一个网络上的资源,  基本格式如下

schema://host[:port#]/path/.../[?query-string][#anchor]

scheme               指定低层使用的协议(例如:http, https, ftp)

host                   HTTP服务器的IP地址或者域名

port#                 HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.cnblogs.com:8080/

path                   访问资源的路径

query-string       发送给http服务器的数据

anchor-             点值

例子:

http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff

Schema:                 http

host:                   www.mywebsite.com

path:                   /sj/test/test.aspx

Port:     默认80

Query String:           name=sviergn&x=true

Anchor:                 stuff

 

二、HTTP协议是无状态的连接

http协议是无状态的,同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。 为了解决这个问题, Web程序引入了Cookie机制来维护状态

多次请求:

1. 当你在浏览器输入URL http://www.cnblogs.com 的时候,浏览器发送一个Request去获取 http://www.cnblogs.com html.  服务器把Response发送回给浏览器.

2. 浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如图片,CSS文件,JS文件。

3. 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。

4. 等所有的文件都下载成功后。 网页就被显示出来了。

 

三、请求(Request消息

分为三个部分,请求行(Request line)、请求头(Request header)、请求体(Request  body

结构如下图:

第一部分:HTTP协议之请求和响应

案例一:GET方式访问fiddle官网

1、请求行(Request line):

GET http://fiddler2.com/r/?quickexec HTTP/1.1

2、请求头(Request line):

Accept: text/html, application/xhtml+xml, */*

Accept-Language: zh-CN

User-Agent: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

Accept-Encoding: gzip, deflate

Host: fiddler2.com

DNT: 1

Proxy-Connection: Keep-Alive

3、GET请求方式无请求体

案例二:POST方式登录百度账号

1、请求行(Request line):

POST http://www.baidu.com/ur/submit/urreward HTTP/1.1

2、请求头(Request line):

Accept: */*

Content-Type: application/x-www-form-urlencoded

X-Requested-With: XMLHttpRequest

Referer:http://www.baidu.com/#wd=fiddle&rsv_bp=0&tn=baidu&rsv_spt=3&ie=utf-8&rsv_sug3=4&rsv_sug4=660&rsv_sug1=5&rsv_sug2=0&inputT=24376

Accept-Language: zh-CN

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

Host: www.baidu.com

Content-Length: 375

DNT: 1

Proxy-Connection: Keep-Alive

Pragma: no-cache

Cookie: BAIDUID=92A467A9BC07780DAFEF2C3F308684BA:FG=1; H_PS_PSSID=4683_1439_5225_6056_4759_6017_5856_6099; BDUSS=NWRWtjRUJTSn5-elJCOVRFZkQ1Q1BmeWNWLVRKdE5zWnBhR2RzbjlOUjNDWGRUQVFBQUFBJCQAAAAAAAAAAAEAAAB3wkkpaHVhbmd5YzEyMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHd8T1N3fE9TLV; H_PS_TIPFLAG=O; H_PS_TIPCOUNT=2; BD_CK_SAM=1

3请求体(Request  body)(请求提一般是一些表单数据,位置在请求头空一格的下一行)

bsToken=63b4a892179eb97881d245d62162d475&asyn=1&info=pid%3Dse%26method%3Dsearch%26query%3Dfiddle%2Fpid%3Daladdin%26resourceid%3D80%26fetchkey%3Dfiddle%26method%3Dsearch%26query%3Dfiddle%2Fpid%3Daladdin%26resourceid%3D85%26fetchkey%3Dfiddle%26method%3Dsearch%26query%3Dfiddle%2Fpid%3Daladdin%26resourceid%3D19%26fetchkey%3D%26method%3Dsearch%26query%3Dfiddle&se=utf-8&ge=utf-8

 

一、响应(Response)的消息结构

Response消息的结构和Request消息的结构基本一样。 同样也分为三部分,第一部分叫Response line, 第二部分叫Response header,第三部分是body. headerbody之间也有个空行,  结构如下图

第一部分:HTTP协议之请求和响应


案例一:

1、响应行Response line

HTTP/1.0 200 OK

2、响应头Response header

Server: nginx/1.0.8

Date: Thu, 17 Apr 2014 07:14:49 GMT

Content-Type: application/octet-stream

Content-Length: 1782

Last-Modified: Thu, 17 Apr 2014 00:24:05 GMT

Accept-Ranges: bytes

X-Cache: MISS from proxybackup-vm118-81.pconline.cnc

X-Cache-Lookup: MISS from proxybackup-vm118-81.pconline.cnc:8080

X-Cache: MISS from intra-proxy-11-254.pconline.gz

X-Cache-Lookup: HIT from intra-proxy-11-254.pconline.gz:8080

Via: 1.0 proxybackup-vm118-81.pconline.cnc (squid/3.0.STABLE18), 1.0 intra-proxy-11-254.pconline.gz (squid/3.0.STABLE7)

Proxy-Connection: keep-alive

3、响应体Response body

MSCF����� ������,������� � ���OS��K��� � �� ���������DAA �safeup_url.ini������ � CK�X��d�

� �g([쐬"�e�a��'��{z��c�;� ��H���

案例二:

1、响应行Response line

HTTP/1.0 200 OK

2、响应头Response header

Server: JSP2/1.0.27

Date: Thu, 17 Apr 2014 09:28:30 GMT

Content-Type: text/javascript;charset=utf-8

Content-Length: 947

Expires: Thu, 15 May 2014 14:01:38 GMT

Cache-Control: max-age=2592000

X-Cache: MISS from intra-proxy-11-254.pconline.gz

X-Cache-Lookup: MISS from intra-proxy-11-254.pconline.gz:8080

Via: 1.0 intra-proxy-11-254.pconline.gz (squid/3.0.STABLE7)

Proxy-Connection: keep-alive

 

3、响应体Response body

MPC_Mgr.getPoiData({"content":[{"error_no":0,"tileid":"15_6163_1273","uid_num":4,"uids":[{"bound":{"xmax":12621969.43,"xmin":12621457.43,"ymax":2608644.23,"ymin":2608500.23},"catalog":"010C02","icon":{"x":12621529.43,"y":2608572.23},"name":"","type":"shangwudasha","uid":"273724fc9be7ff62c17da288"},{"bound":{"xmax":12623305.72,"xmin":12622705.72,"ymax":2608479.06,"ymin":2608335.06},"catalog":"010F0203","icon":{"x":12622777.72,"y":2608407.06},"name":"","type":"zhongyangjigou","uid":"b3e7276f8581ddffd618b7a4"},{"bound":{"xmax":12623347.18,"xmin":12622803.18,"ymax":2608237.47,"ymin":2608125.47},"catalog":"010A0301","icon":{"x":12622859.18,"y":2608181.47},"name":"","type":"ditie_guangzhou_0","uid":"c02e869dc90588150d0e6bdf"},{"bound":{"xmax":12622650.20,"xmin":12622138.20,"ymax":2609157.72,"ymin":2609013.72},"catalog":"010D01","icon":{"x":12622578.20,"y":2609085.72},"name":"","type":"xiaoxue_loupan","uid":"0b6f34a5efc9df9ce81e97f6"}]}]});

 

PSGETPOST方法区别

 

Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GETPOST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

我们看看GETPOST的区别

1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.  POST方法是把提交的数据放在HTTP包的Body.

2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.详细见:http://www.cnblogs.com/lengyuhong/archive/2012/02/04/2330130.html

3. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

PS响应的状态码:

Response 消息中的第一行叫做状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.

HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别

1XX  提示信息 表示请求已被成功接收,继续处理

2XX  成功 表示请求已被成功接收,理解,接受

3XX  重定向 要完成请求必须进行更进一步的处理

4XX  客户端错误 -  请求有语法错误或请求无法实现

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

 

常见的状态码:http://www.daqianduan.com/4280.html

1200 ok

最常见的就是成功响应状态码200了, 这表明该请求被成功地完成,所请求的资源发送回客户端

2302 found

重定向,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的Request

2301 found

客户请求的文档在其他地方,永久性跳转到新的URL

3304 Not Modified

代表上次的文档已经被缓存了还可以继续使用,

4400 Bad Request  客户端请求与语法错误,不能被服务器所理解

403 Forbidden 服务器收到请求,但是拒绝提供服务

404 Not Found请求资源不存在(输错了URL

5500 Internal Server Error 服务器发生了不可预期的错误

503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

 

一、响应头Request信息

 

Cache头域

1If-Modified-Since

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

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

2If-None-Match

作用: If-None-MatchETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用 本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能

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

3Pragma

作用: 防止页面被缓存, 在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样

Pargma只有一个用法, 例如: Pragma: no-cache

注意HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control

4Cache-Control

作用这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下

Cache-Control:Public   可以被任何缓存所缓存()

Cache-Control:Private     内容只缓存到私有缓存中

Cache-Control:no-cache  所有内容都不会被缓存

Client 头域

1Accept

作用: 浏览器端可以接受的媒体类型,

例如:  Accept: text/html  代表浏览器可以接受服务器回发的类型为 text/html  也就是我们常说的html文档,

如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)

通配符 代表任意类型

例如  Accept: */*  代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)

 

2Accept-Encoding

作用: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzipdeflate),(注意:这不是只字符编码);

例如: Accept-Encoding: gzip, deflate

 

3Accept-Language

作用: 浏览器申明自己接收的语言。 

语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5gb2312gbk等等;

例如: Accept-Language: en-us

 

4User-Agent

作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本.

我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神 奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息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)

5Accept-Charset

作用:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312utf-8(通常我们说Charset包括了相应的字符编码方案);

例如:

Cookie/Login 头域

Cookie:

作用: 最重要的header, cookie的值发送给HTTP 服务器

Entity头域

Content-Length

作用:发送给HTTP服务器数据的长度。

例如: Content-Length: 38

Content-Type

作用:发送给HTTP服务器数据的类型

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

Miscellaneous 头域

Referer:

作用: 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

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

Transport 头域

Connection

例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

例如:  Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

http1.1支持一个TCP连接多个Request请求。无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系

HTTP是一个无状态面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)

HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

 Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间

Host(发送请求时,该报头域是必需的)

作用请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的

例如我们在浏览器中输入:http://www.guet.edu.cn/index.html

浏览器发送的请求消息中,就会包含Host请求报头域,如下:

Hosthttp://www.guet.edu.cn

此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号


二、响应头Request信息

 

Cache头域

Date

作用:  生成消息的具体时间和日期

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

 

Expires

作用浏览器会在指定过期时间内使用本地缓存

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

 

Vary

作用:

例如: Vary: Accept-Encoding

 

Cookie/Login 头域

P3P

作用用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题

例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

 

Set-Cookie

作用: 非常重要的header, 用于把cookie 发送到客户端浏览器, 每一个写入cookie都会生成一个Set-Cookie.

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

Entity头域

ETag

作用:  If-None-Match 配合使用。 (实例请看上节中If-None-Match的实例)

例如: ETag: "03f2b33c0bfcc1:0"

 

Last-Modified:

作用: 用于指示资源的最后修改日期和时间。(实例请看上节的If-Modified-Since的实例)

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

 

Content-Type

作用:WEB服务器告诉浏览器自己响应的对象的类型和字符集,

例如:

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

Content-Type:text/html;charset=GB2312

Content-Type: image/jpeg

 

Content-Length

指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。

例如: Content-Length: 19847

 

Content-Encoding

WEB服务器表明自己使用了什么压缩方法(gzipdeflate)压缩响应中的对象。

例如:Content-Encodinggzip

 

Content-Language

作用: WEB服务器告诉浏览器自己响应的对象的语言者

例如: Content-Language:da

 

Miscellaneous 头域

Server:

作用:指明HTTP服务器的软件信息

例如:Server: Microsoft-IIS/7.5

 

X-AspNet-Version:

作用:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本

例如: X-AspNet-Version: 4.0.30319

X-Powered-By:

作用:表示网站是用什么技术开发的

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


Transport头域

Connection

例如: Connection: keep-alive   当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

例如:  Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

Location头域

Location

作用: 用于重定向一个新的位置包含新的URL地址

 实例请看304状态实例

 


转载于:https://my.oschina.net/caiz/blog/479136