Http协议

来源:互联网 发布:虎牙刷弹幕软件 编辑:程序博客网 时间:2024/06/02 01:58

一,Http请求组成:请求行,请求首部,空行,请求正文

1.1请求行:

格式如下:Method Request-URI HTTP-Version
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;

1.1.1,请求方法:

GET:对服务器资源的简单请求
POST:用于发送包含用户提交数据的请求
HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
PUT:传说当前请求文档的一个版本
DELETE:发送一个用来删除指定文档的请求
TRACE:发送请求的一个副本,以跟踪其处理进程
OPTIONS:返回所有可用的方法;可检查服务器支持哪些方法
CONNECT:用于ssl隧道的基于代理的请求

1.1.2,Http协议版本:
HTTP/0.9 :只接受GET一种请求方法,没有在通信中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
HTTP/1.0 :第一个在通信中指定的版本号,至今被广泛采用,特别是在代理服务器中。
HTTP/1.1 :当前版本号,持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

1.2请求首部:

定义:请求首部字段是从客户端到服务器发送请求报文中所使用的字段,里面包含了附加信息、客户端信息以及对响应内容相关的优先级等内容

例子:

Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:
gzip, deflate, sdch
Accept-Language:
zh-CN,zh;q=0.8
Cache- Control:
max-age=0
Connection:
keep-alive
Cookie:
CNZZDATA5152012=cnzz_eid%3D1860040457-1487294529-null%26ntime%3D1487294529; UM_distinctid=15c2005b4d18b6-0bdb37d843e833-3f73035d-1fa400-15c2005b4d25f4; CNZZDATA4810808=cnzz_eid%3D1318683231-1495185863-null%26ntime%3D1495185863; __gads=ID=e1b62132899ec8eb:T=1497431391:S=ALNI_MZ4g24B9TN9kvicQZ1h26-3XlhE0w; CNZZDATA1259029673=2095504379-1497613791-null%7C1497613791; CNZZDATA1254128672=270375234-1497863202-null%7C1497963992; __utma=226521935.473964416.1473209422.1495185864.1500600594.4; __utmc=226521935; __utmz=226521935.1500600594.4.3.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; sc_is_visitor_unique=rx7853846.1500600595.F4AF74F6DBC64F2D9BBA3C343BE337DF.1.1.1.1.1.1.1.1.1-10500913.1476419911.1.1.1.1.1.1.1.1.1; AJSTAT_ok_times=3; pgv_pvi=609022976; pgv_si=s6178769920; CNZZDATA1684828=cnzz_eid%3D1098538613-1501142814-null%26ntime%3D1501142814; _ga=GA1.2.473964416.1473209422; _gid=GA1.2.889639960.1500597072
Host:
www.cnblogs.com
If-Modified-Since:
Thu, 27 Jul 2017 08:28:18 GMT
Referer:
https://www.baidu.com/link?url=0W5DzPvzMoOWWzVEAYivhENcW8-sqCKwFV5w40hLP_gxxu59wstb7qW_75nnpkuohJ-kB3HO0dBeLOxb-mEES_&wd=&eqid=f409977a0000b80a000000035979a41f
Upgrade-Insecure-Requests:
1
User-Agent:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36

以下是部分字段:

1.2.1,Accept
通知服务器用户代理可处理的媒体类型及媒体类型的相对优先级,可使用type/subtype这种形式,一次指定多种媒体类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
q表示权重,默认值为1.0,当服务器提供多种内容时,将会有优先返回权重值最高的媒体类型
下面举几个例子:
文本文件:
text/html,text/plain,text/css...
application/xhtml+xml,application/xml...
图片文件:
image/jpeg,image/gif,image/png...
视频文件:
video/mpeg,video/quicktime...
应用程序使用的二进制文件
application/octet-stream,application/zip...

1.2.2,Accept-Encoding
告知服务器用户代理支持的内容编码及内容编码优先级顺序,可一次性指定多种内容编码
Accept-Encoding: gzip, deflate
常用的几种编码格式:
gizp:由文件压缩程序gzip(GUN zip)生成的编码格式
compress:由UNIX文件压缩程序compress生成的编码格式
deflate:组合使用zlib格式及由deflate压缩格式生成的编码格式
jdentity:不执行压缩或不会变化的默认编码格式
同样,这里可以使用q值表示相对优先级,也可以使用(*)作为通配符,指定任意的编码格式

