HTTP报文中的HTTP信息
- 用于http协议交互的信息称为http报文,请求端的http
- 报文叫做请求报文,响应端的叫做响应报文
- http报文大致可以分为首部和主体两部分
首部内容
请求行
包含用于请求的方法,请求URI和http版本
状态行
包含表明响应结果的状态码,原因短语和http版本
首部字段
包含表示请求和响应的各种条件和属性的各类首部
一般有4种首部,分别是通用首部,请求首部,响应首部和实体首部。
编码提升传输效率
常用的内容编码
- gzip
- compress
- deflate(zlib)
- identify(不进行编码)
分块发送的分块传输编码
分块传输编码:将实体主体分成多个部分,每一块都用十六进制来标记块的大小,实体主体的最后一块使用“0(CR+LF)”来标记
使用分块传输编码的实体主体由接收的客户端负责解码,恢复到编码前的实体主体
http/1.1中存在一种称为传输编码的机制,可以在通信时按某种编码方式传输。
发送多种数据的多部分对象集合
多部分对象集合包含的对象
- multipart/form-data:在web表单文件上传时使用
- multipart/byteranges:状态码206,响应报文包含了多个范围的内容时使用
使用boundary字符串来划分多部分对象集合指明的各类实体
获取部分内容的范围请求
指定范围发送的请求叫做范围请求
执行范围请求时会用到首部字段Range来指定资源的byte范围
针对范围请求,响应会返回状态码为206的响应报文,对于多重范围的范围请求,响应会在首部字段content-type表明multipart/byteranges后返回响应报文
如果服务器无法响应范围请求,则会返回状态码200 ok和完整的实体内容。
内容协商返回最合适的内容
内容协商是客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源。内容协商会以响应资源的语言,字符集,编码方式等作为判断的基准
包含在请求报文中的某些首部字段就是判断的基准
- accept
- accept-charset
- accept-encoding
- accept-language
- content-language
内容协商技术的三种类型 - 服务器驱动协商:由服务器端进行内容协商,以请求的首部字段为参考,在服务器端自动处理。
- 客户端驱动协商:由客户端进行内容协商的方式。用户从浏览器现实的可选项列表中手动选择。还可以利用javascript脚本在web页面上自动进行上述选择。
- 透明协商:服务器驱动和客户端驱动的结合体,是由服务器端和客户端个字进行内容协商的一种方法。
返回结果的http状态码
http状态码1负责表示客户端http 请求的返回结果,标记服务器端的处理是否正常,通知出现的错误等工作。
2XX成功
表明请求被正常处理了
- 200 OK
表示客户端发来的请求在服务器端被正常处理了。 - 204 no content
表示服务器接收的请求已经成功处理,但在返回的响应报文中不含实体的主体部分,也不允许返回任何实体的主体
一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容时使用 - 206 Partial content
表示客户端进行了范围请求,服务器成功执行了这部分的get请求
3XX重定向
-
301
-永久性重定向,表示请求的资源已经被分配了新的url,以后应该使用资源现在所指的url -
302
临时性重定向,该状态码表示请求的资源已被分配了新的url,希望用户能使用新的URL反问 -
303 see other
由于请求对应的资源存在着另一个URL,应使用get方法定向获取请求的资源。
当301,302,303响应状态码返回时,几乎所有的浏览器都会把post改成get,并删除请求报文内的主体,之后会自动再次发送。 -
304 not modified
表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况,不包含任何响应的主体 -
307 temporary redirect
临时重定向,该状态码与302有着相同的含义。
4XX 客户端发生错误
-
400 bad request
表示请求报文中存在语法错误,当错误发生时,需修改请求的内容后再次发送请求。 -
401 unauthorized
表示发送的请求需要由通过http认证的认证信息,若之前已进行过一次请求,则表示用户认证失败 -
403 forbidden
该状态码表明对请求资源的访问被服务器拒绝了,服务器端没有必要给出详细的拒绝理由,但是如果想说明的话可以在实体的主体部分对原因进行描述。 -
404 not found
该状态码表示服务器上无法找到请求的资源
5XX服务器错误
- 500 internal server error
该状态码表明服务器端在执行请求时发生了错误,也有可能时web应用存在的bug或某些临时的故障 - 503 service unavailable
该状态码表明服务器暂时处于超负载或正在停机维护,暂时无法处理请求。如果事先知道接触以上状态所需的时间,最好写入retryAfter首部字段再返回给客户端
与HTTP协作的web服务器
用单个虚拟主机实现多个域名
http1.1规范允许一台http服务器搭建多个web站点,域名通过DNS服务映射到IP地址之后访问目标网站,当请求发送到服务器的时候,已经是以IP地址形式访问了为了在相同的IP地址下访问特定的主机,需要在发送http请求时必须在host首部内完整指定主机名或域名的url
通信数据转发程序:代理,网关,隧道
代理
一种具有转发功能的应用程序,扮演了位于服务器和客户端中间人的角色,接收由客户端发送的请求并转发给服务器,同时也接受服务器返回的响应并转发给客户端
优点:
- 利用缓存技术减少网络带宽的流量
- 组织内部针对特定网站的访问控制,以获取访问日志为主要目的
代理的使用方法 - 是否使用缓存
- 是否会修改报文
缓存代理
代理转发响应时,缓存代理会预先将资源的副本(缓存)保存在代理服务器上
当代理再次接收到对相同资源的请求时,就可以不从源服务器哪里获取,而是将之前缓存的资源作为响应返回
透明代理
转发请求或响应时,不对报文做任何加工的代理类型称为透明代理。
网关
转发其他服务器通信数据的服务器,接受从客户端发送来的请求时,它就会向自己拥有资源的源服务器一样对请求进行处理。
网关可以由http请求转化为其他协议通信
利用网关可以提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保链接的安全。
隧道
相隔甚远的客户端和服务器之间进行中转,并保持双方通信链接的应用程序。
隧道可以按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
保存资源的缓存
缓存服务器是代理服务器的一种,并归类在缓存代理类型中,换句话说,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。
即使存在缓存,也会因为客户端的要求,缓存的有效期等因素,向源服务器确认资源的有效性,若判断缓存失效,缓存服务器将会再次从源服务器上获取新资源
客户端的缓存
客户端的缓存称之为临时网络文件,浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读取。
HTTP 首部字段根据实际用途被分为以下 4 种类型。
- 通用首部字段(General Header Fields)
请求报文和响应报文两方都会使用的首部。 - 请求首部字段(Request Header Fields)
从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加
内容、客户端信息、响应内容相关优先级等信息。 - 响应首部字段(Response Header Fields) 从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加
内容,也会要求客户端附加额外的内容信息。 - 实体首部字段(Entity Header Fields)
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更
新时间等与实体有关的信息。
HTTP首部
http请求报文
由方法,URL,http版本,http首部字段等部分构成
http响应报文
http报文由http版本,状态码,首部字段3部分构成
http1.1通用首部字段
cache-controol
通过指定首部字段cache-control的指令,就能操作缓存的工作机制。
指令
- public 其他用户也可以利用缓存
- private:响应只能以特定的用户作为对象
- no-cache:客户端不会接收缓存的响应,缓存服务器必须把客户端请求转发给源服务器
- no-store:暗示请求或响应中包含机密信息,该指令规定缓存不能在本地存储请求或响应的任意部分
- s-maxaeg:适用于公共缓存服务器
Connection
作用
- 控制不再转发给代理的首部字段
- 管理持久连接:默认连接都是持久连接,为此,客户端会在持久连接上连续发送请求,当服务器端想明确断开连接时,则指定connection首部字段的值为close,如果想在旧版本的http协议上维持持续连接,则需要指定connection首部字段的值为keep- alive
- 控制不再转发给代理的首部字段
Date
Date表明http报文的日期和时间
Transfer- Encoding
规定了传输报文主体时采用的编码方式
Upgrade
用于检测http协议及其他协议是否可使用更高版本进行通信。
Via
追踪客户端和服务端之间的请求和响应报文的传输路径
请求首部字段
accept
通知服务器用户代理能够处理的媒体类型以及媒体类型的相对优先级。
文本文件
text/html,text/plain,text/css
图片文件
image/jpeg,image/gif,image/png
视频文件
video/mpeg,video/quicktime
应用程序使用的二进制文件
application/octet-stream,application/zip
accept-charset
通知服务器用户代理支持的字符集以及字符集的相对优先顺序。
Accept-Encoding
告知服务器用户代理支持的内容编码以及内容编码的优先级顺序,可一次性指定多种内容编码
Accept-Language
用来告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级。
Authorization
用来告诉服务器用户代理的认证信息
Host
告知服务器请求资源所处的互联网主机名和端口号
Range
告知服务器资源的指定范围
User-Agent
将创建请求的浏览器和用户代理名称等信息传达给服务器
响应首部字段
Accept-Ranges
用来告知客户端服务器是否能处理范围请求,以指定获取服务器某个部分的资源。
Age
告知客户端源服务器在多久前创建了响应
Location
将响应接收方引导至某个与请求uri位置不同的资源。
Server
告知客户端当前服务器上安装的http服务器应用程序的信息。
WWW-Authenticate
用于http访问认证,它会告知客户端适用于访问请求uri所指定资源的认证方案和带参数提示的质询。
实体首部字段
Allow
用于通知客户端能够支持Request-URI指定资源的所有HTTP方法。
Content-Encoding
告知客户端服务器对实体的主体部分选用的内容编码方式。
Content-Language
告知客户端实体主体使用的自然语言
Content-Length
表明了实体主体部分的大小,单位是字节
Content-MD5
客户端对接收的报文主体执行相同的MD5算法,然后与该字段比较,目的在于检查报文主体在传输过程中是否保持完整。
Content-Type
说明实体主体内对象的媒体类型
确保Web安全的HTTPS
http的缺点
- 通信使用明文,内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
通信的加密
HTTPS
一种方式时将通信加密,通过和SSL(安全套接层)或TLS(安全层传输协议)的组合使用加密HTTP的通信内容。
用 SSL建立安全通信线路之后,就可以在这条线路上进行 HTTP
通信了。与 SSL组合使用的 HTTP 被称为 HTTPS(HTTP
Secure,超文本传输安全协议)或 HTTP over SSL。
内容的加密
对HTTP协议传输的内容本身加密,要求客户端和服务端同时具备加密和解密机制,主要应用在Web服务器,但是内容有被篡改的风险。
HTTPS:HTTP+加密+认证+完整性保护
HTTPS是身披SSL外壳的HTTP
HTTPS是HTTP通信接口部分用SSL和TLS协议代替而已
通常HTTP直接和TCP通信,当使用SSL的时候则变成先和SSL通信,再由SSL和TCP通信。
公开密钥加密
SSL采用的是公开密钥加密的加密处理方式
对称密钥加密:加密和解密同用一个密钥
公开密钥加密,一把叫做自由密钥,另一把叫做公开密钥,私有密钥不能让其他人知道,而公开密钥可以随意发布,任何人都可获得。
HTTPS采用混合加密机制
在交换密钥环节使用公开密钥加密方式
在之后的建立通信交换报文阶段则使用共享密钥加密方式
证明公开密钥正确性的证书
为了方式收到的公开密钥被篡改,使用数字证书认证机构(CA)和其相关机关颁发的公开密钥证书
HTTPS的安全通信机制
步骤
- 客户端通过发送ClientHello报文开始SSL通信,报文中包含客户端支持的SSL的指定版本,加密组件列表
- 服务器端可进行SSL通信,就会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件,服务器的加密组件是从接收到的客户端加密组件内筛选出来的。
- 服务器发送Certificate报文,报文中包含公开密钥证书
- 服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束
- SSL第一次握手结束之后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。
- 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。
- 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
- 服务器同样发送 Change Cipher Spec 报文。
- 服务器同样发送 Finished 报文
- 服务器和客户端的 Finished 报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到 SSL的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。
- 应用层协议通信,即发送 HTTP 响应
- 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP的通信。
确认访问用户身份的认证
BASIC认证
DIGEST认证
一方会先发送认证要求给另一方,接着使用从另一方那里接收到的质询码计算生成响应码,最后将响应码返回给对方进行认证的方式。
SSL客户端认证
借由HTTPS的客户端证书完成认证的方式,凭借客户端证书认证服务器可确认访问是否来自已登录的客户端
- 接收到需要认证资源的请求,服务器会发送Certificate Request报文,要求客户端提供客户端证书
- 用户选择将发送的客户端证书后,客户端会把客户端证书以Client Certificate报文方式发送给服务器
- 服务器验证客户端证书验证通过后方可领取证书内客户端的公开密钥,然后开始HTTPS加密通信。
Session管理及Cookie应用