从一道题引发的思考
HTTP的诞生
在深入了解HTTP之前,先介绍HTTP诞生的背景。cern的timbernersLee 提出一种能让远隔两地的研究者们共享知识点的设想。
网络基础 TCP/IP
通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集。
TCP/IP协议族按层次分为以下4层
应用层
应用层决定了向用户提供应用服务时通信的活动。
TCP/IP协议族预存了各类通用的应用服务,比如,FTP(file transfer protocol,文件传输协议)和
DNS(Domain Name system)域名系统服务就是其中两类。HTTP协议也处于该层。
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。
在传输层中有两个性质不同的协议:TCP(传输控制协议)和UDP(用户数据报协议)
- 网络层(又名网络互联层)
网络层用来处理在网络上流动的数据包。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。
- 数据链路层(又名网络接口层)
用来处理连接网络的硬件部分。包括控制操作系统,硬件的设备驱动,NIC(网络适配器,即网卡),及光纤等物理可见部分,
利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往应用层往下走。发送端每通过一层则增加首部,接收端每通过一层则删除首部。
TCP位于传输层,提供可靠的字节流服务
负责域名解析的DNS服务
DNS和HTTP协议以一样位于应用的协议。它提供域名到IP地址之间的解析服务
URI和URL
与URI(统一资源标识符)相比,我们更熟悉URL(统一资源定位符)。URI用字符串标识某一互联网资源,而URL表示资源的地点。可见URL是URI的子集。
简单的HTTP协议
请求访问文本或图像资源等的一端称为客户端,而提供资源响应的一端称为服务端
请求报文由 请求方法,请求URI,协议版本,可选请求首部字段和内容实体构成的。
响应报文由协议版本,状态码(表示请求成功或失败的数字代码),用以解释状态码的原因短语,可选的响应首部字段以及实体主体构成。
HTTP是不保存状态的协议(即无状态协议)
HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
这样是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。
为了解决这种无状态的问题,于是引入了cookie技术。有了cookie再用HTTP协议通信,就可以管理状态了。
告知服务器意图的HTTP方法
GET 获取资源
POST 传输实体主体
PUT 传输文件
HEAD 获取报文头部
DELETE 删除文件
OPTIONS 询问支持的方法
TRACE 追踪路径
CONNECT 要求用隧道协议连接代理
因为PUT 和 DELETE方法一样不带验证机制,任何人都可以进行操作,所以存在安全性。不常用
持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP链接,如果要请求一个包含很多图片资源的网站,会进行很多次TCP的连接和中断,增加通信量的开销。
为了解决上述问题,HTTP/1.1和一部分HTTP/1.0想出了持久连接(也成为HTTP keep-alive)
管道化
持久连接使得多数请求以管道化(pipelining)方式发送成为可能。从前发送请求后需要等待并收到响应。管道化技术的出现解决了不用等待响应亦可直接发送下一个请求。
管道化技术要比持久连接还要快。
使用cookie的状态管理
cookie技术通过在请求和响应报文中写入cookie信息来控制客户端的状态。
cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端在往该服务器发送请求时,客户端会自动在请求报文中加入cookie值后发送出去
HTTP报文内的HTTP信息
HTTP报文大致可分为报文首部和报文主体两块。
报文主体和实体主体的差异
报文(message)是HTTP通信的基本单位。由8位组字节流组成,通过HTTP通信传输。
实体(entity)作为请求或响应的有效载荷数据被传输,其内容由实体首部和实体主体组成。
通常,报文主体等于实体主体,只有当传输过程中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
压缩传输的内容编码
常见的内容编码有以下几种
- gzip(GNU zip)
- compress(UNIX系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分割发送的分块传输编码
这种把实体主体分块的功能称为分块传输编码
分块传输编码会将实体主体分为多个部分(块)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
发送多种数据的多部分对象集合
多部分对象集合包含的对象如下
multipart/form-data
在web表单文件上传时使用
multipart/byteranges
状态码206响应报文包含了多个范围的内容时使用
*获取部分内容的范围请求**
要实现该功能需要指定下载的实体范围,像这样,指定范围发送的请求叫做范围请求。
内容协商返回最合适的内容
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言,字符集,编码方式等作为判断的基准。
包含在请求报文中的某些首部字段就是判断的基准。
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商技术有以下3中类型
- 服务器驱动协商
- 客户端驱动协商
- 透明协商
返回结果的HTTP状态码
2XX 成功
200 ok 表示从客户端发来的请求在服务器端已被正常处理
204 No Content 请求处理成功,但没有资源可返回
206 partial content 该状态码表示客户端进行了范围请求 而服务器成功执行了这部分的get请求
3XX 重定向
301 moved permanently
永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
302 Found
临时重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
303 see other
临时重定向。该状态码表示请求的资源存在着另一个URI,应使用get方法定向获取请求的资源。
304 Not Modified
该状态码表示客户端发送附带条件的请求时,服务器允许请求访问资源。
307 Temporary Redirect
临时重定向。该状态码与302 Found有着相同的含义。
4XX 客户端错误
400 Bad Request
该状态码表示请求报文中存在语法错误。
401 Unauthorized
该状态码表示发送的请求需要有HTTP认证的认证信息。
403 Forbidden
该状态码表明对请求的资源的访问被服务器拒绝了
404 Not Found
该状态码表示请求的资源无法再服务器上找到
5XX 服务器错误
500 Internal Server Error
该状态码表示服务器端在执行请求时发生了错误。也可能是web应用存在的bug或某些临时的故障。
503 Service Unavailable
该状态码表明服务器暂时处于超负载或正在停机维护,现在无法处理请求。
与HTTP协作的web服务器
HTTP/1.1允许一台HTTP服务器搭建多个web站点。即使物理层面只有一台服务器,但只要使用虚拟主机的功能,则可以假象已具有多台服务器。
在相同的IP地址下,由于虚拟主机可以寄存多个不同的主机名和域名的web网站,因此在发送HTTP请求时,必须在host首部内完整指定主机名或域名的URI
通信数据转发程序:代理、网关、隧道
这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。
代理
代理是一种有转发功能的应用程序,他扮演了位于服务器和客户端“中间人”的角色,接收有客户端发送的请求并转发给服务器,同时也接受服务器返回的响应并转发给客户端。
每一次通过代理服务器转发给请求或响应时,也会写入Via首部信息,用来标记经过的主机信息。
使用代理的理由有,利用缓存技术减少网络宽带的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
代理有多种使用方法,按两种基准分类,一种是否使用缓存技术,另一种是否会修改报文。
网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求处理。
网关的工作机制和代理十分相似,而网关能使通信线路上的服务器提供非HTTP协议服务。利用网关可以提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。
隧道
隧道是在相隔深远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
隧道的目的是确保客户端能与服务器进行安全的通信。
保存资源的缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本,利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
即使存在缓存,也会因为客户端的要求,缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失败,缓存服务器将会再次从源服务器上获取“新”资源。
HTTP首部
HTTP协议的请求和响应报文中必定包含HTTP首部
HTTP报文首部
HTTP请求报文由方法,URI,HTTP版本,HTTP首部字段等部分构成
HTTP响应报文由HTTP版本,状态码(数字和原因短语)HTTP首部字段等3部分构成。
HTTP首部字段
HTTP首部字段是由字段名和字段值构成的,中间用冒号“:”分割;
首部字段名:字段值
如Content-Type: text/html
HTTP首部字段根据实际用途被分为以下4中类型。
- 通用首部字段
- 请求首部字段
- 响应首部字段
- 实体首部字段
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分为2种类型
端到端首部(End-to-end Header)
逐跳首部(Hop-by-hop header)
下面列举了HTTP/1.1中的逐跳首部字段。除了这8个首部字段之外,其他所有字段都属于端到端首部字段。
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
HTTP/1.1通用首部字段
cache-control
通过指定首部字段cache-control的指令,就能操作缓存的工作机制
connection
connection首部字段具有如下两个作用
- 控制不再转发给代理的首部字段
- 管理持久连接
Date
首部字段Date表明创建HTTP报文的日期和时间
Pragma
pragma是HTTP/1.1之前的版本历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义
Tralier
首部字段会事先说明在报文主体后记录了哪些首部字段。
Transfer-Encoding
规定了传输报文主体采用的编码方式
Upgrade
用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议
Via
为了追踪客户端与服务器之间的请求和响应报文的传输路径
Waring
通常会告知用户一些与缓存相关的问题的警告
确保Web安全的HTTPS
在HTTP协议中有可能存在信息窃听或身份伪装等安全问题,使用HTTPS通信机制可以有效地防止这些问题。
HTTP的缺点
HTTP主要由以下不足:
- 通信食用明文(不加密),内容可能被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
这些问题不仅在HTTP上出现,其他未加密的协议中也会存在这类问题。
通过和SSL(secure socket layer 安全套接层)或TSL(安全层传输协议)的组合使用加密HTTP的通信内容。
HTTP+加密+认证+完整性保护 = HTTPS
我们把添加了加密方式及认证机制的HTTP称为HTTPS(HTTP Secure)
HTTPS是身披SSL外壳的HTTP
SSL采用一种佳作公开密钥加密(public-key cryptography)的加密处理方式
这种加密方法中加密算法是公开的,而密钥却是保密的。
HTTPS采用混合加密机制
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。
证明公开密钥正确性的证书
HTTPS的安全通信机制
为什么不一直使用HTTPS
原因有,因为与纯文本通信相比,加密通信会消耗更多的CPU及内存资源。因此,如果是非敏感信息则使用HTTP通信。只有在包含个人信息等敏感数据时,才会利用HTTPS加密通信。
除此之外,想要节约购买证书的开销也是原因之一。
确定访问用户身份的认证
为了认证使用者的信息,通常是指以下这些:
- 密码(只有本人才会知道的字符串信息)
- 动态令牌:仅限本人持有的设备内显示一次性密码
- 数字证书:仅限本人(终端)持有的信息
- 生物认证:指纹和虹膜等本人的生理信息
- IC卡等:仅限本人持有的信息
HTTP使用的认证方式
HTTP/1.1使用的认证方式如下
- BASIC认证(基本认证)
- DIGEST认证(摘要认证)
- SSL客户端认证
- FormBase认证(基于表单认证)
为减轻跨站脚本攻击(XSS)造成的损失,建议事先在Cookie内加上httponly属性
基于HTTP的功能追加协议
消除HTTP瓶颈的SPDY
若想在现有的Web实现所需的功能,以下这些HTTP标准就会成为瓶颈
- 一条连接上只能发送一条请求
- 请求只能从客户端开始。客户端不可以接收除响应以外的指令。
- 请求/响应首部未经压缩就发送。首部信息越多延迟越大
- 发送冗长的首部。每次互相发送相同的首部造成的浪费较多
- 可热议选择数据压缩格式。非强制压缩发送。
Ajax的解决方法
Ajax是一种javascript和DOM的操作,以达到局部web页面替换加载的异步通信手段。而利用Ajax实时地从服务器获取内容,有可能会导致大量请求产生。
Comet的解决方法
一旦服务器端有内容更新了,comet不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务器端向客户端推送(Server Push)的功能。
内容上虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间,为了维持连接会消耗更多的资源。
SPDY的设计与功能
SPDY以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立通信连接。
使用SPDY后,HTTP协议额外获得以下功能:
- 多路复用流 通过单一的TCP连接,可以无限制处理多个HTTP请求。
- 赋予请求优先级
- 压缩HTTP首部
- 推送功能
- 服务器提示功能
使用浏览器进行全双工通信的WebSocket
一旦web服务器与客户端之间建立websocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON,XML,HTML或图片等任意格式的数据
WebSocket协议的特点
- 推送功能
- 减少通信量 为了实现Websocket,在HTTP连接建立之后,需要完成一次“握手”的步骤
期盼已久的HTTP/2.0
HTTP/2.0的特点
- SPDY
- HTTP Speed + Mobility
- Network-Friendly HTTP Upgrade
HTTP/2.0 的7项技术及讨论
- 压缩
- 多路复用
- TSL义务化
- 协商
- 客户端拉拽/服务器推送
- 流量控制
- websocket
Web服务器管理文件的WebDAV
WebDAV(基于万维网的分布式创作和版本控制) 是一个可对Web服务器上的内容直接进行文件复制,编辑等操作的分布式文件系统。
除了创建、删除等基本功能外,他还具备文件创建者管理,文件编辑过程中禁止其他用户内容覆盖的加
锁功能,以及对文件内容修改的版本控制功能。
构建Web内容的技术
HTML
CSS
JAVASCRIPT
与Web服务器及程序协作的CGI
CGI(通用网关接口)是指Web服务器在接收到客户端发送过来的请求后转发给程序的一组机制。在CGI的作用下,程序会对请求内容做出相应的动作。
针对web的攻击技术
对Web应用的攻击模式有以下两种
- 主动攻击 具有代表性的攻击是SQL注入攻击和OS命令注入攻击
- 被动攻击 具有代表性的攻击是跨站脚本攻击(XSS)和跨站点请求伪造(CORS)
实施web应用的安全对策可大致分为以下两部分。
- 客户端的验证
- web应用端(服务器端)的验证
输入值验证
输出值转义