V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
aladdinding
V2EX  ›  问与答

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

  •  
  •   aladdinding · 2022-09-09 16:30:07 +08:00 · 1040 次点击
    这是一个创建于 618 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    是不是要有 ssl session 才行
    sujin190
        3
    sujin190  
       2022-09-09 16:46:01 +08:00 via Android
    如果服务端不能修改的话不能,否则不就是代理么,服务端自己解析不同数据包分别处理
    sujin190
        4
    sujin190  
       2022-09-09 16:48:24 +08:00 via Android
    但是如果你是想复用 tsl 连接,那么显然可以啊,tls 连接本来和你传输的数据无关,如果你是想复用这个 tcp 连接再重新建立一个 tls 或者传输其他协议的数据,不修改服务端的情况下肯定不能了
    aladdinding
        5
    aladdinding  
    OP
       2022-09-09 16:53:08 +08:00
    @sujin190 了解了 由于是客户端通过 connect 方法直接和目标服务器握手,代理肯定就改不了
    sujin190
        6
    sujin190  
       2022-09-09 16:57:46 +08:00
    不过话说你不是做的是 https 连接池么,那么不就是要被后续请求继续使用么,那么只要保证后续请求都是同一个域名的,这个本来就没问题的吧,几乎 http 服务端都是支持的吧,并不需要额外实现
    changnet
        7
    changnet  
       2022-09-09 17:03:40 +08:00
    从 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  
       2022-09-09 17:16:56 +08:00
    @changnet 我写的时候,还没看到你要写的是代理。我没写过代理,按我的理解,是客户和代理服务器发起了一个连接,然后代理服务器解析收到的数据,再根据数据和目标网站发起一个连接,取回数据,再转发给客户,然后客户断开了连接。

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

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

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

    如果 ssl 建立之后能解除当然是好的 下来研究研究
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:29 · PVG 22:29 · LAX 07:29 · JFK 10:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.