1.2.3,Accept-Lanuage
告知服务器用户代理能够处理的自然语言集,以及其相对有限集,可一次指定多种自然语言集
同样可使用权重值q表示相对优先级

1.2.4,Cache-Control

指定了请求和响应遵循的缓存机制

[1] no-cache  ---- 不要读取缓存中的文件,要求向WEB服务器重新请求
[2] no-store    ---- 请求和响应都禁止被缓存
[2] max-age: ---- 表示当访问此网页后的max-age秒内再次访问不会去服务器请求,其功能与Expires类似,只是Expires是根据某个特定日期值做比较。一但缓存者自身的时间不准确.则结果可能就是错误的,而max-age,显然无此问题.。Max-age的优先级也是高于Expires的。
[3] max-stale  ---- 允许读取过期时间必须小于max-stale 值的缓存对象。 
[4] min-fresh ---- 接受其max-age生命期大于其当前时间 跟 min-fresh 值之和的缓存对象
[5] only-if-cached ---- 告知缓存者,我希望内容来自缓存,我并不关心被缓存响应,是否是新鲜的.
[6] no-transform   ---- 告知代理,不要更改媒体类型,比如jpg,被你改成png.

1.2.5,Connection

keep-alive:保持长连接,Http1.1默认打开

close:传输完成后断开连接

1.2.6,Cookie

用于维持服务端会话状态的,通常由服务端写入,在后续请求中,供服务端读取。

1.2.7,Host
告知服务器请求的资源所处的互联网主机名和端口号
Host首部字段是在HTTP/1.1规范内唯一一个必须被包含在请求内的首部字段

1.2.8,If-Modified-Since
条件请求,告知服务器若字段指定值早于资源更新时间,则希望能处理请求,如果在该字段指定的日期时间大于资源更新时间,则返回304Not Modified响应
用于确认代理或者客户端拥有的本地资源的有消息

1.2.9,Referer

告知服务器请求的原始资源的URI

1.2.10,Upgrade-Insecure-Requests

告诉服务器,自己支持这种操作,也就是我能读懂你服务器发过来的上面这条信息,并且在以后发请求的时候不用http而用https

1.2.11,User-Agent
该字段会将创建请求的浏览器和用户代理名称等信息传给服务器
如果由网络爬虫发起请求,可能会在请求中添加爬虫作者的电子邮件地址。因此,如果请求经过代理,那么中间也很可能被添加上代理服务器名称


二,Http响应组成:状态行, 响应首部, 空行, 响应正文

2.1状态行:协议版本,状态码,状态码描述    (例子: HTTP/1.1 200 OK) 

2.1.1状态码:

1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

例子:

200     OK    客户端请求成功
304     Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
400     Bad Request   由于客户端请求有语法错误,不能被服务器所理解。
401     Unauthonzed   请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
403     Forbidden   服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404     Not Found   请求的资源不存在,例如,输入了错误的URL。
500     Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
503     Service Unavailable   服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。

2.2响应首部

例子:

Cache- Control:
private, max-age=0, must-revalidate
Connection:
keep-alive
Content-Encoding:
gzip
Content-Type:
text/html; charset=utf-8
Date:
Thu, 27 Jul 2017 09:24:25 GMT
ETag:
W/"c10666db1c446e4c409c3b4c491edc42"
Keep-Alive:
timeout=20
Server:
openresty
Transfer-Encoding:
chunked
Vary:
Accept-Encoding
X-Powered-By:
PHP 5.4.28


Cache-Control:指定请求和响应遵循的缓存机制

Content-Encoding:文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

Content-Type:表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。

Date:当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

ETag:是实体标签(Entity Tag)的缩写.ETag一般不以明文形式相应给客户端。在资源的各个生命周期中,它都具有不值,用于标识出资源的状态。当资源发生变更时,如果其头信息中一个或者多个发生变化,或者消息实体发生变化,那ETag也随之发生化。

Keep-Alive:保持连接的时间.

Server:服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。

Transfer-Encoding:WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。例如:Transfer-Encoding: chunked

Vary:WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:Content-Encoding: gzip; Vary: Content-Encoding那么 Cache 服务器会分析后续请求消息的头部,检查其 Accept-Encoding,是否跟先前响应的 Vary 头部值一致,即是否使用相同的内容编码方法,这样就可以防止 Cache 服务器用自己 Cache 里面压缩后的实体响应给不具备解压能力的浏览器。例如:Vary:Accept-Encoding

X-Powered-By:用于告知网站是用何种语言或框架编写的.