aladdinding
V2EX  ›  问与答

一个已经建立过 ssl/tls 的 tcp 连接能重用吗?

  •  
  •   aladdinding · Sep 9, 2022 · 1683 views
    This topic created in 1431 days ago, the information mentioned may be changed or developed.

    比如客户端和服务端之间先建立了一个 tcp 连接,然后进行 ssl 握手然后传输加密 data

    后续我想重用这个 tcp 连接,是不是只能传输之前已经协商好的加密信息加密的 data 了?

    传输别的协议的数据可以吗?比如直接传输 http 的明文报文

    正在做连接池。。https 的搞不定了

    10 replies    2022-09-09 17:30:53 +08:00
    aladdinding
        1
    aladdinding  
    OP
       Sep 9, 2022
    有没有网络大佬
    aladdinding
        2
    aladdinding  
    OP
       Sep 9, 2022
    好吧 在写一个代理软件 想复用代理服务器和目标网站之间的的 tcp 连接

    用户先发了一个 https 请求 ,通过 connect 代理服务器和目标网站建立了连接

    用户收到响应后关闭这个连接,还能在复用上一个代理和目标网站之间的连接吗

    是不是要有 ssl session 才行
    sujin190
        3
    sujin190  
       Sep 9, 2022 via Android
    如果服务端不能修改的话不能,否则不就是代理么,服务端自己解析不同数据包分别处理
    sujin190
        4
    sujin190  
       Sep 9, 2022 via Android
    但是如果你是想复用 tsl 连接,那么显然可以啊,tls 连接本来和你传输的数据无关,如果你是想复用这个 tcp 连接再重新建立一个 tls 或者传输其他协议的数据,不修改服务端的情况下肯定不能了
    aladdinding
        5
    aladdinding  
    OP
       Sep 9, 2022
    @sujin190 了解了 由于是客户端通过 connect 方法直接和目标服务器握手,代理肯定就改不了
    sujin190
        6
    sujin190  
       Sep 9, 2022
    不过话说你不是做的是 https 连接池么,那么不就是要被后续请求继续使用么,那么只要保证后续请求都是同一个域名的,这个本来就没问题的吧,几乎 http 服务端都是支持的吧,并不需要额外实现
    changnet
        7
    changnet  
       Sep 9, 2022
    从 c 语言的角度讲

    https 是在 tcp 的基础上加了一层 ssl 。从标准上看,ssl 一旦建立,就只能通过 ssl 层加密传输(调用 ssl_write 等函数)。如果不考虑标准,直接调用 write 这种函数,也能把 http 明文发过去,但是对方要知道怎么区分加密、非加密数据,并采取不同的处理方式

    ssl 建立之后,是可以解除的,参考: https://www.openssl.org/docs/man3.0/man3/SSL_shutdown.htmlhttps://www.ibm.com/docs/en/ztpf/1.1.0.14?topic=functions-ssl-shutdown 里 “If the connection is being used for additional communications” 等相关内容。ssl 解除后,这个连接就变成了一个普通的 tcp 连接,可以继续通信。

    当然,同一个连接不关闭的话,可以反复建立、解除多次 ssl

    但问题是做连接池真需要搞这么复杂么?如果一个连接没有断开,直接保持长连接持续通信即可。如果断开了,那就走新连接即可,这个资源是系统内核控制的,又不由应用控制。

    这样反复建立、解除 ssl ,双方同步状态都麻烦,而且如果对方是走标准的话,ssl 关闭后直接关掉 tcp 连接也是允许的,这复用了个寂寞
    changnet
        8
    changnet  
       Sep 9, 2022
    @changnet 我写的时候,还没看到你要写的是代理。我没写过代理,按我的理解,是客户和代理服务器发起了一个连接,然后代理服务器解析收到的数据,再根据数据和目标网站发起一个连接,取回数据,再转发给客户,然后客户断开了连接。

    现在代理服务器和目标网站还在保持链接???这时再有另一个客户请求同样的目标网站,所以代理服务器想复用这条存在的链接?如果链接还存在,当然是可以复用的。问题是 cookie 这些怎么搞,对目标网站来说同一个连接就是同一个客户,而且网站通信完一般都会断掉连接,没有复用的意义吧
    Noicdi
        9
    Noicdi  
       Sep 9, 2022
    没有工程开发的经验,一点拙见。

    Linux 提供的 socket 保障 TCP 链接,发送的数据流应该是应用层来做处理吧。比如 #7 所言,C 语言确立了 socket 链接后,通过应用层进行 ssl/tls 加密,然后传输的都是加密数据了。
    应用层应该是可以自己控制是不是加密的,TCP 链接复用以后查 HTTP 请求行的版本信息,是 HTTP 就直接明文解析,是 HTTPS 就调用密钥和解密算法处理。

    『传输别的协议的数据可以吗?比如直接传输 http 的明文报文』
    反正 TCP 链接传递的都是数据流,归根结底就是看应用层怎么用接收的数据了,应该是这样吧
    aladdinding
        10
    aladdinding  
    OP
       Sep 9, 2022
    @changnet 如果用户使用的 http 客户端能连接复用的话当然好了 ,一个连接传输多个请求,但是大部分的用户访问 https 依旧是 拿到响应就关闭(导致代理服务器和目标网站连接也要关闭)

    如果 ssl 建立之后能解除当然是好的 下来研究研究
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   997 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:31 · PVG 06:31 · LAX 15:31 · JFK 18:31
    ♥ Do have faith in what you're doing.