2020年11月

与HTTP协作的Web服务器

一个Web服务器可搭建多个独立域名的Web网站,也可作为通信路径上的中转服务器提升传输效率

用单台虚拟服务器实现多个域名

利用虚拟主机功能,HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点。

此时在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI

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

HTTP通信时,除服务器和客户端以外,还有些用于通信数据转发的应用程序,如代理网关隧道,这些可以将请求转发给通信显露上的下一站服务器,并且能接受从那台服务器发送的响应再转发给客户端

代理

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

代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器,代理不改变请求URI,会直接发送给持有资源实体的服务器,也就是源服务器,从源服务器返回的响应结果代理后再传给客户端

在通信过程中,可连接多态代理器,转发时需要发家Via首部字段以标出经过的主机信息

使用代理服务器可以利用缓存技术减少网络带宽流量、对特定网站的访问控制、获取访问日志等等。

代理的使用方法按照两种基准分类,一种是是否使用缓存,另一种是是否会修改报文

缓存代理

代理转发响应时,缓存代理会预先将资源的副本保存在代理服务器上,当代理再次接收到对应的请求时,可以将之前的缓存作为响应返回

透明代理

转发时,不对报文做任何加工

网关

网关是转发其他服务器通信数据的服务器,接受从客户端发送来的请求时,他会像自己拥有资源的源服务器一样对请求进行处理

隧道

隧道是在相隔很远的服务器和客户端之间进行中转,保持双方通信连接的应用程序,届时使用SSL等加密手段进行通信,确保两者之间能进行安全的通信。隧道本身不会去解析HTTP请求,隧道在通信双方断开连接时结束

保存资源的缓存

缓存指代理服务器或客户端本地磁盘内保存的资源副本,利用缓存可坚守对源服务器的访问

缓存服务器会将从服务器返回的资源保存一份副本,利用缓存可避免多次从源服务器转发资源

缓存的有效期限

当源服务器上的资源更新时,缓存就变成旧资源了,即使存在存才,也会去想源服务器确认资源的有效性,如果判断缓存失效,缓存服务器会再次从源服务器上获取新资源

客户端缓存

缓存也可以存在在客户端浏览器当中,如果浏览器缓存有效,就可以直接从本地磁盘中读取

HTTP状态码

状态码可以告知服务器端返回的请求结果

响应类别:

  1. 1XX(信息性状态码)请求正在处理
  2. 2XX(成功状态码)请求正常处理完毕
  3. 3XX(重定向)需要进行附加操作以完成请求
  4. 4XX(客户端错误)服务器无法处理请求
  5. 5XX(服务器错误)服务器处理请求出错

常用状态码

2XX

请求被正常处理

200 OK

表示请求被正常处理了,响应报文内容会随着方法不同而不同

204 No Content

请求成功处理,但是返回的响应报文内不含实体的主体部分,也不允许返回任何实体的主体

206 Partial Content

表示客户端进行了范围请求,且服务器成功执行了这部分的GET请求,响应报文中包含有Content-Range指定范围的实体内容

3XX

重定向

301 Moved Permanent

永久重定向,表示请求的资源已经被分配了新的URI

当指定资源路径最后忘记加斜杠也会产生301

302 Found

临时重定向,表示请求的资源已经被分配了新的URI,希望用户能用新的URI访问

与301不同的是这个移动只是临时性质的

304 See Other

表示请求的资源存在着另外一个URI,应使用GET方法定向获取请求的资源

当301,302,,303响应状态码返回时,几乎所有浏览器会把POST改成GET,并删除请求报文内的主体,然后请求会自动再次发送

304 Not Modified

表示当客户端发送带条件的请求时,服务器允许请求访问资源,但不满足条件,返回时不带任何响应的主体部分

307 Temporary Redirect

临时重定向,与302不同的是他不会把POST改成GET

4XX

400Bad Request

表示请求报文中存在语法错误,需要修改请求内容后再次发送请求,浏览器会像200OK一样对待该状态码

401 Unauthorized

表示请求需要用通过HTTP认证的认证信息,返回401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询用户信息,当浏览器初次接收到401,会弹出认证用的对话窗口,如果之前已经进行过请求,则表示用户认证失败

403Forbidden

表示对请求资源的访问被服务器拒绝了

404Not Found

表示服务器上无法找到请求资源,也可以在服务器拒绝请求且不想说明理由时使用

5XX服务器错误

表示服务器本身发生错误

500 Internal Server Error

表示服务器在执行请求时发生了错误,也可能是Web引用存在的bug或者某些临时的故障

503 Service Unavailable

表示服务器暂时出于超负载或者进行停机维护,现在无法处理请求

状态码和实际状态并不会完全一致

编码提升传输速率

获取部分内容的范围请求

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

HTTP信息

用于HTTP协议交互的信息叫做HTTP报文,全球短叫做请求报文,响应端叫做响应报文

HTTP报文大致可分成报文首部(请求/状态行+各种首部字段)和报文主体两块,两者使用空行划分(CR+LF),报文主体并非必须
请求报文响应报文.png
一般报文首部组成:

请求行:包含用于请求的方法,请求URI和HTTP版本

状态行:包含表名响应结果的状态码,原因短语和HTTP版本

首部字段:包含请求和响应的各种条件和属性的各种首部,通常有4种首部:通用/请求/响应/实体首部

其他RFC中没有定义的首部(如Cookie)

编码提升传输速率

HTTP早传输数据时可以通过编码来提升传输速率,但是编码需要由计算机来完成,因此会消耗更多的CPU等资源

报文主体和实体主体

