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

2022-09-09 16:30:07 +08:00
 aladdinding

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

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

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

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

1139 次点击
所在节点    问与答
10 条回复
aladdinding
2022-09-09 16:30:44 +08:00
有没有网络大佬
aladdinding
2022-09-09 16:40:11 +08:00
好吧 在写一个代理软件 想复用代理服务器和目标网站之间的的 tcp 连接

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

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

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

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

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

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

如果 ssl 建立之后能解除当然是好的 下来研究研究

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/878940

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX