标签:
万维网使用统一资源定位符URL(Uniform Resource Locator)来标志万维网上的各种文档,并使每一个文档在整个因特网的范围内具有唯一的标示符URL。HTTP(HyperText Transfer Protocol)超文本传送协议,是一个应用层协议,它使用TCP连接进行可靠的传送,它的URL的一般形式为:
http://<主机>:<端口>/<路径>
HTTP的默认端口号是80,通常可省略。
HTTP只关心一个功能:从Web服务器到Web客户端的超文本文件以及其他文件的传输。万维网的大致工作过程如下图:
每个万维网网点都有一个服务器进程,它不断地监听TCP的端口80,以便发现是否有浏览器向它发出连接建立请求。一旦监听到连接建立请求并建立TCP连接之后,浏览器就向服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。最后,TCP连接就被释放了。
下面我们来说明用户输入域名并点击确认后发生的事情:
1. 浏览器分析链接指向页面的URL;
2. 浏览器向DNS请求URL的IP地址;
3. DNS解析出URL的IP地址并返回;
4. 浏览器与服务器建立TCP连接;
5. 浏览器发出取文件命令:GET
6. 服务器给出响应,把指定文件发送给浏览器;
7. 释放TCP连接;
8. 浏览器显示页面中所有文本。
HTTP使用TCP来可靠传输,HTTP协议本身是无连接的,就是说,通信的双方在交换HTTP报文之前不需要先建立HTTP连接。HTTP协议是无状态的,同一个客户在第二次访问同一个服务器时,服务器的响应和第一次相同。无状态的设计简化了服务器的设计,使得服务器更加容易的支持大量并发的HTTP请求。
HTTP报文是简单的格式化数据块,每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应。HTTP报文由三个部分组成:对报文进行描述的起始行、包含属性的首部块、以及可选的、包含数据的主体部分。如下图:
图中的Content-Type说明了主体是什么,Content-Length说明了主体有多大。所有HTTP协议可以分为两类:请求报文和响应报文。如下图:
下面详细介绍每个部分。
所有的HTTP报文都以一个起始行作为开始。请求报文的起始行叫做请求行,响应报文的起始行叫做响应行。
请求行包含了一个方法和一个请求URL,方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法。请求行中还包含了HTTP的版本。
响应行包含HTTP版本、数字状态码以及描述操作状态的文本形式的原因短语。
HTTP规范中定义了一组常用的请求方法,来告知服务器要做些什么。如下图:
HTTP定义了一组被称为安全方法的方法。GET方法和HEAD方法都被认为是安全的,这就意味着GET或HEAD方法的HTTP请求不会在服务器上产生什么结果。
GET方法是最常用的方法,通常用于请求服务器发送某个资源。
HEAD方法与GET方法很类似,但服务器在响应中只返回首部,不会返回实体部分,其返回的首部部分和GET完全一样。使用场景如下:
1. 在不获取资源的情况下了解资源的情况,比如判断类型;
2. 通过查看响应的状态码,看看某个对象是否存在;
3. 通过查看首部,测试资源是否被修改。
PUT方法会向服务器写入文档。
POST方法起初是用来向服务器输入数据的,实际上它通常用来支持HTML表单,表单中填好的数据被发给服务器。
TRACE方法允许客户端在最终请求发送给服务器时,看看它变成了什么样子。那么为什么会产生差别呢?因为客户端发送请求时,这个请求有可能要穿过防火墙、代理、网关或其他中间节点导致被修改。TRACE请求会在目的服务器端发起一个环状回路,检测报文是否被修改或损坏。该方法同样可以用来诊断,查看代理和其他应用程序的效果。
OPTIONS方法请求服务器告知其支持的各种功能。
DELETE方法请求服务器删除请求URL所指定的资源,但是客户端无法保证删除一定会被执行,因为HTTP允许服务器在不通知客户端的情况下撤销请求。
方法是用来告诉服务器做什么事情,状态码则是用来告诉客户端发送了什么事情。如下图:
可以看到状态码被分为了五大类,这里我们详细介绍。
信息提示状态码
成功状态码
重定向状态码
重定向指的是资源被移走了,通知客户新的地址,如下图:
这里需要注意一下301和302的区别。302是暂时的重定向,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。301是永久的重定向,搜索引擎在抓取新内容的同时也会将旧的网址替换为重定向之后的网址。
那么现在举一个例子,从网址A做一个302重定向到网址B,服务器的意思是希望可以继续显示A的网址但是填充B的内容,可是由于种种原因,比如B的网址没有A的友好,所以搜索引擎可能仍然会显示网址A,那么黑客只需要将自己的网址A做一个302重定向到你的网址B,搜索引擎仍然显示网址A,但是是B的内容,这就叫网络URL劫持。之后你的网址在搜索引擎中就会降权。而且这种情况下自己无法直接解决问题,只能和搜索引擎联系来共同解决这个问题。
客户端错误状态码
有时候客户端会发送一些服务器无法处理的东西,比如格式错误的报文或者不存在的URL。很多客户端错误都是浏览器来处理的,只有少量错误比如404会穿过浏览器到达用户面前。
服务器错误状态码
首部和方法配合工作,共同决定了客户端和服务器能做什么事情。首部可以分为五类:通用首部、请求首部、响应首部、实体首部、拓展首部。
通用首部是客户端和服务器都可以使用的首部,比如Date首部,用来表示构建报文的时间和日期。
Connection Date MIME-Veraion TrailerTransfer-Encoding Update Via
常见通用首部如下图:
请求首部是请求报文特有的首部,为服务器提供一些额外的信息,比如客户端希望接受什么类型的数据等。
Client-IP From Host Referer UA-Color UA-CPUUA-Disp UA-OS UA-Pixels User-Agent
常见如下图:
Accept请求首部是专门提供客户端喜好的子集。
Accept Accept-Charset Accept-EncodingAccept-Language TE
常见如下:
条件请求首部是给请求加上限制,比如客户端已经有一份文档了,只希望服务器上的文档和客户端的有区别后才传输。
Expect If-Match If-Modified-SinceIf-None-Match If-Range If-Unmodified-Since Range
常见如下:
响应首部是响应报文特有的首部,为客户端提供信息。
Age Public Retry-After Server Title Warning
常见如下:
协商首部可以用来传递与可协商资源有关的信息。
Accept-Ranges Vary
安全响应首部
Proxy-Authenticate Set-Cookie WWW-Authenticate
实体首部是用来应对实体主体部分的首部。
实体的信息性首部
Allow Location
实体内容首部提供了与实体内容相关的特定信息。
Content-Base Content-EncodingContent-Language Content-length Content-Location Content-MD5 Content-RangeContent-Type
实体的缓存首部说明了如何或什么时候进行缓存,提供与被缓存实体有关的信息。
Etag Expires Last-Modified
拓展首部是非标准的首部,由应用程序开发者创建。
随着网络购物和网络银行业务的蓬勃发展,HTTP的安全性显得愈加重要。HTTPS是最流行的HTTP安全形式。HTTPS方案的URL以https://开头,而不是http://开头。使用HTTPS时,所有的HTTP请求和响应数据在发送到网络之前,都要进行加密。可以使用SSL或者TLS。
HTTP和HTTPS的传输过程对比如图:
可以看到,HTTTPS多了一个SSL安全参数握手,该过程中,客户端和服务器需要完成以下工作:
1. 交换协议版本号;
2. 选择一个双方都了解的密码;
3. 对两端身份认证;
4. 生成临时的会话密钥,以便加密信道。
至于SSL具体的工作原理,这里就不详细介绍了。
标签:
原文地址:http://blog.csdn.net/mevicky/article/details/46558225