在HTTP/1.1中升级到TLS( 三 )


方法用以建立一个跨越代理的隧道 。
隧道一旦建立,第3节描述的操作都可用于建立TLS连接 。
5.1逐跳升级的含义
当一个源服务器从代理收到一个升级头并以101转换协议响应,它只是改变自己和代
理之间连接的协议 。同样,一个代理可以返回给客户101响应来改变该连接上的协议,该
协议独立于与源服务器通信的协议 。
这种情况使得诊断426响应变得更加复杂 。由于升级是一个逐跳的头部,一个不识别
426响应的代理可能会删去相随的升级头部,使得客户无法决定如何进行协议转换 。若客户
端收到一个没有相随的升级头部的426状态码,它将如5.2节中描述的那样请求一个端到端
隧道连接并一直请求以获得需要的升级信息 。
这个端到端的升级定义是一个深思熟虑的选择 。这答应代理每端的增量实施,和在级
联的代理间的优化协议,而无需知道改变之外的部分 。
5.2用CONNECT请求一隧道
CONNECT方法请求代理代表它建立一个连接通道 。请求命令行的请求URI部分总是如URI通
用语法[2]定义的一个‘authority",该定义指明请求连接的目的主机名和端口号,由冒
号分隔:
CONNECTserver.example.com:80HTTP/1.1
Host:server.example.com:80
其它HTTP机制能和CONNECT方法一起正常使用――除了端到端的协议升级请求――由于必
须先建立隧道这是当然的 。
例如,proxyauthentication可被用来建立创建隧道的机构:
CONNECTserver.example.com:80HTTP/1.1
Host:server.example.com:80
Proxy-Authorization:basicaGVsbG86d29ybGQ=
如同任何其它的管道HTTP/1.1请求,由隧道通过的数据可以在空行后立即发送 。通常的警
告是:若最终的响应是拒绝的话,数据可以被丢弃,若有超过一个TCP数据段未完成,则
连接可以不做任何响应而被复位 。
5.3使用CONNECT建立一个隧道
对CONNECT请求的任何成功(2xx)的响应都表示代理已经和被请求的主机及相应端口
建立了连接,并且已经切换到在同该服务器的连接上开通隧道 。
代理本身可能必须通过另一个代理才能到达请求的源服务器 。在这种情况下,第一个
代理应该生成同下一个代理建立连接的请求,请求一个同authority的通道 。代理绝不能
对2xx状态码响应,除非它已经有一个到authority直接的或隧道的连接 。
一个源服务器接收到对自己的连接请求可以用2xx状态码响应,表示连接已经建立 。
假如在任何时候任何一方断连,任何来自于该端的数据将传送到另一方,之后另一方
的连接也被代理终止 。若有到先断连一端的数据未传送,这些数据都将被丢弃 。
6使用4xx(客户错误)状态码的原理
可靠的,共同协商的升级特性需要一个明确的失败信号 。426升级请求状态码答应服务
器明确地声明必须提供一个给定资源想要的协议扩展 。
起先看起来,响应应具有重定向的某种形式(3xx码),类似到一个https:URI的旧式重
定向 。但不理解升级机制的用户代理使得不能这样做 。
设想某个3xx代码已被赋与“需要升级”的含义;一个不能识别它的用户代理将把它
当做300 。它可能在响应中寻找一个“Location”头并试图重复对头部域中的URL的请求 。
由于它不知道升级以合并TLS层,它最终在新的URL上会再次失败 。
7.IANA的考虑
如BCP26[10]中描述的,IANA将为二种名字空间登记:
HTTP状态码
HTTP升级记号
7.1HTTP状态码登记
HTTP状态码的登记定义了在HTTP响应的状态行中的状态码记号 。这个名字空间的初始

推荐阅读