HTTP协议

问题:在浏览器的地址栏中输入URL后,Web页面是如何呈现的?

HTTP(HyperText Transfer protocol)协议:超文本传输协议,web通信的基础。

最初为了相隔两地的研究者能够共享知识而设想的,其基本理念是:借助多文档之间的相互关联形成的超文本(hyperText),连成可相互借阅的WWW(World Wide Web,万维网)。

当年HTTP协议的出现主要是为了解决文本传输的难题。由于协议本身非常简单,于是在此基础上设想了很多应用方法投入了实际使用。现在HTTP协议已经超出了Web这个框架的局限,被运用到了各种场景里。

 

一、网络基础TCP/IP

  为了理解HTTP,首先需要了解TCP/IP协议族。TCP/IP是互联网相关的各类协议族的总称。通常使用的的网络(包括互联网)是在TCP/IP协议族的基础上运作的。而HTTP属于它内部的一个子集。

  1.1、TCP/IP协议族

  计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作

系统之间的通信,所有的这一切都需要一种规则。我们把这种规则称为协议(protocol)。

  1.2、TCP/IP的分层管理

  TCP/IP协议族最重要的一点就是分层,按层次分为以下四层:应用层、传输层、网络层和数据链路层。分层的好处是如果有某个地方的设计需要改变时,只需要把变动的层替换掉即可。把各层之间

的接口部分规划好之后,每个层次内部的设计就能够自由改动了。另外,层次化之后,设计也变得相对简单了。处于应用层上的应用可以只考虑分派给自己的任务,而不需要弄清对方在地球上哪个地方、

对方的传输线路是怎样的、是否能确保传输送达等问题。

  TCP/IP协议族各层的作用如下:

  应用层:

    应用层决定了向用户提供应用服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。比如FTP(File Transfer Protocol,文本传输协议)和DNS(Domain Name System,域名系统)

    服务就是其中两类。HTTP协议也处于该层。

  传输层:

    传输层对上层应用层,提供处于网络连接中两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,

    用户数据报协议)。

  网络层:

    又名网络互连层,用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。在与对方计算

    机之间通过多台计算机或者网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。

  链路层:

    又名数据链路层,网络接口层,用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括一

    些连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。

  

  利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。发送端从应用层往下走,接收端则往从网络层往上走。

  1.3、与HTTP关系密切的协议:IP、TCP和DNS

  1、IP协议  

  按层次分,IP(Internet protocol,网际协议)位于网络层。几乎所有使用网络的系统都会用到IP协议。TCP/IP协议族中的IP指的就是网际协议,协议名称中占据了一半的位置,其重要性可见一斑。

  IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则需要满足各类条件,最重要的条件是IP地址和MAC地址(Media Access Control Address)。IP间的通信依赖MAC地址。在

网络上,通信的双方在同一局域网(LAN)内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这事会

采用ARP(Address Resolution Protocol),一种用来解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址。

  在到达通信目标的中转过程中,那些计算机和路由器等网络设备只能获悉很粗略的传输路线。这种机制称为路由选择(routing),有点像快递公司的送货过程。快递先送到集散中心,然后检查货物的送

货地址,明确下一站该送往哪个区域的集散中心。接着,那个区域的集散中心自会判断是否能送到对方的家中。

  2、确保可靠性的TCP协议

  按层次分,TCP协议位于传输层,提供可靠的字节流服务。所谓的字节流服务(Byte System Service)是指,为了传输方便,将大块数据分割成以报文段(Segment)为单位的数据包进行管理。而可靠

的传输服务是指,能够把数据准确可靠地传给对方。一句话总结就是TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送达到对方。如使用三次握手。

  3、DNS服务

  DNS服务和HTTP一样是位于应用层的协议。它提供域名到IP地址之间的解析服务。计算机可以被赋予IP地址,也可以被赋予主机名和域名。比如www.baidu.com。用户通常使用主机名或者域名来访问对

方的计算机,而不是直接通过IP地址来访问。因为与IP地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。但是要让计算机去理解名称,相对而言就变得困难了。因

