前提:

HTTP/1.1中,默认开启长连接,如客户端不需要,需要加上请求首部connection:close告知服务器。如服务器不支持长连接,则需要加上响应首部connection:close告知客户端,否则需要加上响应首部connection:keep-alive
HTTP/1.0中,默认不开启长连接,如客户端需要,需要加上请求首部connection:keep-alive告知服务器。如服务器不支持长连接,则需要加上响应首部connection:close告知客户端,否则需要加上响应首部connection:keep-alive

所谓连接并不是一个水管连接起来,而是人们想象出来的东西。

传统的短连接只是在发送真正的数据包前,加了一个发送握手数据包的过程。而在发送完数据包之后,加了一个挥手数据包的过程。

而长连接也只是在发送完数据包后,不着急发送挥手数据包,继续发送数据包。

请注意,长连接是tcp/ip层面的东西,http应用只是根据connection首部去控制tcp/ip层数据包而已,这一点非常重要。

在HTTP中代理要用什么方式去连接server,代理说了算。客户端能控制的只是自己与代理之间的连接。

HTTP代理

首先看普通的CS模型

然后来看一下中间有代理的

有区别的地方我用红框标出来了,第一个红框不难理解,先解释第二个红框吧

代理服务多种多样,有聪明的即能完整做到http协议的,也有笨的只能做到一部分http协议的,我们称之为盲中继。

在http协议中,代理层是不允许转发connection首部,而盲中继则会转发connection首部
如果转发了connection首部,意味着客户端可以控制代理层与server之间的连接,让我们来看看问题

以上图为例,盲中继会将connection首部进行转发,并且往往在响应和请求时都只支持http1.0

带来的结果是:服务器认为自己在进行长连接,客户端也认为自己在进行长连接,但代理层根本不知道什么长连接

于是代理层认为server应该关闭连接,于是该连接挂起。与此同时客户端认为自己在进行长连接,于是继续发送http事物给代理,代理层则忽略客户端发来的任何请求,于是一直在打圈,在超时后,连接断开。

这种问题我们是不想看到的,虽然我们规定了代理层不允许转发connection首部,但我们又不能要求所有人都不使用盲中继,于是就有了上面的那种解决方案:

当代理层理解http事物时,他将请求头改成了connection:keep-alive发送给Server。

盲中继则是继续无脑转发,而proxy-connection只被服务器当成了一个普通首部而不会影响

注意上面几张图http协议版本号的转化

最后说说第三个框,squid代理中,响应请求使用的是http1.0,发送请求时使用的是http1.1,具体为什么,可能是因为我的squid版本比较老造成的,我们要知道,发请求远比处理请求简单的多。据说squid3.0可以完美支持http1.1响应了。

最后我们在命令行中证明一下上面的结论。

不经过代理

使用squid代理

HTTPS代理

HTTPS只是在http与tcp之间加了一个ssl层,

重要的是,在客户端与代理建立连接后,客户端发往代理的http事务数据是经过加密的,请看下图

注意加密的只是http事务数据,tcp/ip的数据包是不会被加密的,否则路由器理解不了,这一点在之后理解长连接短连接非常重要。

在http中通过代理时,应将数据发往谁,是在http首部中定义的,如

而在https中,代理收到的http请求全是加密的,因此代理不知道该发往谁

所以代理层是这么处理的:客户端在发送真正数据包之前,以明文方式告诉代理应将报文发往谁即可,请看下图。

也就是说,客户端先使用connect方法让代理与server事先建立好一个连接,代理收到同一客户端的后续请求,只需使用事先建立好的连接即可。

因此https代理必须支持connect方法

最后在命令行中验证一下

telnet 实现

由于代理层收到的都是加密的http报文,因此代理能做到的仅仅是无脑转发http报文,这种行为我们叫做隧道。

但是注意只是http报文被加密了,tcp/ip报文依然是明文的,如果连tcp/ip报文都被加密,路由器就无法理解了,也就无法传递了。

而tcp长短连接,是在tcp/ip报文中控制的。

在http中,client和server可以根据connection首部来判断后发送相应的tcp/ip报文。

由于代理无法理解http行为,因此也无法在http层面上根据connection头来控制长连接。

因此长短连接均由cilent和server的connection控制,这点是与http有决定性不同的

因此如果一条连接发生了断开请求,另一端一定会立刻开始断开,可以说,https中代理的两侧连接是同步的,来看一下。

HTTP代理:由于代理层可以理解http报文,则可能出现客户端与代理通信是短连接,而代理与服务器间通信是长连接的情况。

