铣床夹头
什么是HTTP隧道,怎么理解HTTP隧道呢?
总述:
HTTP 1.1引⼊了HTTP tunnel,提供了⽀持任意流量的TCP隧道的能⼒。
HTTP proxy是⼀个中间⼈,是客户端去请求代理,代理修改请求再去请求⽹站,proxy不能代理HTTPS请求,因为代理不可能获得⽹站的私钥。 HTTP tunnel 不需要改写请求包,将C S之间的流量直接转发,所以可以传输代理TLS加密的HTTPS流量。
HTTP tunnel
HTTP tunnel使⽤CONNECT⽅法进⾏建⽴隧道连接通信。
HTTP tunnel是HTTP/1.1中引⼊的⼀个功能,主要为了解决明⽂的HTTP proxy⽆法代理跑在TLS中的流量(也就是https)的问题,同时提供了作为任意流量的TCP通道的能⼒。HTTP tunnel 不需要改写请求包,将C S之间的流量直接转发,所以可以传输代理TLS加密的HTTPS流量。
海空在召唤
:
CONNECT报⽂没有后⾯的负载部分,只有Request-Line和header后⾯以两个\r\n断开,Request-Line和header均是由代理服务器使⽤,不会发送到远程服务器。请求的header部分⼀旦结束(连续的两组CRLF),后⾯所有的数据都被视为应该发给远端服务器(⽹站)的数据,代理需要把它们直接转发,⽽且不限长度,直到从客户端的TCP读通道关闭。 响应同理:对于CONNECT报⽂的返回值,代理服务器在和远端服务器成功建⽴连接后,可以(标准说的是可以,但是⼀般都会)向客户端(浏览器)返回任意⼀个2xx状态码,此时表⽰含义是和远端服务器建⽴连接成功,这个2xx返回报⽂的header部分⼀旦结束(连续的两组CRLF),后⾯所有的数据均为远端服务器返回的数据,同理代理会直接转发远端服务器的返回数据给客户端,直到从远端服务器的TCP读通道关闭。
2008奥运会会徽HTTP proxy ,如何⼯作
HTTP tunnel出来之前,HTTP proxy⼯作在中间⼈模式,即在⼀次请求中,客户端(浏览器)铭⽂的请求去请求代理服务器。代理服务器明⽂去请求远端的服务器(⽹站)。整个过程的请求响应内容(密码cookie等)代理服务器都是可见的。且使⽤HTTP proxy模式要求代理服务器对请求报⽂进⾏适当修改,RFC2616 5.1.2中要求请求代理的报⽂中Request-URL使⽤绝对路径,即以http开头:
使⽤了代理后,发送的报⽂将变为:
GET stackoverflow/ HTTP/1.1\r\n
Host: stackoverflow\r\n
Proxy-Connection: keep-alive\r\n
\r\n
代理从请求的第⼀⾏中得知要请求的⽬标是stackoverflow,端⼝为默认端⼝(80),将第⼀⾏改写后,向⽹站服务器发送请求:
GET / HTTP/1.1\r\n
Host: stackoverflow\r\n
巴士之家Connection: keep-alive\r\n
\r\n
因为:如果代理HTTPS流量,那么就会变成浏览器和代理握⼿跑TLS,代理拿到明⽂的请求报⽂,代理和⽹站握⼿跑TLS。但是代理没有,也不可能有⽹站的私钥证书,所以这么做会导致浏览器和代理
之间的TLS⽆法建⽴,证书校验根本通不过。但是HTTP tunnel的出现解决了这个问题,代理服务器不再作为中间⼈,不在⽤改写请求。
HTTP隧道和SOCKS隧道的区别
其中相同的地⽅:
都能在请求中指明要请求的⽬标和端⼝。
都会建⽴能传输任何流量的TCP通道,代理服务器对流量内容不关⼼。平面度测试仪
都是在报⽂前部的描述信息结束后,将后续所有数据视为转发的客户端和服务端数据,直到通道关闭。
都可以进⾏客户端的⾝份验证,⽽且有多重⾝份验证协议可选。
不同的地⽅:
SOCKS5的报⽂⽆论请求还是返回,内容均是固定的。⽽CONNECT报⽂作为HTTP/1.1的报⽂之⼀,当然也包括了HTTP/1.1可以传输任何⾃定义header的功能,虽然⼀般代理不会响应CONNECT报⽂上的⾮标准header,但是⾃⼰实现⼀个客户端和服务器通过header传输⼀些其它数据也是符合标准的。
SOCKS5 request报⽂中的address,根据address type(ATYP)字节的值,可以显式声明为IPv4地址、IPv6地址、域名(domain)。⽽CONNECT报⽂中的Request-URI根据RFC要求必须为authority形式(即没有前缀,只包含host,以及可选的port,其中host和port要⽤":"分隔),也就是说CONNECT报⽂不会显式的区分IP地址和域名,均作为host传输。
由于CONNECT报⽂还是http,所以也可以跑在TLS⾥,也就是说客户端和代理跑⼀层TLS,这⼀层⾥⾯客户端和远端服务器再跑⼀层TLS。这样当代理服务器需要⽤户名密码验证,⽽验证⽅式⼜是Basic时,可以通过TLS来保护代理请求报⽂中的明⽂⽤户名密码。
>苄基三乙基溴化铵