为计算机更擅长处理一串数字,为了解决以上的问题,DNS服务应运而生。DNS协议通过域名查找IP地址,或逆向从IP地址反查域名的服务。

  

  URI和URL

  URI(Uniform Resource Identifier),统一资源标识符,用来标识某一互联网资源,而URL(Uniform Resource Location)表示资源的地点(互联网上所处的位置)。URL是URI的子集。

 

 

二、HTTP协议

  HTTP协议用于客户端和服务端之间的通信,请求访问文本或者图像资源的一端称为客户端,而提供资源响应的一端称为服务端。请求必定由客户端发出,由服务端响应。

  1、请求报文的构成

  

  2、响应报文的组成

   

  2、HTTP协议是无状态协议

  即HTTP自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。即无法根据之前的状态进行本次的请求处理。那如果访问需要登录

的Web页面,若无法记录登录状态,要么每次都要重新登录,要么在每次请求报文中附加参数来管理登录状态。于是引入了Cookie技术,通过在请求和响应报文中写入Cookie信息来控制客户端的状态。

  Cookie会根据从服务端发送的响应报文中的Set-Cookie的头部字段信息,通知客户端保存Cookie。当下次客户端再往服务端发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务端

收到客户端发送过来的Cookie后,会去服务端中查找记录,得到之前请求的状态信息。

  3、请求URI定位资源

  HTTP协议使用URI定位互联网上的资源。正是因为URI的特定功能,在互联网上任意位置的资源都能访问到。当客户端请求资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内。指定请求

