HTTP
最近读了上野宣さん的<<图解HTTP>>,感慨颇多
自己在没有学习基础知识的情况下,赶鸭子上架学的前端开发,以至于对一些东西都是一知半解.
在平常的工作中,出现问题,只要找到解决方案就万事大吉.
对一些理论的知识却不加深究, 久而久之,也养成了不好的习惯,
只要代码可以工作就可以, 殊不知,这正是开发人员最忌讳的事情.
生产垃圾代码,并且不去修好破窗户......
一次偶然的机会,看到了上野宣先生的这本书,相见恨晚,用了两天读完.
把自己认为一些重要的东西,重新打印出来,希望在以后的工作中,没事的时候,可以翻翻看看
图解HTTP 【日】上野宣
了解WEB及网络基础
HTTP(HyperText Transfer Protocol,超文本传输协议)正式作为标准被公布是在1996年的5月,版本被命名为HTTP/1.0,并记载于RFC1945。
计算机与网络设备要相互通信,双方就必须基于相同的方法。
TCP/IP是互联网相关的各类协议族的总称
TCP/IP协议
TCP/IP协议族按层次分别分为以下4层:应用层、传输层、网络层和数据链路层
-
应用层
应用层决定了向用户提供应用服务时通信的活动 TCP/IP协议族内预存了各类通用的应用服务 比如 FTP(File Transfer Protocol,文件传输协议) DNS(Domain Name System,域名系统) HTTP协议也处于该层
-
传输层
在传输层有两个性质不同的协议: TCP(Transmission Control Protocol,传输控制协议) UDP(User Data Protocol,用户数据报协议)
-
网络层
网络层用来处理在网络上流动的数据包。 数据包是网络传输的最小数据单位。 该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。 与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。
-
链路层
链路层用来处理连接网络的硬件部分。 包括控制操作系统,硬件的设备驱动,NIC(Network Interface Card,网络适配器,即网卡
IP协议
IP协议的作用是把各种数据包传送给对方。 而要保证确实传送到对方那里,则需要满足各类条件。 其中两个重要的条件是IP地址和MAC地址(Media Access Control Address)。
ARP协议(Address Resolution Protocol) ARP协议是解析地址的协议,根据通信方的IP可以反查出对应的MAC地址
⭐没有人能狗全面掌握互联网中的传输情况
确保可靠性的TCP协议
TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。
TCP协议采用了三次握手(three-way handshaking)策略。
握手过程中使用了TCP的标志(flag)——SYN(synchronize)和ACK(acknowledgement)
1 客户端先向服务端发送一个带SYN标志的数据包.
2 服务端接收后,回传一个带有SYN/ACK标志的数据包.
3 客户端回传一个带ACK标志的数据包,代表握手结束
DNS(Domain Name System),位于应用层,提供IP地址之间的解析服务
综上所述,浏览网页,客户端和服务器之间发生了许多生动的故事,具体通信步骤如下所示:
- 客户端输入一个网址,摁下回车
- 向DNS询问对应网址的IP地址
- DNS返回对应的IP地址给客户端
- HTTP协议 → 开始生成针对目标WEB服务器的HTTP请求报文
- TCP协议 → 为了方便通信,将HTTP请求报文分段
- IP协议 → 搜索对方的地址,一边中转,一边传送(ARP协议)
- 找到目标WEB服务器
- TCP协议 → 将接受的文段按序列号来重组
- HTTP协议 → 对发送来的请求做处理
- 然后再通过TCP/IP协议向用户回传
统一资源标识符
URI是Uniform Resource Identifier的缩写
-
Uniform
规定统一的格式可方便处理多种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式。 另外,加入新增的协议方案(如http:或ftp:)也更容易。
-
Resource
资源的定义是“可标识的任何东西
-
Identifier
表示可标识的对象。也称为标识符。
标准的URI协议方案有30种左右, 由隶属于国际互联网资源管理的非营利社团ICANN(Internet Corporation for Assigned Names and Numbers,互联网名称与数字地址分配机构)的IANA(Internet Assigned Numbers Authority,互联网号码分配局)管理颁布。
URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。
URI格式
http://user:pass@www.example.com:80/dir/index.html?id=1#ch1
http:// | 协议方案名 |
---|---|
user:pass | 登陆信息 |
www.example.com | 服务器地址 |
80 | 服务器端口号 |
/dir/index.html | 带层次的文件路径 |
id=1 | 查询字符串 |
ch1 | 片段标识符 |
简单的HTTP协议
HTTP协议和TCP/IP协议族内的其他众多的协议相同,用于客户端和服务器之间的通信。
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回.
换句话说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应
请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成的。
在起始行开头的HTTP/1.1表示服务器对应的HTTP版本。紧挨着的200 OK表示请求的处理结果的状态码(status code)和原因短语(reason-phrase)。下一行显示了创建响应的日期时间,是首部字段(header field)内的一个属性。 接着以一空行分隔,之后的内容称为资源实体的主体(entity body)。
HTTP是不保存状态的协议
HTTP是一种不保存状态,即无状态(stateless)协议 在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
告知服务器意图的HTTP方法
GET | 获取资源 |
---|---|
POST | 传输实体主体 |
PUT | 传输文件 |
HEAD | 获得报文首部 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法 |
TRACE | 追踪路径 |
CONNECT | 要求用隧道协议连接代理 |
GET方法用来请求访问已被URI识别的资源
TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。
TRACE方法本来就不怎么常用,再加上它容易引发XST(Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输.
持久连接
为解决上述TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接(HTTP Persistent Connections,也称为HTTP keep-alive或HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态. 在HTTP/1.1中,所有的连接默认都是持久连接.
管线化
持久连接使得多数请求以管线化(pipelining)方式发送成为可能. 管线化技术出现后,不用等待响应亦可直接发送下一个请求。
使用Cookie的状态管理
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie
HTTP报文内的HTTP信息
HTTP报文
HTTP报文本身是由多行(用CR+LF作换行符)数据构成的字符串文本。 HTTP报文大致可分为报文首部和报文主体两块.两者由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。
请求报文及响应报文的结构
请求行包含用于请求的方法,请求URI和HTTP版本。状态行包含表明响应结果的状态码,原因短语和HTTP版本。首部字段包含表示请求和响应的各种条件和属性的各类首部。 一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部。其他可能包含HTTP的RFC里未定义的首部(Cookie等)。##### 报文主体和实体主体的差异
报文(message) 是HTTP通信中的基本单位,由8位组字节流(octet sequence,其中octet为8个比特)组成,通过HTTP通信传输。实体(entity) HTTP报文的主体用于传输请求或响应的实体主体。##### 压缩传输的内容编码
- gzip(GNU zip)
- compress(UNIX系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
分割发送的分块传输编码
把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)。 分块传输编码会将实体主体分成多个部分(块). 每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
发送多种数据的多部分对象集合
MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,它允许邮件处理文本、图片、视频等多个不同类型的数据。 Multipurpose/form-data 在WEB表单文件上传时使用 Multipurpose/byteranges 状态码206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。
获取部分内容的范围请求
要实现该功能需要指定下载的实体范围。像这样,指定范围发送的请求叫做范围请求(Range Request)。
内容协商返回最合适的内容
当浏览器的默认语言为英语或中文,访问相同URI的Web页面时,则会显示对应的英语版或中文版的Web页面。这样的机制称为内容协商(Content Negotiation)。 内容协商机制是指客户端和服务端就响应的资源内容进行交涉,然后提供给客户端最为合适的资源 以响应资源的语言,字符集,编码方式为判断基准
服务器驱动协商(Server-driven Negotiation)由服务器端进行内容协商。以请求的首部字段为参考,在服务器端自动处理.客户端驱动协商(Agent-driven Negotiation)由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中手动选择.透明协商(Transparent Negotiation)是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自进行内容协商的一种方法.
返回结果的HTTP状态码
状态码告知从服务器端返回的请求结果 状态码如200 OK,以3位数字和原因短语组成。
2XX成功
2XX的响应结果表明请求被正常处理了。
状态码 | 意义 |
---|---|
200 OK | 从客户端发来的请求在服务端被正常处理 |
204 No Content | 该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分 一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。 |
206 Partial Content | 客户端进行了范围请求,而服务器成功执行了这部分的GET请求 |
3XX重定向
3XX响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。
状态码 | 意义 |
---|---|
301 Moved Permanently | 永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。 |
302 Found | 临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问. |
303 See Other | 由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源 |
304 Not Modified | 客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。 |
307 Temporary Redirect | 临时重定向。该状态码与302 Found有着相同的含义. |
4XX 客户端错误
4XX响应结果表明客户端时发生错误的原因所在
状态码 | 意义 |
---|---|
400 Bad Request | 请求报文中存在语法错误 |
401 Unauthorized | 发送的请求需要有通过HTTP认证(BASIC认证/DIGEST认证)的认证信息 |
403 Forbidden | 对请求资源的访问被服务器拒绝了 |
404 Not Found | 服务器上无法找到请求的资源 |
5XX 服务器错误
5XX响应结果表明服务器本身发生错误
状态码 | 意义 |
---|---|
500 Internal Server Error | 服务器端在执行请求时发生了错误.也有可能是Web应用存在的bug或某些临时的故障。 |
503 Service Unavailable | 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。 |
与HTTP协作的WEB服务器
用单台虚拟主机实现多个域名 在互联网上,域名通过DNS服务映射到IP地址(域名解析)之后访问目标网站。可见,当请求发送到服务器时,已经是以IP地址形式访问了。
通信数据转发程序 :代理、网关、隧道
代理
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求URI,会直接发送给前方持有资源的目标服务器。
转发时,需要附加Via首部字段以标记出经过的主机信息。 代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一种是是否会修改报文。
缓存代理代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上透明代理转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理(Transparent Proxy)。反之,对报文内容进行加工的代理被称为非透明代理。
网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。 利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全
隧道
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。 缓存是指代理服务器或客户端本地磁盘内保存的资源副本
客户端的缓存
客户端缓存称为临时网络文件Temporary Internet File FTP(File Transfer Protocol) NNTP(Network News Transfer Protocol)
HTTP报文首部
HTTP协议的请求和响应报文中必定包含HTTP首部。首部内容为客户端和服务器分别处理请求和响应提供所需要的信息 在请求中,HTTP报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。 在响应中,HTTP报文由HTTP版本、状态码(数字和原因短语),HTTP首部字段3部分构成。
HTTP首部字段传递重要信息
HTTP首部字段是构成HTTP报文的要素之一 使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
HTTP首部字段结构
HTTP首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔。
4种HTTP首部字段类型
通用首部字段(General Header Fields)请求报文和响应报文两方都会使用的首部。请求首部字段(Request Header Fields)从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。响应首部字段(Response Header Fields)从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。实体首部字段(Entity Header Fields)针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。#### End-to-end首部和Hop-by-hop首部
端到端首部(End-to-end Header)
分在此类别中的首部会转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发.
逐跳首部(Hop-by-hop Header)
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发.HTTP/1.1和之后版本中,如果要使用hop-by-hop首部,需提供Connection首部字段。 除这8个首部字段之外,其他所有字段都属于端到端首部。
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
通用首部字段
Cache-Control
Cache-Control的指令,就能操作缓存的工作机制。 指令的参数是可选的,多个指令之间通过“,”分隔
缓存请求指令 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 强制向源服务器再次验证 |
no-store | 无 | 不缓存请求或响应的任何内容 |
max-age = [秒] | 无 | 响应的最大AGE值 |
max-stale(=[秒]) | 无 | 接受已过期的响应 |
min-fresh = [秒] | 无 | 期待在指定时间内的响应仍有效 |
no-transform | 无 | 代理不可更改媒体类型 |
only-if-chached | 无 | 从缓存获取资源 |
cache-extension | 无 | 新指令标记(token) |
缓存响应指令 | 参数 | 说明 |
---|---|---|
public | 无 | 可向任意方提供响应的缓存 |
private | 可省略 | 仅向特定用户返回响应 |
no-cache | 可省略 | 缓存前必须先确认其有效性 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 可缓存但是必须再向源服务器进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age = [秒] | 必需 | 响应的最大AGE值 |
s-maxage = [秒] | 必需 | 公共缓存服务器响应的最大AGE值 |
cache-extension | 无 | 新指令标记 |
使用no-cache指令的目的是为了防止从缓存中返回过期的资源。
客户端发送的请求中如果包含no-cache指令,则表示客户端将不会接收缓存过的响应. 于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。
如果服务器返回的响应中包含no-cache指令,那么缓存服务器不能对资源进行缓存。 源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。
Cache-Control: no-cache=Location
由服务器返回的响应中,若报文首部字段Cache-Control中对no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。
no-store指令
Cache-Control: no-store
当使用no-store指令时,暗示请求(和对应的响应)或响应中包含机密信息。 因此,该指令规定缓存不能在本地存储请求或响应的任一部分。
s-maxage指令
Cache-Control: s-maxage=604800(单位:秒)
s-maxage指令的功能和max-age指令的相同,它们的不同点是s-maxage指令只适用于供多位用户使用的公共缓存服务器。也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。
另外,当使用s-maxage指令后,则直接忽略对Expires首部字段及max-age指令的处理。
max-age指令
Cache-Control: max-age=604800(单位:秒)
当客户端发送的请求中包含max-age指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定max-age值为0,那么缓存服务器通常需要将请求转发给源服务器。
min-fresh指令要求缓存服务器返回至少还未过指定时间的缓存资源。
使用max-stale可指示缓存资源,即使过期也照常接收。
only-if-cached指令
该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码504 Gateway Timeout。
must-revalidate指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。 若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条504(Gateway Timeout)状态码。 另外,使用must-revalidate指令会忽略请求的max-stale指令
proxy-revalidate指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
no-transform指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。 这样做可防止缓存或代理压缩图片等类似操作。
Connection
Connection首部字段具备如下两个作用。
- 控制不再转发给代理的首部字段
- 管理持久连接
HTTP/1.1版本的默认连接都是持久连接。 为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,则指定Connection首部字段的值为Close。 想在旧版本的HTTP协议上维持持续连接,则需要指定Connection首部字段的值为Keep-Alive。
Date
首部字段Date表明创建HTTP报文的日期和时间。
Date: Tue, 03 Jul 2012 04:40:59 GMT
Pragma
Pragma是HTTP/1.1之前版本的历史遗留字段,仅作为与HTTP/1.0的向后兼容而定义。
Trailer
首部字段Trailer会事先说明在报文主体后记录了哪些首部字段
Transfer-Encoding
首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。
Upgrade
首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Via
Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径。
Warning
Warning首部是从HTTP/1.0的响应首部(Retry-After)演变过来的。该首部通常会告知用户一些与缓存相关的问题的警告。
Accept
Accept首部字段可通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级 若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,用分号(;)进行分隔。 权重值q的范围是0~1(可精确到小数点后3位),且1为最大值.不指定权重q值时,默认权重为q=1.0
Accept-Charset
Accept-Charset首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序
Accept-Encoding
Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码.
gzip
由文件压缩程序gzip(GNU zip)生成的编码格式(RFC1952),采用Lempel-Ziv算法(LZ77)及32位循环冗余校验(Cyclic Redundancy Check,通称CRC)。
identity
不执行压缩或不会变化的默认编码格式
Accept-Language
首部字段Accept-Language用来告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优
Authorization
首部字段Authorization是用来告知服务器,用户代理的认证信息(证书值
Expect
客户端使用首部字段Expect来告知服务器,期望出现的某种特定行为
From
首部字段From用来告知服务器使用用户代理的用户的电子邮件地址
Host
首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号。
If-Match
形如If-xxx这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
If-Modified-Since
首部字段If-Modified-Since,属附带条件之一,它会告知服务器若If-Modified-Since字段值早于资源的更新时间,则希望能处理该请求。 而在指定If-Modified-Since字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码304 Not Modified的响应。
If-Unmodified-Since
它的作用的是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求
Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息
Referer
首部字段Referer会告知服务器请求的原始资源的URI。
User-Agent
首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。
Accept-Ranges
首部字段Accept-Ranges是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。 可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定其为none。
ETag
首部字段ETag能告知客户端实体标识。
Location
几乎所有的浏览器在接收到包含首部字段Location的响应后,都会强制性地尝试对已提示的重定向资源的访问。
Server
首部字段Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
Set-Cookie
Cookie的expires属性指定浏览器可发送Cookie的有效期。
Cookie的secure属性用于限制Web页面仅在HTTPS安全连接时,才可以发送Cookie。
Cookie的HttpOnly属性是Cookie的扩展功能,它使JavaScript脚本无法获得Cookie。其主要目的为防止跨站脚本攻击(Cross-site scripting,XSS)对Cookie的信息窃取。
X-Frame-Options
首部字段X-Frame-Options属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。 Header append X-FRAME-OPTIONS SAMEORIGIN
X-XSS-Protection
X-XSS-Protection属于HTTP响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器XSS防护机制的开关。
X-XSS-Protection可指定的字段值如下。 0:将XSS过滤设置成无效状态
1:将XSS过滤设置成有效状态
DNT
DNT属于HTTP请求首部,其中DNT是Do Not Track的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
HTTP的缺点
HTTP主要有这些不足,例举如下:
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
通信使用明文可能会被窃听
按TCP/IP协议族的工作机制,通信内容在所有的通信线路上都有可能遭到窥视.
所谓互联网,是由能连通到全世界的网络组成的。无论世界哪个角落的服务器在和客户端通信时,在此通信线路上的某些网络设备,光缆,计算机等都不可能是个人的私有物,所以不排除某个环节中会遭到恶意窥视行为.
即使已经过加密处理的通信,也会被窥视到通信内容,这点和未加密的通信是相同的。只是说如果通信经过加密,就有可能让人无法破解报文信息的含义.但加密处理后的报文信息本身还是会被看到的。
Wireshark。它可以获取HTTP协议的请求和响应的内容,并对其进行解析。
一种方式就是将通信加密。HTTP协议中没有加密机制,但可以通过和SSL(Secure Socket Layer,安全套接层)或TLS(Transport Layer Security,安全层传输协议)的组合使用,加密HTTP的通信内容。
与SSL组合使用的HTTP被称为HTTPS(HTTP Secure,超文本传输安全协议)或HTTP over SSL。
还有一种将参与通信的内容本身加密的方式
不验证通信方的身份就可能遭遇伪装
HTTP协议的实现本身非常简单,不论是谁发送过来的请求都会返回响应,因此不确认通信方,会存在以下各种隐患。
- 无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器。有可能是已伪装的Web服务器。
- 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端。
- 无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限。
- 无法判定请求是来自何方、出自谁手。
- 即使是无意义的请求也会照单全收。
- 无法阻止海量请求下的DoS攻击(Denial of Service,拒绝服务攻击).
证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。另外,伪造证书从技术角度来说是异常困难的一件事。所以只要能够确认通信方(服务器或客户端)持有的证书,即可判断通信方的真实意图.
无法证明报文完整性,可能已遭篡改
请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(Man-in-the-Middle attack,MITM)。
提供文件下载服务的Web网站也会提供相应的以PGP(Pretty Good Privacy,完美隐私)创建的数字签名及MD5算法生成的散列值。PGP是用来证明创建文件的数字签名,MD5是由单向函数生成的散列值.
HTTPS是身披SSL外壳的HTTP
HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。
使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信
SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。可以说SSL是当今世界上应用最为广泛的网络安全技术.
证明公开密钥正确性的证书
遗憾的是,公开密钥加密方式还是存在一些问题的。那就是无法证明公开密钥本身就是货真价实的公开密钥
我们来介绍一下数字证书认证机构的业务流程:
- 服务器的运营人员向数字证书认证机构提出公开密钥的申请.
- 数字证书认证机构在判明提出申请者的身份之后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将该公开密钥放入公钥证书后绑定在一起。
- 服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。公钥证书也可叫做数字证书或直接称为证书。
- 接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证.
- 一旦验证通过,客户端便可明确两件事:
一,认证服务器的公开密钥的是真实有效的数字证书认证机构。
二,服务器的公开密钥是值得信赖的。 - 此处认证机关的公开密钥必须安全地转交给客户端。使用通信方式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在
拥有该特性的证书就是EV SSL证书(Extended Validation SSL Certificate)。
HTTPS的安全通信机制
- 步骤1:客户端通过发送Client Hello报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。
- 步骤2:服务器可进行SSL通信时,会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
- 步骤3:之后服务器发送Certificate报文。报文中包含公开密钥证书。
- 步骤4:最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。
- 步骤5:SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
- 步骤6:接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密钥加密。
- 步骤7:客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
- 步骤8:服务器同样发送Change Cipher Spec报文。
- 步骤9:服务器同样发送Finished报文。
- 步骤10:服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求。
- 步骤11:应用层协议通信,即发送HTTP响应。
- 步骤12:最后由客户端断开连接。断开连接时,发送close_notify报文。上图做了一些省略,这步之后再发送TCP FIN报文来关闭与TCP的通信。
MAC(Message Authentication Code)的报文摘要。MAC能够查知报文是否遭到篡改,从而保护报文的完整性。
IETF(Internet Engineering Task Force,Internet工程任务组)
SSL的慢分两种。一种是指通信慢。另一种是指由于大量消耗CPU及内存等资源,导致处理速度变慢。