报文:HTTP通信的基本单位,由组字节流组成

实体:作为请求或响应的的有效载荷数据被传输,内容有实体首部+实体主体

通常报文主体等于实体主体,但当进行编码时,实体主体内容发生变化与报文主体产生差异

压缩传输的内容编码

内容编码知名应用在实体内容上的编码格式,保持实体信息原样压缩,之后又客户端接收并负责解码,常用的又gzip.compress,deflate,identity

分割发送的分块传输编码

在传输大容量数据时,把数据分割成多块,能让浏览器逐步显示页面,这种把实体主体分块的功能成为分块传输编码

传输编码把实体主体分恒多个部分,每个用十六进制标记大小,实体主体的最后会用“0(CR+LF)”来标记

客户端接收后负责解码

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

HTTP协议采用了多部分对象集合,发送的报文主体内科含有多类型实体

多部分对象集合包含对象如下

  1. multipart/form-data:在Web表单文件上传时使用
    multipartform-data.png
  2. multipart/byterangers:状态码206响应报文包含多个范围的内容时使用
    byteranges.png
    在HTTP报文中欧冠使用多部分对象集合时,需要在首部字段加上Content-type

使用边界字符串划分多部分对象集合指明的各类实体,在边界字符串指定的各个实体的起始行钱插入“--”标记(如上面的--AaB03x,--THis_STRING_SEPARATES)在多部分对象集合对于的字符串最后插入“--”标记作为结束

多部分对象集合的每个部分类型中,都可以含有首部字段,另外刻在某个部分中嵌套使用多本分对象集合,具体查看RFC2046

获取部分内容的范围请求

如果下载文件中遇到网络中断的情况,如果想要实现恢复(从下载中断处恢复下载)机制,则需要制定下载的实体范围,制定实体范围发送的请求叫做范围请求

执行范围请求时,会使用首部字段Range来制定资源的byte范围
Range: bytes=5001-10000
Range: bytes=5001- 从5001之后全部
Range: bytes=-3000, 5000-7000 开始到3000,5000到7000

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

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

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

内容协商机制是指客户端和服务器就响应的资源内容进行交涉,然后提供合适的资源。

内容协商机制通过请求报文中的某些首部字段作为判断的标准

内容协商技术有3种类型

  1. 服务器驱动协商:有服务器端进行内容协商,以请求的首部字段为参考
  2. 客户端驱动协商:由客户端进行内容协商,用户从浏览器显示的可选项列表中手动选择
  3. 透明协商:即服务器驱动和客户端驱动的结合体

HTTP 协议用于客户端和服务器端之间的通信

HTTP协议和TCP/IP协议族内的其他众多的协议相同,用于客户端和服务器之间的通信。
请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。

通过请求和响应交换达成通信

HTTP规定请求从客户端发出,服务器响应后返回

请求报文.png
GET表示请求访问服务器的类型,称为方法( method)。随后的字符串/index.htm指明了请求访问的资源对象,也叫请求URI(request-URI)。HTTP/1.1,即HTTP的版本号,用来提示客户端使用的HTTP协议功能。

请求报文=请求方法+请求URI+协议版本+可选的请求首部字段+内容实体构成的。

回复
HTTP/1.1 表示服务器对应的HTTP版本。200 OK表示请求的处理结果的状态码(status code)和原因短语( reason-phrase)

下一 -行显示了创建响应的日期时间,是首部字段( header field)内的一个属性。
接着以一空行分隔,之后的内容称为资源实体的主体( entitybody )。

响应报文=协议版本+状态码(表示请求成功或失败的数字代码)+用以解释状态码的原因短语+可选的响应首部字段以及实体主体

HTTP是不保存协议状态

HTTP是一种不保存状态,即无状态( stateless) 协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。如果想实现保持状态功能,就得引入Cookie技术

请求URI定位资源

HTTP使用URI定位互联网上的资源,当客户端请求访问资源时,URI需要作为请求URI包含在请求报文里,如果不是访问特定资源而是对服务器本身发起请求,可以用*代替请求URI
请求URI包含方式.png

告知服务器意图的HTTP方法

GET:获取资源
GET方法用来请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。

GET在传输过程,数据被放在请求的URL中,且受URL长度限制,传送的数据量较小,Get是form提交的默认方法, Get限制Form表单的数据集的值必须为ASCII字符
GET.png

POST:传输实体主体
与GET相近,Post的所有操作对用户来说都是不可见的,且传送的数据量较大,一般被默认为不受限制,支持整个ISO10646字符集

PUT:传输文件
PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。

PUT方法自身不带验证机制,存在安全性问题,

HEAD:获得报文首部
HEAD方法和GET方法- -样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。

DELETE:删除文件
DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定的资源。

HTTP/1.1 的DELETE方法本身和PUT方法一样不带验证机制,不安全

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

TRACE:追踪路径
TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。

发送请求时,在Max-Forwards首部字段中填人数值,每经过一一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK的响应。

容易引发XST攻击,不安全

CONNECT:要求用隧道协议连接代理CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL ( Secure Sockets Layer,安全套接
层)和TLS ( Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
各版本支持方法.png

持久连接

只要容易一段没有明确提出断开连接,借保持TCP连接状态,在HTTP/1.1中所有链接默认都是持久连接

管线化

持久连接使得请求以管线化方式发送成为可能,即多个请求同时并行发送,不需要等待之前发送的请求得到响应

Cookie

Cookie会根据从服务器端发送的响应报文内的Set-Cookie首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务器端发现客户端发送过来的Cookie后,会对比服务器上的记录得到之前的状态信息
Cookie.png