HTTPS代理:由于代理词只能收到加密的http报文,无法根据connection首部判断发送相应的tcp/ip报文,只能根据client或者server的tcp/ip报文来转发,因此两侧的连接状态是相同的。

最后,同样由于https代理是无法添加http首部的,所以server无法获得client的ip,而http中是可以的。

转自:https://www.cnblogs.com/selol/p/5446965.html

【转】http与https代理中的差异及细节相关推荐

  1. 代理中调用alert()

    在web下调用LotusScript代理时,实现弹出一个窗口,一般的做法是在代理中用Print语句: Print  {<script>} Print  {alert("提示信息& ...

  2. 直播 | 清华大学郑楚杰:知识增强对话生成中的差异感知知识选择

    「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...

  3. 小牛带你nginx反向代理中神奇的斜线

    在进行nginx反向代理配置的时候,location和proxy_pass中的斜线会造成各种困扰,有时候多一个或少一个斜线,就会造成完全不同的结果,所以特地将location和proxy_pass后有 ...

  4. Nginx多进程高并发、低时延、高可靠机制在缓存(redis、memcache)twemproxy代理中的应用...

    1. 开发背景 现有开源缓存代理中间件有twemproxy.codis等,其中twemproxy为单进程单线程模型,只支持memcache单机版和redis单机版,都不支持集群版功能. 由于twemp ...

  5. StringBuilder和Char[]在平台调用中的差异

    StringBuilder和Char[]在平台调用中的差异如下: StringBuilder不能接收以2个'\0'结尾的多个字符串集合,只能保留第一个字符串,剩余的字符串被舍弃.而Char[]可以获取 ...

  6. nginx https透明代理_nginx正向https代理配置

    一.前言 1.1 正向代理功能比较简单,但是原生nginx不支持https代理,如果访问https网站,会报错. # nginx代理不支持http CONNECT方法:curl: (56) Recei ...

  7. Nginx多进程高并发、低时延、高可靠机制在滴滴缓存代理中的应用

    开发背景 现有开源缓存代理中间件有twemproxy.codis等,其中twemproxy为单进程单线程模型,只支持memcache单机版和redis单机版,都不支持集群版功能. 由于twemprox ...

  8. 使用woo 语言开发 sockets4 sockets5 http https代理完整记录

    记录下使用woo语言开发 sockets 和https代理过程 已经在gitee开源: https://gitee.com/oshine/woo_proxy 目前使用的是一个端口监听所有的代理包含ht ...

  9. 成功解决 git设置http代理 https代理 取消代理

    welcome to my blog 问题: 使用hexo搭建博客, 执行hexo init时包含git clone的操作,但是使用的是https协议, 不是ssh, 所以为git设置https代理, ...

最新文章

  1. python - 栈与队列(只有代码)
  2. 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第9章-不确定分数阶系统的包含控制
  3. Redis开发:hash存储自定义Java对象及value的序列化器设置
  4. TreeView的checked事件
  5. 如何运行 PPAS上的pgpool-II
  6. MongoDB Database Profiling
  7. DDR2与DDR的区别
  8. 飞机大战——图文详解
  9. 计算机学术论文写作与发表
  10. Linux虚拟机中安装vim(超详细)
  11. 部分移动卡 无人接听时呼叫转移失败 问题分析
  12. 自制ADK To Win11PE,加入原生explorer,初步修改注册表(图文1.1万字,很细) (2)
  13. 毛永胜计算机教师,呼和浩特市小学信息技术学科基本功获奖教师展示课活动
  14. 钉钉小程序如何判断其当前环境
  15. 用户浏览页面时,token过期怎么处理?
  16. expire_logs_days
  17. linux删除screen命令,Linux screen命令
  18. mac-使用屏幕共享功能
  19. c++ 父类调用子类的方法
  20. 利用ADS进行低噪声放大器(LAN)的设计

热门文章

  1. 2018-2-3 test17
  2. VC中MessageBox与AfxMessageBox用法与区别
  3. 固定电话增值业务使用方法
  4. MAC 系统多版本 JDK 安装指南:让你在开发中轻松应对不同版本需求
  5. java项目前端 手机端下载 .xls 文件,手机默认浏览器下载后缀名变成htm 或者 乱码 解决办法
  6. Oracle 字符串拼接函数使用方法
  7. 51Nod 1674——区间的价值 V2
  8. 一篇文章带你了解面积图
  9. 树莓派Linux内核编译、文件系统、Linux内核驱动基础框架、驱动测试步骤、总线地址
  10. Day 169/200 Vue3 如何设置定时器以及清除定时器?