技术解析

关于 websocket 协议,使用 cdn 加速的情况有问。
0
2021-06-18 22:51:15
idczone

背景:使用 C++实现的消息传输的客户端、服务端软件

了解到 cloudflare 的 cdn 可以加速 websocket. [暂且不讨论有没有加不加“速”效果的问题]

我写的客户端和服务端是基于 websocket 协议的 [直接连接可用] ,如果使用 cdn 加速的话,我应该是在客户端当中把 cdn 的地址作为服务端地址吧?

大体在客户端的实现步骤应该是: 1.解析域名得到 cdn 的 ip 地址,2.再通过 socket 连接 cdn 地址吧,3.然后发送 websocket 连接协议。 [此流程是我实际实现过程,不知道是否有误]

可是在第 2 步,使用 socket 连接 cdn 地址的时候,报错: Resource temporarily unavailable

补充:当时我就比较郁闷了,毕竟客户端、服务端是我自己写的,是不是我写的并不是非标准的 websocket 协议,才没法连接上,可是我都还没发送 websocket 协议请求头,在第 2 步就报错了。

疑问:

1.通过 socket 连接 cdn 地址为何报错 [尝试 ping cdn 地址,能够正常 ping 通]

2.如果我通过 socket 连接 cdn 地址之后,之后发送的内容并不是标准,或者不遵循 websocket 协议,会被扔掉吗?


关于第一个问题,你可以试试用 curl 测试一下(别告诉我这玩意没实现 HTTP 服务器功能,直接裸 websocket
然后除此之外,连接上还得注意以下问题:在 cloudflare 后台把 websocket 功能打开( network 那个选项卡找一下
其次:发送升级请求的时候带上 Host 和 UA(或者去 cf 后台设置下防火墙等级,以及具体 UA 也可以在那里设置下白名单)
Host 的必须的,不然 CF 不知道到底是哪个用户的网站,也没法请求了(

感谢,直接裸 websocket 的,没有实现 http 服务器,其次,我在 socket 连接阶段都还没得成功,更不同说发送 host 之后的内容了。

要看看是 connect 失败还是在 send 以后出问题了
而且也有可能是 CF 配置的有问题

感谢,是 connect 失败,好像是端口只能是 80,我再仔细排查一下。



已经解决,由于自己使用的端口不是 80 导致的;
cloudflare 可以转发 websocket 协议的内容,不管是不是 websocket 协议,貌似只能使用 80 端口(不知道是否为免费版的缘故)

ref: https://support.cloudflare.com/hc/zh-cn/articles/200169156-%E8%AF%86%E5%88%AB%E4%B8%8E-Cloudflare-%E7%9A%84%E4%BB%A3%E7%90%86%E5%85%BC%E5%AE%B9%E7%9A%84%E7%BD%91%E7%BB%9C%E7%AB%AF%E5%8F%A3

前段时间我也这样,感谢楼主排雷

感谢,改正一下:
Cloudflare 支持的 HTTP 端口:
80
8080
8880
2052
2082
2086
2095
Cloudflare 支持的 HTTPS 端口:
443
2053
2083
2087
2096
8443
websocket 端口自测

并非所有节点 IP 地址均开放了上述端口,自测

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服