首页 > 解决方案 > 通过 SSL 发送整数而不是字符串以节省带宽是个好主意吗?

问题描述

我正在创建一个具有客户端-服务器设计的应用程序。客户端和服务器通过 WebSocket 以二进制消息(CBOR 数组)的形式发送数据,从而相互通信。我没有发送字符串,而是创建了一个用整数映射的字典,如下所示:

const DICT: &[&str] = &[
    "USERNAME_NOT_AVAILABLE",
    "USERNAME_AND_PASSWORD_DID_NOT_MATCHED",
    ....blablba long list ....
];

// genrates code like this:-
// pub const USERNAME_AND_PASSWORD_DID_NOT_MATCHED : u16 = 4;
fn gen_rust(version: &String) -> String {
    let mut code = format!(
        "//generated code from Examer server version {}\n\n",
        version
    );
    for (index, element) in DICT.iter().enumerate() {
        code.push_str(&format!("pub const {} : u16 = {};\n", element, index))
    }
    code
} 

然后在客户端和服务器之间共享生成的字典,我发送整数而不是字符串。

如果我经常犯拼写错误,这种方法确实提供了诸如自动完成和编译时错误之类的好处,但这是否会在使用 SSL 加密时减少消息的大小?我听说如果消息太小,则添加填充,因此我减小消息大小的主要目标将无法实现。

标签: encryptionsslwebsocket

解决方案


现代 TLS 密码套件(这是 TLS 1.3 中唯一可用的,也是 HTTP/2 唯一允许的)不使用填充。这是因为 AES-GCM 和 ChaCha20-Poly1305 是基于 CTR,而不是 CBC。

请注意,(过时的)CBC 密码套件中的填充为每条消息最多 16 个字节,通常被认为是微不足道的。

请注意,websocket 的框架以及 TLS 记录和 MAC 的框架都是您无法删除的带宽开销。您不能只发送原始 CBOR 值,并使用某种长度保持加密进行加密。

您应该使用wireshark 来观察应用程序发送消息时实际发送了多少数据。


推荐阅读