URI的方式有很多。1、直接在请求行中指定完整的URI  2、请求行中指定相对路径,在请求头的Host字段中写明网络域名或IP地址。  

  除此之外,如果不是访问特定资源而是对服务器本身发起请求,可以用一个*来代替请求URI,如查询HTTP服务器端支持的HTTP方法种类:OPTIONS * HTTP/1.1

  4、告知服务器意图的HTTP方法——请求类型

  GET:获取资源

    GET方法用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是想CGI(Common Gateway Interface,通

    用网关接口那样的程序,则返回经过执行后的输出结果)

  POST:传输实体主体

    POST方法用来传输实体的主体,虽然使用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是用POST方法,虽说POST的功能与GET很相似,但POST的主要目的并不是获取响

    应的主体内容。

  PUT:传输文件

    PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文中包含文件内容,然后保存到请求URI指定的位置。但是鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文

    件,存在安全性问题,因此一般的Web网站不使用该方法。若配合Web应用程序的验证机制,或架构设计采用REST标准的同类Web网站,就可能会开放使用PUT方法。

  HEAD:获得报文头部

    与GET方法一样,只是不返回报文的body部分。用于确认URI的有效性及资源更新的日期时间等

  DELETE:删除文件

    DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定的资源。但是和PUT一样不带验证机制。

  OPTIONS:询问支持的方法

    OPTIONS方法用来查询针对请求URI指定的资源支持的方法。

  TRACE:追踪路径

    TRACE方法是让Web服务器将之前的请求通信环回给客户端的方法,客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改的。但是TRACE方法不怎么常用,再加上其容易引发XST

    (Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。

  CONNECT:要求用隧道协议连接代理

    CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。只要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议

    把通信内容经加密后经网络隧道传输。

  5、长连接——节省通信量

    HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。以当年的通信情况来说,都是些很小的文本传输,所以即使这样也没有多大的问题。可随着HTTP的普及,文档中包含大

量图片的情况多了起来,如果每次的请求都要TCP建立连接和断开连接,会造成很大的通信开销。

    为了解决TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0提供了长连接,也称为HTTP keep-alive。长连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。在建立1次TCP

连接后可以进行多次请求和响应的交互。减少了TCP连接的重复建立和断开造成的额外开销,减轻了服务器的负载,节省通信时间,提高响应速度。

  6、管道(pipelining)

    长连接使得多数请求以管道方式发送成为可能。之前是发送请求后需等待并收到响应后,才能发送下一个请求。管道技术出现后,不用等待上一个请求的响应亦可直接发送下一个请求。

 

 

三、HTTP报文内的HTTP信息

报文类型 报文构成 说明
请求报文 请求行,请求头,空行(CR+LF,回车符+换行符),请求数据主体构成 请求行:包含用于请求的方法,请求URI和HTTP版本
响应报文 状态行,响应头,空行,响应正文构成 状态行:包含表名响应结果的状态码,原因短语和HTTP版本;请求头和响应头:包含请求和响应的各种条件和属性的各类头部

 

  1、编码提升传输速率

    HTTP在传输数据时可以按照数据原貌直接传输,也可以在传输过程中通过编码提升传输速率。通过在传输时编码,能有效地处理大量的访问请求。但是编码的操作需要计算机来完成,因此会

消耗更多的CPU等资源。

   1.1、报文主体和实体主体的差异

    报文:是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。

    实体:作为请求或响应的有效载荷(补充项)被传输,其内容由实体首部和实体主体组成。

    HTTP报文的主体用于传输请求或响应的实体主体。通常报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。

   1.2、压缩传输的内容编码

    内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩,内容编码后的实体由客户端负责接收并负责解码。常见的内容编码有以下几种:

    gzip(GNU zip)、compress(UNIX系统的标准压缩)、deflate(zlib)、identity(不进行编码)。

   1.3、分割发送的分块传输编码

    在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。

    这种把实体分块的功能称为分块传输编码(Chunked Transfer Coding)。每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。使用

    分块编码的实体主体会由接收的客户端负责解码,恢复到编码前的实体主体。

   1.4、发送多种数据的多部分对象集合

    发送邮件时,我们可以在邮件里写入文字并添加多份附件。这是因为采用了MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,它允许邮件处理文

    本、图片、视频等多个不同类型的数据。例如,图片等二进制数据以ASCII码字符串编码的方式指明,就是利用MIME来描述标记数据类型。而在MIME扩展中会使用一种称为

    多部分对象集合(Multipart)的方法,来容纳多份不同类型的数据。

    相应的,HTTP协议中也采纳了多部分对象集合,发送的一份报文主体内可含有多类型实体。通常是在图片或文本上传时使用。多部分对象集合包含的对象如下:

      multipart/form-data:在Web表单文件上传时使用。     

Content-Type: multipart/form-data; boundary=----WebKitFormBoundarynCjL1W1jRpMSyabT

      multipart/byteranges:状态码206(Partial Content,部分内容)响应报文中包含了多个范围的内容时使用。

    在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type。使用boundary字符串来划分多部分对象集合指明的各类实体,各个实体的起始行插入"--"作为标记。

   1.5、获取部分内容的范围请求

    如果下载大文件过程中遇到网络中断的情况,可能要重头开始下载。为了解决这个问题,需要一种可恢复的机制。所谓恢复是指能从之前下载中断处恢复下载。要实现该功能需要

    指定下载的实体范围。发送范围请求(Range Request)。如对一份10000字节大小的资源,如果使用范围请求,可以只请求5001-10000字节内的资源。执行范围请求时,会用到

    首部字段Range来指定资源的byte范围。byte范围的指定形式如下:

    【Range:5001-10000】5001-10000字节

    【Range:byte=5001-】从5001字节之后全部的

    【Range:byte=-3000,5000-7000】从一开始到3000,5000-7000字节的多重范围

    针对范围请求,响应会返回状态码为206 Partial Content的响应报文。另外,对于多重范围的范围请求,响应会在首部字段Content-Type标明multipart/byteranges后返回响应报文。

    如果服务器端无法响应范围请求,则会返回状态码200 OK和完整的实体内容。

   1.6、内容协商返回最合适的内容

    当浏览器的默认语言为英文或中文,访问相同的URI的Web页面时,则会显示对应的英语版或中文版的Web页面。这样的机制称为内容协商。内容协商机制是指客户端和服务端就

    响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以影响资源的语言、字符集、编码方式等作为判断的基准。包含在请求报文中的某些头字段就是判断的

    基准,如:

    Accept

    Accept-Charset

    Accept-Encoding

    Accept-Language

    Content-Language

 

 

四、返回结果的HTTP状态码

   状态码的职责是当客户端向服务端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是否正常处理了请求,还是出现了错误。状态码的类别

  类别 原因短语
1XX Informational(信息性状态码) 接收请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错

 

 

五、HTTP Web服务器

  1、单台虚拟主机实现多个域名

  HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点。可以使用虚拟主机(Virtual Host,又称虚拟服务器)的功能,即使物理层面只有一台服务器,但只要使用虚拟主机的功能,则

可以看作具有多台服务器。客户端使用HTTP协议访问服务器时,会经常采用www.baidu.com这样的主机名和域名。在互联网上,域名通过DNS服务映射到IP地址(域名解析)之后访问目

标网站。所以当请求到达服务器时,已经是IP地址形式访问了。如果一台服务器托管了两个不同的域名(两个域名不同的服务部署在同一个服务器上),那么使用DNS域名解析后,两者的

访问IP地址会相同。因此在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI。

  2、通信数据转发程序:代理、网关、隧道

  这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能够接收从那台服务器发送的响应再转发给客户端。

  代理:代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。

    代理不改变请求URI,会直接发送给前方持有资源的目标服务器。在HTTP通信过程中,可级联多台代理服务器。请求和响应的转发会经过数台类似锁链一样连接起来的代理服务

    器。转发时,需要附加Via头部字段以标记经过的主机信息。

  网关:网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标

    是一个网关。

    客户端——HTTP请求——>网关——非HTTP协议通信——>非HTTP服务器   利用网关可以由HTTP请求转化为其他协议通信

    网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非HTTP协议服务。

    利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。

  隧道:隧道是在相隔甚远的客户端和服务器之间进行中转,并保持双方通信连接的应用程序。隧道可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。

    隧道的目的是确保客户端能与服务端进行安全的通信。隧道本身不会去解析HTTP请求。也就是说,请求保持原样中转给之后的服务器,隧道会在通信双方断埯开连接时结束。

  3、保存资源的缓存

  缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。缓存服务器是代理服务器的一种,并归类在缓

  存代理服务器中。换句话说,当代理转发从服务器返回的响应时,代理服务器会保存一份资源的副本。使用缓存需要关注缓存的有效期限等问题。

  客户端的缓存:

    缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读取。

 

 

六、HTTP头部

  HTTP协议的请求和响应报文中必定包含HTTP头部。头部内容为客户端和服务端分别处理请求和响应提供所需要的重要信息。

  使用头部字段可以给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等内容。

  1、HTTP头部字段结构

   由头部字段名和字段值组成,中间用冒号":"分隔。【头部字段名:字段值】,单个HTTP头部可以对应多个值,多个值之间以逗号隔开。

  2、4种HTTP首部字段类型

    (1)通用头部字段:请求报文和响应报文都会使用的头部

头部字段名 说明
 Cache-Control  控制缓存的行为
 Connection  逐跳头部、连接的管理
 Date    创建报文的日期时间
 Pragma    报文指令
 Trailer  报文末端的头部一览
 Transfer-Encoding  指定报文主体的传输编码方式
 Upgrade  升级为其他协议
 Via  代理服务器的相关信息
 Warning  错误通知

    (2)请求头部字段:从客户端向服务端发送请求时使用的头部,补充了请求的附加内容,客户端信息、响应内容相关优先级等信息。

头部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web认证信息
Except 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记(与If-Match相反)
If-Range 资源未更新时发送实体Byte的范围请求
If-Unmodified-Since 比较资源的更新时间(与If-Match-Since相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Refer 对请求中URI的原始获取方
TE 传输编码的优先级
User-Agent HTTP客户端程序的信息

    (3)响应头部字段:从服务器向客户端返回响应报文时使用的头部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。

头部字段名 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location   令客户端重定向至指定URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息

 

    (4)实体头部信息:针对请求报文和响应报文的实体部分使用的头部。补充了资源内容更新时间与实体有关的信息。

头部字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小,单位字节
Content-Location 替代对应资源的URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的媒体类型
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间

  3、非HTTP/1.1头部字段

  在HTTP协议通信交互中使用到的头部字段,不限于RFC2616中定义的47种头部字段。还有Cookie、Set-Cookie和Content-Disposition等在其他RFC中定义的头部字段,它们的使用

  频率也很高。这些非正式的头部字段统一归纳在RFC4229 HTTP Header Field Registrations中。

  4、End-to-end头部和Hop-by-hop头部

  HTTP头部字段将定义成缓存代理和非缓存代理的行为,分为两类:

    端到端头部(End-to-end Header):分在此类别中的头部会转发给请求/响应对用的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。

    逐跳头部(Hop-by-hop Header):分在此类别中的头部只对单次转发有效,会因通过缓存或代理而不再转发。在HTTP/1.1和之后的版本中,如果要使用hop-by-hop

      头部,需提供Connection头部字段。下面是HTTP/1.1中的逐跳头部字段,除这8个头部字段之外,其他所有字段都属于端到端头部。

      Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade。 

  5、通用头部字段详解

    Cache-Control,通过指定此字段的指令,就能操作缓存的工作机制。指令的参数是可选的,多个指令之间通过“,”分隔。如【Cache-Control:private,max-age=0,no-cache】

    Connection,此字段具备如下两个作用,

      1:控制不再转发给代理的头部字段,如【Connection:不再转发的头部字段名】

      2:管理持久连接,Connection:close,HTTP/1.1版本的默认连接都是持久连接。为此,客户端会在持久连接上连续发送请求。当服务器端想明确断开连接时,

        则指定Connection头部字段的值为Close。

        Connection:Keep-Alive,HTTP/1.1之前的HTTP版本的默认连接都是非持久连接。为此,如果想在旧版本的HTTP协议上维持持续连接,则需要指定Connection

        头部字段的值为Keep-Alive。

    Date,表明创建HTTP报文的日期和时间

    Transfer-Encoding,规定了传输报文主体时采用的编码方式,HTTP/1.1的传输编码方式仅对分块传输编码方式有效

    Via,使用头部字段Via是为了追踪客户端和服务器之间的请求和响应报文的传输路径。报文经过代理或网关时,会先在头部字段Via中附加该服务器的信息,然后再转发。

  6、请求头部字段详解

    Accept,通知服务器,客户端能够处理的媒体类型的相对优先级。可使用 类型/子类型这种形式,一次指定多种媒体类型。常见的有:

      文本文件: text/html,text/plain,text/css... 、 application/xhtml+xml,application/xml...

      图片文件:image/jpeg,image/gif,image/png...

      视频文件:video/mpeg,video/quicktime...

      应用程序使用的二进制文件:application/octet-stream,application/zip...

      若想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值,用分号分隔,权重值的范围是0-1(可精确到小数点后三位), 不指定权重q值时,默认权重为最大值q=1.0

    Accept-Charset,用来通知服务器客户端支持的字符集及字符集的相对优先顺序。另外,可一次执行多种字符集。与头部字段Accept相同的是可用权重q值来表示相对优先级。

    Accept-Encoding,用来告知服务器客户端支持的内容编码及内容编码的优先级顺序。可一次性指定多种内容编码。有gzip、compress、deflate、identity等,也可使用星号(*)

      作为通配符,指定任意的编码格式。

    Accept-Language,用来告知服务器客户端能够处理的自然语言集,以及自然语言集的相对优先级,可一次之指定多种自然语言集

    Authorization,告知服务器,客户端的认证信息(证书值)

    Except,告知服务器,期望出现的某种特性行为

    From,用来告知服务器客户端用户的电子邮件地址。使用代理时,应尽可能包含From头部字段(但可能会因代理不同,将电子邮件地址记录在User-Agent头部字段内)

    Host,多个虚拟主机可能运行在同一个IP上,因此使用头部字段Host加以区分【Host:www.baidu.com】

    User-Agent,会将创建请求的浏览器和用户代理名称等信息传达给服务器。

  7、响应头部字段详解

    Accept-Ranges,用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。可指定的字段值有两种,可处理范围请求时指定其为bytes,反之则指定其为none

    Age,告知客户端,源服务器在多久前创建了响应,字段值的单位为秒。

    Location,将响应接收方引导至某个与请求URI位置不同的资源。基本上,该字段会配合3XX:Redirection的响应,提供重定向的URI,几乎所有的浏览器在接收到包含头部字段Location

      的响应后,都会强制性地尝试对已提示的重定向资源的访问。

    Retry-After,告知客户端应该在多久之后再次发送请求。主要配合状态码503 Service Unavailable或3XX Redirect响应一起使用。

    Server,告知客户端当前服务器上安装的HTTP服务器应用程序的信息。

   8、实体头部字段

    在请求和响应两方的HTTP报文中都含有与实体相关的头部字段,用于补充内容的更新时间等与实体相关的信息。

    Allow,通知客户端服务器能够支持Request-URI指定资源的所有HTTP方法,当服务器接收到不支持的HTTP方法时,会以状态码405 Method Not Allowed作为响应返回。与此同时,还

      会把所有能支持的HTTP方法写入首部字段Allow后返回

    Content-Encoding,告知客户端服务器对实体的主体body部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。

    Content-Length,表明了实体主体部分的大小,单位是字节,对实体主体进行内容编码传输时,不能再使用Content-Length头部字段

    Content-Location,给出与报文主体返回资源相对应的URI

    Content-Type,说明了实体主体内对象的媒体类型

    Expires:告知客户端资源失效的日期。缓存服务器在接收到含有头部字段Expires的响应时,会以缓存来应答请求,在Expires字段值指定的时间之前,响应的副本会一直被保存。

      当超过指定的时间后,缓存服务器在请求发送过来时,会转向源服务器请求资源。源服务器不希望缓存服务器对资源缓存时,最好在Expires字段内写入与头部字段Date相

      同的时间值。

    Last-Modified:指明资源最后修改的时间

  9、为Cookei服务的头部字段

    Cookie的工作机制是用户识别及状态管理。Web网站为了管理用户的状态会通过Web浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该Web网站时,可通过客户

    端的请求报文头部取回之前发送的Cookie。由于可校验Cookie的有效期,以及发送方的域、路径、协议等信息,所以正规发布的Cookie内的数据不会因来自其他Web站点和攻击

    者而泄露

头部字段名 说明 头部类型
Set-Cookie 开始状态管理所使用的Cookie信息 响应头部字段
Cookie   服务器接收到的Cookie信息 请求头部字段

    Set-Cookie字段的属性:

属性 说明
NAME=VALUE 赋予Cookie的名称和其值
expires=DATE Cookie的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件夹)
domain=域名 最为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名)
Secure 仅在HTTPS安全通信时才会发送Cookie
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问,其主要目的是为了防止跨站脚本攻击(Cross-site scripting,XSS)对Cookie信息的获取

     Cookie:key=value

  

 

