比如客户端和服务端之间先建立了一个 tcp 连接,然后进行 ssl 握手然后传输加密 data
后续我想重用这个 tcp 连接,是不是只能传输之前已经协商好的加密信息加密的 data 了?
传输别的协议的数据可以吗?比如直接传输 http 的明文报文
正在做连接池。。https 的搞不定了
1
aladdinding OP 有没有网络大佬
|
2
aladdinding OP 好吧 在写一个代理软件 想复用代理服务器和目标网站之间的的 tcp 连接
用户先发了一个 https 请求 ,通过 connect 代理服务器和目标网站建立了连接 用户收到响应后关闭这个连接,还能在复用上一个代理和目标网站之间的连接吗 是不是要有 ssl session 才行 |
3
sujin190 2022-09-09 16:46:01 +08:00 via Android
如果服务端不能修改的话不能,否则不就是代理么,服务端自己解析不同数据包分别处理
|
4
sujin190 2022-09-09 16:48:24 +08:00 via Android
但是如果你是想复用 tsl 连接,那么显然可以啊,tls 连接本来和你传输的数据无关,如果你是想复用这个 tcp 连接再重新建立一个 tls 或者传输其他协议的数据,不修改服务端的情况下肯定不能了
|
5
aladdinding OP @sujin190 了解了 由于是客户端通过 connect 方法直接和目标服务器握手,代理肯定就改不了
|
6
sujin190 2022-09-09 16:57:46 +08:00
不过话说你不是做的是 https 连接池么,那么不就是要被后续请求继续使用么,那么只要保证后续请求都是同一个域名的,这个本来就没问题的吧,几乎 http 服务端都是支持的吧,并不需要额外实现
|
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.html 和 https://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 连接也是允许的,这复用了个寂寞 |
8
changnet 2022-09-09 17:16:56 +08:00
@changnet 我写的时候,还没看到你要写的是代理。我没写过代理,按我的理解,是客户和代理服务器发起了一个连接,然后代理服务器解析收到的数据,再根据数据和目标网站发起一个连接,取回数据,再转发给客户,然后客户断开了连接。
现在代理服务器和目标网站还在保持链接???这时再有另一个客户请求同样的目标网站,所以代理服务器想复用这条存在的链接?如果链接还存在,当然是可以复用的。问题是 cookie 这些怎么搞,对目标网站来说同一个连接就是同一个客户,而且网站通信完一般都会断掉连接,没有复用的意义吧 |
9
Noicdi 2022-09-09 17:17:16 +08:00
没有工程开发的经验,一点拙见。
Linux 提供的 socket 保障 TCP 链接,发送的数据流应该是应用层来做处理吧。比如 #7 所言,C 语言确立了 socket 链接后,通过应用层进行 ssl/tls 加密,然后传输的都是加密数据了。 应用层应该是可以自己控制是不是加密的,TCP 链接复用以后查 HTTP 请求行的版本信息,是 HTTP 就直接明文解析,是 HTTPS 就调用密钥和解密算法处理。 『传输别的协议的数据可以吗?比如直接传输 http 的明文报文』 反正 TCP 链接传递的都是数据流,归根结底就是看应用层怎么用接收的数据了,应该是这样吧 |
10
aladdinding OP @changnet 如果用户使用的 http 客户端能连接复用的话当然好了 ,一个连接传输多个请求,但是大部分的用户访问 https 依旧是 拿到响应就关闭(导致代理服务器和目标网站连接也要关闭)
如果 ssl 建立之后能解除当然是好的 下来研究研究 |