相对安全的 HTTPS 替代方案

信息安全 tls
2021-08-28 00:19:56

我正在开发一款多人游戏。我打算通过 HTTPS 交换所有数据,但它太慢了。SSL 握手的高延迟网络需要超过一秒钟的时间。虽然游戏是回合制的并且不需要超快的数据传输,但 1000-2000 毫秒的 ping 仍然是不可接受的。

我可以使用哪些协议/方法以尽可能低的延迟安全地传输数据?


编辑:只是为了回应您对有效载荷的询问,这是一个单位攻击敌方建筑物的结果(显然我没有发送一串 1 和 0,这只是一个二进制表示):

00000000 10010011 01010001 00100011 01011100 01010001 01010000

消息细分:

00000000  client's request executed with status "OK", other values correspond to specific error messages.

10        Object is owned by Player 2
010       Object is a building
0110      Object is located at x=6  (always 0<=x<=14)
101       Object is located at y=5  (always 0<=y<=6), owner and location is sufficient to describe any object uniquely
0001      1 byte-worth of modified attributes follows
0010 0011 Object's health is now 3

01        Object is owned by Player 1
011       Object is a unit
1000      Object is located at x=8
101       Object is located at y=5
0001      1 byte-worth of modified attributes follows
0101 0000 This object can no longer move/attack this turn

我认为我不能在不增加 CPU 成本的情况下获得更多的数据密度。

3个回答

HTTPS 是基于TLS 的HTTP

如果你实现一个游戏,使用 HTTP 通常不是一个好主意。HTTP 协议是为请求文档而设计的,而不是为实时游戏而设计的。更好的想法是直接基于 TCP 或 UDP 开发自己的协议(UDP 更快,而 TCP 更易于使用,但这是游戏开发 stackexchange的主题)并通过 TLS 进行隧道传输。

耗时的密钥交换过程只需要在建立连接时发生一次。当您在游戏期间保持相同的连接打开时,唯一的延迟开销是由加密和解密引起的。TLS 支持多个密码套件(使用的密码算法集)。密码套件的选择可用于在性能和安全性之间找到折衷。  

高延迟网络需要一秒钟的时间进行 SSL 握手

每次消息交换都不需要进行完整的握手。只有在 TCP 连接开始时才需要握手,因此只需保持连接打开即可。那么延迟就是任何其他已建立的 TCP 连接所具有的延迟。如果您需要以可能的数据包丢失或重复为代价的更少延迟,请使用 DTLS,即带有数据报的 TLS (UDP)。

除此之外,HTTP(s) 可能不是用于高延迟和低带宽连接的最佳协议。仅在 HTTP 请求和响应中封装有效负载会产生不小的开销(取决于有效负载的数量),如果您经常使用基于文本的有效负载(即 JSON、XML 或类似内容)只会增加更多开销。基于二进制的数据交换(如 protobuf 或类似)可以更好地利用可用资源。

如果您想要基于 TCP 的连接,请使用 TLS。提前设置连接,因此您只需支付 2 RTT 延迟,就无需再次支付。如果您想减少最初建立连接的一次性前期延迟成本,您可以使用 SPDY 扩展。

如果您想要基于 UDP 的连接,请使用DTLS这可以通过消除 TCP 的重新传输和 TCP 所做的其他可能在某些情况下引入延迟的事情来减少更多的延迟。再一次,提前设置连接,所以你支付 2 RTT 延迟一次,然后再也不需要支付它。