七、基于HTTP的功能追加协议

  HTTP功能的不足可通过创建一套全新的协议来弥补。可是目前基于HTTP的Web浏览器的使用环境已经遍布全球,因此无法完全抛弃HTTP。所以有一些新的协议是基于HTTP的,并在此基础

 上添加了新的功能。

  1、HTTP的瓶颈

    如在微博等社交网站上,几乎能够实时观察到海量用户公开发布的内容,但是当千万级别的用户发布内容时,网站为了尽可能显示这些更新的内容,服务器上一有内容更新,就需要把那些

  更新的内容及时反馈到客户端的界面上。若使用HTTP协议探知服务器上是否有内容更新,就必须频繁地从客户端到服务器端进行确认。如果服务器上没有内容更新,那么就会产生徒劳的通信。

  若想在现有Web实现所需的功能,以下这些HTTP标准就会称为瓶颈。

    (1):一条连接只可发送一个请求

    (2):请求只能从客户端开始。客户端不可以接收除响应以外的指令

    (3):请求/响应首部未经压缩就发送。首部信息越多延迟越大

    (4):发送冗长的首部,每次相互发送相同的首部造成的浪费较多。

    (5):可任意选择数据压缩格式。非强制压缩发送

    (6):客户端发送确认更新情况的请求时,不管是否有更新,服务端都要把数据全部再发送一次

    Ajax的解决方法

      Ajax(Asynchronous JavaScript and XML,异步JavaScript与XML技术)是一种有效利用JavaScript和Dom(Document Object Model,文档对象模型)的操作,以达到局部Web页面

    替换加载的异步通信手段。和以前的同步通信相比,由于它只更新一部分页面,响应中传输的数据量会因此而减少,这一优点显而易见。Ajax的核心技术是名为XMLHttpRequest的API,通

    过JavaScript脚本语言的调用就能和服务器进行HTTP通信。借由这种手段,就能从已加载完毕的Web页面上发起请求,只更新局部页面。而利用Ajax实时地从服务器获取内容,有可能会导

    致大量请求产生,另外Ajax仍未解决HTTP协议本身存在的问题。

    Comet的解决办法

      一旦服务端有内容更新了,Comet不会让请求等待,而是直接给客户端返回响应。这是一种通过延迟应答,模拟实现服务端向客户端推送(Server Push)的功能。通常,服务器端接收

    到请求,在处理完毕后就会立即返回响应,但为了实现推送功能,Comet会先将响应置于挂起状态,当服务器端内有内容更新时,再返回该响应。因此,服务器端一旦有更新,就可以立即

    反馈给客户端。但是为了保留响应,一次连接的持续时间变长了,期间,维持连接会消耗更多的资源。另外,Comet也并未解决HTTP协议本身存在的问题。

    SPDY

      SPDY:Goole在2001发布了SPDY(取自SPeeDY),其开发目标旨在解决HTTP的性能瓶颈,缩短Web页面的加载时间。SPDY并没有完全改写HTTP协议,而是在TCP/IP的应用层

    与传输层之间通过新加会话层的形式运作。同时考虑到安全性问题,SPDY规定通信中使用SSL。SPDY以会话层的形式加入,控制对数据的流动,但还是采用HTTP建立通信连接。因此可

    照常使用HTTP的GET和POST等方法、Cookie以及HTTP报文等。使用SPDY后,HTTP协议额外获得以下功能。

      1、多路复用流

      通过单一的TCP连接,可以无限制处理多个HTTP请求,所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高。

      2、赋予请求优先级

      SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题

      3、压缩HTTP头部

      压缩HTTP请求和响应的头部,这样一来,通信产生的数据包数量和发送的字节数就更少了。

      4、推送功能

      支持服务器主动向客户端推送数据的功能。这样,服务器可直接发送数据,而不必等待客户端的请求。

      5、服务器提示功能

      服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求。

    SPDY基本上只是将单个域名(IP地址)的通信多路复用,所以当一个Web网站上使用多个域名下的资源,改善效果就会受到限制。所以SPDY没有得到实质应用。

  2、WebSocket,使用浏览器进行全双工通信

    WebSocket,即Web浏览器与Web服务器之间全双工通信标准。一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程

  中可互相发送JSON、XML、HTML或图片等任意格式的数据。

    由于WebSocket是建立在HTTP基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文。

    WebSocket协议的主要特点:

    1、推送功能

      支持服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求。

    2、减少通信量

      只要建立起WebSocket连接,就希望一直保持状态。和HTTP相比,不但每次连接时的开销减少,而且由于WebSocket的头部信息很少,通信量也相应减少了。

    为了实现WebSocket通信,在HTTP连接建立之后,需要完成一次“握手”(Handshaking)的步骤:

    握手,请求:

      为了实现WebSocket通信,需要用到HTTP的Upgrade头部字段,告知服务器通信协议发生改变,以达到握手的目的。

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==  // 记录握手过程中不可少的键值
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat  //记录使用的子协议
Sec-WebSocket-Version: 13

    握手,响应:

     对于之前的请求,返回状态码101 Switching Protocol的响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=  // 由握手请求中的Sec-WebSocket-Key的字段值生成的
Sec-WebSocket-Protocol: chat

    成功握手确立WebSocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧。

    WebSocket API:JS可调用“The WebSocket API”(https://www.w3.org/TR/websockets/)内提供的WebSocket程序接口,以实现WebSocket协议下全双工通信,如调用WebScoket

  API,每50ms发送一次数据的实例:

var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function () {
setInterval(function() {
if (socket.bufferedAmount == 0)
socket.send(getUpdateData());
}, 50);
};

 

  3、HTTP/2.0

  特点:HTTP/2.0的目标是改善用户在使用Web时的速度体验。TODO

 

posted @ 2019-09-17 19:16  杨岂  阅读(331)  评论(0编辑  收藏  举报