目录
一、HTTP 简介
1、HTTP三点注意事项:
2、URI和URL和URN
二、HTTP 消息结构
客户端请求消息:
服务器响应消息:
三、HTTP 报文解析
1、请求行:
2、响应行:
3、方法:
4、状态码:
5、首部
6、持久连接
四、Cookie机制
五、HTTPS
1、HTTPS是基于SSL的HTTP
2、公开密钥加密
3、HTTP采用混合加密机制
4、数字证书
5、SSL和TLS
六、认证机制
七、代理、网关、隧道
八、参考资料
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
URI:统一资源标识符,用字符串标识某一互联网资源,而URL标识资源的地点(互联网上所处的位置),URL是URI的子集。
常见的URI例子:
http://www.baidu.com/index.html
ftp://1.1.1.1/text.txt
telnet://192.168.1.1
标准的URI协议有30种左右
URI格式:
URL:统一资源定位符,我们俗称为网址,网站URL,是资源标识符(URI)中最常见的形式,描述了一台特定服务器上某资源的特定位置。
demo: 网址为:http://www.baidu.com/index.html WEB文件在D:/web/index.html
相对URL(相对路径): 相对路径:顾名思义就是自己相对与目标位置。
绝对URL(绝对路径):绝对路径:是指文件在硬盘上真正存在的路径。
URN:URI的第二种形式(统一资源名),URN是作为特定内容的唯一名称使用的,处于实验阶段,未推广使用。
总结:URI=URL+URN
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成:
请求行:包含一个方法和一个请求URL,和HTTP的版本,这些字段都是由空格分割。
请求方法:客户端希望服务器对资源执行的动作。
协议版本:所使用的HTTP版本
HTTP抓包截图:
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
响应行:承载了状态信息和操作产生的结果数据,包含了响应报文使用的HTTP版本、数字状态码以及描述操作状态的文本形式的原因短语。
HTTP抓包截图:
请求行包括了一个方法和一个请求URL,这个方法描述了服务器应执行的操作,请求URL描述了要对哪个资源执行这个方法,还包含HTTP的版本,用来告知服务器,客户端使用的是哪种HTTP。
响应行包含了状态信息和操作产生的所有数据结果,将其返回给客户端。响应报文的起始行,称为响应行,包含了响应报文使用的HTTP版本、数字状态码,以及描述操作状态的文本形式的原因短语。
客户端希望服务器对资源执行的动作
GET:从服务器获取一份文档
HEAD:只从服务器获取文档得首部
POST:向服务器发送需要处理得数据
PUT:将请求的主体部分存储在服务器上
TRACE:对可能经过代理服务器传送到服务器上的报文进行追踪
OPTIONS:探测服务器支持哪些方法
DELETE:从服务器上删除一份文档
扩展方法:没有在http/1.1中定义的方法,称为webDAV HTTP扩展(由于扩展方法具有危险性,可以在服务器上添加、删除文件等,故一般站点不支持扩展方法)
COPY:用于在服务器上复制资源
MOVE:用于在服务器上移动资源
MKCOL:允许用户创建资源
LOCK:允许用户锁定资源
告诉客户端,服务器发生了什么事情
100-101 信息提示
200-206 成功
300-305 重定向
400-415 客户端错误
500-505 服务器错误
HTTP状态码共有60多种,常见的状态码(请牢记):
200:表示从客户端发来的请求在服务器端被正常处理了。
201:一般用于PUT方法上传文件,表示文件创建成功。
301:永久重定向,表示请求的资源已分配信的URI,以后使用该URI代替现在请求的URI。这时应按照Location字段重新保存URI。
302:临时重定向,和301类似,但资源不是被永久移动,只是临时的。
401:表示该请求需要有HTTP认证的认证信息,首次接受到401响应,浏览器会弹出认证的对话窗口。
403:表示该请求的资源服务器拒绝了,一般是该资源设置了权限。
404:表示该请求资源在服务器上无法找到。
500:表示服务器端在执行请求时发生了错误。
503:表示当前服务器超负载正在进行停机维护,目前无法处理请求。
请牢记常见的HTTP首部字段:
Accept:告诉服务器能够发送哪些媒体类型
Accept-Charset:告诉服务器能够发送哪些字符集
Accept-Encoding:告诉服务器能够发送哪些编码
Accept-Language:告诉服务器可以发送哪些语言
Accept-Ranges:对此资源来说,服务器可接受的范围类型
Authorization:包含客户端提供给服务器的认证数据,用于401中
Cookie:用户身份会话令牌,用于服务器标识客户端身份,因为HTTP是无状态的协议,需要引入cookie机制来进行有状态管理
Age:响应持续时间
Server:服务器应用程序的名称和版本
Set-Cookie:服务器返回给客户端的会话标识
Content-Length:主体的大小
Content-Type:主体的对象类型
Date:创建报文的时间
Host:请求资源所在的服务器
User-Agent:HTTP客户端程序的信息
Location:令客户端重定向到指定URL
Allow:资源可支持的HTTP方法
在事物处理结束后仍然保持打开状态的TCP连接被称为持久连接,可以加快速度传输,不同在重新TCP握手了。
HTTP/1.1默认情况下是持久连接的,要关闭持久连接,需要在HTTP报文中加入Connection:close首部。
由于HTTP是匿名、无状态的请求/响应协议,服务器处理客户端的请求,然后向客户端回送一条响应,但服务器无法通过协议判定是哪个用户发送的请求,也无法记录用户的请求序列。
1、有关用户相关信息的HTTP首部(请牢记):
From:用户的邮件地址
User-Agent:用户的浏览器信息
Referer:用户是从哪个页面跳转过来的
Authorization:用户名和密码认证
Client-IP:客户端的IP
X-Forwarded-For:客户端的IP
Cookie:服务器产生的会话令牌
可以看到,除了用Cookie首部,其他首部都无法有效的标识一个具体的用户(都可以伪造)。
Cookie分为两种:会话Cookie和持久Cookie
会话Cookie:是临时Cookie,记录在浏览器内存中,关闭浏览器,内存中的Cookie就删除了(但服务器端的对应Cookie还存在)
持久Cookie:存储在硬盘上,浏览器退出再打开依然存在,通过设置过期时间来进行控制
因为HTTP通信使用明文,可能会造成窃听以及篡改,且无法识别客户端与服务器身份,正是由于这些不安全的因素导致HTTPS产生。
HTTP+加密+认证+完整性保护=HTTPS
HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL和TLS协议替代而已。通常,HTTP直接与TCP通信,当使用SSL时,则变成先和SSL通信,再由SSL和TCP通信。在采用了SSL后,HTTP就拥有了HTTPS的加密证书和完整性保护功能。
SSL是独立于HTTP的协议,其他运行在应用层的SMTP和TELNET等协议都可配合该协议进行使用,是目前当前世界上应用最为广泛的网络安全技术。
近代加密方法中加密算法是公开的,而密钥是保密的,加密和解密都需要用到密钥,这样用同一个密钥的方式叫做对称密钥加密,那在互联网上发送密钥有被窃听的风险,但不发送密钥,对方不能解密。
公开密钥(非对称加密)加密方式很好的解决了对称加密的困难,公开密钥加密使用一对非对称的密钥,一把叫做私有密钥,一把叫做公开密钥,私有密钥自己保存,不能泄露,公开密钥任何人都可获得。
原理:发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,在使用自己的私有密钥进行解密,利用这种方式,不再需要发送用来解密的私有密钥,不必担心被窃听。
HTTPS采用共享密钥加密和公开密钥加密两者混合并用的混合加密机制。若密钥能够实现安全交换,那么就可考虑只使用公开密钥加密来通信,但公开密钥加密与共享加密相比,其处理速度较慢。
如何证明收到的公开密钥是正真的服务器发行的公开密钥呢?为了解决这个问题,使用由数字证书认证机构(CA)颁发的公开密钥证书。数字证书认证机构处于客户端与服务器端双方都可信赖的第三方机构的历程。
首先服务器的运营人员向数字证书认证机构提出公开密钥的申请,数字证书认证机构在判明提出的申请者的身份后,会对已被申请的公开密钥做数字签名,然后分配这个已知的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。服务器会将这份证书由数字认证机构颁发的公钥证书发送给客户都,进行公开密钥加密方式通信。接收到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦通过验证,客户端便可明确服务器身份。(多数浏览器厂商会内置常用的公开密钥)
SSL技术最初由网景通信公司提倡,开发过SSL3.0之前的版本,目前已转移到IETE的手中,IETR以SSL3.0为基础,又制定了TLS1.0、1.1、1.2。TSL是以SSL为原型开发的协议,所以统一称为SSL协议。当前主流的版本是SSL3.0和TLS1.0。
某些 Web 页面只想让特定的人浏览,或者干脆仅本人可见。为达到这个目标,必不可少的就是认证功能。
HTTP 使用的认证方式:
BASIC 认证(基本认证)
DIGEST 认证(摘要认证)
SSL 客户端认证
FormBase 认证(基于表单认证)
此外,还有 Windows 统一认证(Keberos 认证、NTLM 认证)
BASIC 认证
HTTP基本认证将用户名和密码打包在一起,并用Base-64编码方式进行编码,BASIC 认证虽然采用 Base64 编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,由于明文解码后就是用户 ID和密码,在 HTTP 等非加密通信的线路上进行 BASIC 认证的过程中,如果被人窃听,被盗的可能性极高。
HTTP通信时,除客户端和服务器外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道,它们可以配合服务器一起工作。
代理:是一种具有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”角色,接受客户端发送的请求并转发给服务器,同时也接受服务器返回的响应并转发给客户端,如我们常说代理IP上网。
使用代理服务器的理由有:利用缓存技术减少网络带宽的流量,进行上网访问控制,获取访问的日志等。
网关:也是转发其他服务器通信数据的服务器,接受从客户端发送来的请求时,它就像自己是服务器一样对请求进行处理,有时客户端不会查觉自己的通信目标是个网关。但是网关可以使通信线路上的服务器提供非HTTP协议服务,利用网关可以提高安全性,因为可以在客户端与网关之间的通信线路上加密保证数据安全,比如网关可以连接数据库,使用SQL语句查询数据。
隧道:是在相隔较远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序,隧道本身不会解析HTTP请求。
缓存:指代理服务器或客户端本地磁盘内保存的资源副本,利用缓存技术可减少对源服务器的访问,因此也就节省了通信流量和通信时间,缓存服务器是代理服务器的一种,并归类在缓存代理类型中,如目前流行的CDN技术。
请务必阅读并理解《图解HTTP》这本书,如果看完了想深入了解请参考《HTTP权威指南》这本书。该两本书脚本之家提供下载。