V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lxk11153
V2EX  ›  Java

okhttp 用 Java .net.Proxy.Type.HTTP 还是 Java .net.Proxy.Type.SOCKS,哪个快?

  •  
  •   lxk11153 · 2020-08-01 16:06:45 +08:00 · 2863 次点击
    这是一个创建于 1575 天前的主题,其中的信息可能已经有所发展或是发生改变。

    排除其它因素,仅比较 HTTP 和 SOCKS,哪个速度更快?

    18 条回复    2021-08-20 11:30:07 +08:00
    AoEiuV020
        1
    AoEiuV020  
       2020-08-01 16:57:21 +08:00
    这还真没在意过,搜了下没有讨论这个的,但有听说 socks 代理不关心数据包内容所以更快,
    lxk11153
        2
    lxk11153  
    OP
       2020-08-01 17:05:28 +08:00
    @AoEiuV020 #1 它这个代理会分版本的吗?
    1. Proxy.Type.HTTP 和网络请求里的 http1.0 http1.1 http2 对应的吗?
    那买的代理会分 http1.0 http1.1 http2 吗?
    2. Proxy.Type.SOCKS,我想买的一般都是 socksV5 的吧
    3. http://cs50mu.github.io/blog/2014/10/05/socks-proxy-and-http-proxy/
    AoEiuV020
        3
    AoEiuV020  
       2020-08-01 17:32:56 +08:00
    @lxk11153 1. 据我所知是 http 版本不影响 http 代理的,
    2. 没买过 socks 代理的,在意的话买之前问服务商比较好,
    3. 文章里提到的 http 代理问题实际上是翻墙软件的问题,正常 http 代理 https 流量也不会有证书问题的,
    https://www.cnblogs.com/selol/p/5446965.html
    lxk11153
        4
    lxk11153  
    OP
       2020-08-01 17:59:02 +08:00
    @AoEiuV020 #3 可以从 wiki 上看出来吗? /wiki/SOCKS#与 HTTP 代理的对比
    mind3x
        5
    mind3x  
       2020-08-01 20:04:05 +08:00   ❤️ 1
    很难说,要看你实际用的场景。理论上说 Socks 可以单 TCP 连接复用,在里面跑多个连接,能省下从客户端到代理这一段多次建立连接的开销。
    有点类似于 HTTP 1.1 长连接,单次连接可以跑多个 HTTP 请求,省下建立多个连接的三次握手开销。区别是 socks 省的连接建立开销只是客户端到代理这一段;而支持 HTTP 1.1 的代理在两端都只需要一个连接,但只限同一个远端 server(不是代理 server),不同的 server 还是不同的代理连接。
    然而更复杂的情况还有在 socks 里建立 HTTP 1.1 连接,以及 HTTPS / HTTP 2.0 。Socks 在传输层,不管 HTTP 版本,所以哪种 HTTP 都能跑,都能多路复用。HTTP 代理在代 HTTPS 的时候必须走 HTTP CONNECT 建单独的 tunnel,并且 HTTP 2 因为强制 server 端证书,其实不能走 HTTP 代理的。更精确的说,你可以有一个跑 HTTP 2 的协议的 HTTP 代理来获取 HTTP 1.0/1.1+HTTPS 的网站,但无论何种 forward 类型的代理都不能代理 HTTP 2 协议的服务器。只有反代可以代理 HTTP 2 服务,因为反代可以正确配置证书。

    说了一堆,你可能觉得 Socks 代理会更快,但其实未必。多路复用一个 TCP 连接看上去很美好,这也是 Google 当年设计 SPDY 的动机,但实际应用,只要跑在这个单连接里的任意一路 channel 有数据包堵塞,你所有 channel 就全堵塞。

    打个比方,你走 socks 代理复用一个 TCP 建立了 5 个代理连接,走 HTTP 代理用 5 个 TCP 连接建立了 5 个代理连接,如果这 5 个连接里有一个出现丢包,你走 socks 的其他 4 个都得一起等着,而走 HTTP 的另外 4 个还能正常收数据。

    所以说完了都是废话,请实际试试看吧 xD
    lxk11153
        6
    lxk11153  
    OP
       2020-08-01 20:06:56 +08:00
    @AoEiuV020 问另一个问题
    方案 1: 一台电脑 500 线程 ,无代理 ,请求同一个 http 接口,(可能需要考虑 http 连接池
    方案 2: 一台电脑 500 线程 ,每个线程一个不重复代理 ,请求同一个 http 接口(假设代理质量优

    你觉得两者在 http 接口响应上,性能如何?哪个方案返回较快?
    lxk11153
        7
    lxk11153  
    OP
       2020-08-01 20:09:36 +08:00
    @mind3x #5 谢谢大神,再请教下#6 问题
    mind3x
        8
    mind3x  
       2020-08-01 20:12:33 +08:00
    换句话说,低丢包率的环境(这里说的低是非常低,低于 1%那种),socks 表现会好一些,反之 HTTP 代理会好些。当然,如果可以配置,你也可以让 socks 代理禁用多路复用。
    lxk11153
        9
    lxk11153  
    OP
       2020-08-01 20:12:50 +08:00
    @mind3x http 版本对应关系是如下吧?
    -- http
    ---- http1.0
    -- https
    ---- http1.1
    ---- http2
    mind3x
        10
    mind3x  
       2020-08-01 20:17:31 +08:00
    @lxk11153 不是,本来 1.0/1.1/2 只是 HTTP 应用层协议,由下面传输层决定是 HTTP 还是 HTTPS (TCP 或 TLS)。复杂的地方在于 HTTP 2 强制要求 TLS,而 HTTP 代理又允许在先走明文 TCP 建立连接,再走 CONNECT 原语在 HTTP 层把连接升级成 HTTPS [大型狗头]
    mind3x
        11
    mind3x  
       2020-08-01 20:19:26 +08:00
    @lxk11153

    方案 1: 一台电脑 500 线程 ,无代理 ,请求同一个 http 接口,(可能需要考虑 http 连接池
    方案 2: 一台电脑 500 线程 ,每个线程一个不重复代理 ,请求同一个 http 接口(假设代理质量优

    不看线路连接质量的话,当然是 1 快,2 是完全额外的开销。但直连丢包率高的话走代理就有优势了,就是相当于改个路由。
    lxk11153
        12
    lxk11153  
    OP
       2020-08-01 20:27:52 +08:00
    @mind3x #10 问题#9 不是想问代理相关,是想问 http1.0 是指 http://httpbin.org/get 里的 http 吗?
    http1.1/2 是 https://httpbin.org/get 里的 https 吗?

    但是应该是我理解错了,比如 curl 测试 curl -sv 'http://httpbin.org/get' >/dev/null
    * Connected to httpbin.org (3.220.112.94) port 80 (#0)
    > GET /get HTTP/1.1
    > Host: httpbin.org
    mind3x
        13
    mind3x  
       2020-08-01 20:31:23 +08:00
    @lxk11153 是的,我的回答 #10 就是在说,HTTP 是 HTTP over TCP,HTTPS 是 HTTP over TLS,和 1.0/1.1/2.0 无关。但 2.0 规定必须是 over TLS 。代理是另外一种例外情况。
    lxk11153
        14
    lxk11153  
    OP
       2020-08-01 21:04:23 +08:00
    @mind3x #13 我这么理解对不对?
    0. 如果服务器版本是 HTTP/1.0,没得选,你也只能通过非加密方式访问
    1. 服务器版本是 HTTP/1.1,用非加密的方式访问,因为向下兼容,所以允许你用非加密方式来访问
    ---- (加密方法访问不用我说了。
    2. “但 2.0 规定必须是 over TLS ”,我也查到了, 引自 wiki: HTTP/2 的设计本身允许非加密的 HTTP 协议,也允许使用 TLS 1.2 或更新版本协议进行加密。[20]协议本身未要求必须使用加密,[21] 惟多数客户端 (例如 Firefox,[22] Chrome, Safari, Opera, IE, Edge) 的开发者声明,他们只会实现通过 TLS 加密的 HTTP/2 协议,这使得经 TLS 加密的 HTTP/2(即 h2)成为了事实上的强制标准,而 h2c 事实上被主流浏览器废弃
    ---- 所以服务器版本是 HTTP/2 (在实现上大概率就不支持非加密方式了),你用非加密方式来访问就出错了
    lxk11153
        15
    lxk11153  
    OP
       2020-08-01 21:16:40 +08:00
    append #14 ( 4. 至于 url 里的 http:// https://是另一种标识,指访问这个 url 是走加密方式还是不加密方式
    mind3x
        16
    mind3x  
       2020-08-01 21:19:47 +08:00 via Android
    @lxk11153 我还是要重复,http 1.0/1.1 与是否 HTTPS 没有关系...在 HTTPS 里跑的可以是 1.0 也可以是 1.1 。说白了 1.1 主要的区别只是可以重用连接,所以你看到的客户端大多默认发 1.1 请求。你用 curl 是可以指定发 1.0 请求的。
    lxk11153
        17
    lxk11153  
    OP
       2020-08-01 22:37:42 +08:00
    @mind3x #16 好吧,我完全理解错了。详见:

    curl -q -vs --http1.0 'ht 蟹将 tp://httpbin.or 虾兵 g/get'
    curl -q -vs --http1.1 'ht 蟹将 tp://httpbin.or 虾兵 g/get'
    curl -q -vs --http2 'ht 蟹将 tp://httpbin.or 虾兵 g/get'

    curl -q -vs --http1.0 'ht 蟹将 tps://httpbin.or 虾兵 g/get'
    curl -q -vs --http1.1 'ht 蟹将 tps://httpbin.or 虾兵 g/get'
    curl -q -vs --http2 'ht 蟹将 tps://httpbin.or 虾兵 g/get'
    aladdinding
        18
    aladdinding  
       2021-08-20 11:30:07 +08:00
    从协议的角度来说 http 快点,连接 socks 连接至少有两次协议交互
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1596 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 588ms · UTC 17:00 · PVG 01:00 · LAX 09:00 · JFK 12:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.