V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sunny1688
V2EX  ›  程序员

TLS 是如何确定这个数据包是一个完整的包

  •  
  •   sunny1688 · 2022-02-26 15:11:17 +08:00 · 2193 次点击
    这是一个创建于 761 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在没使用 tls 的时候,假设规定一个数据包由(包头( 4 字节)+包体)组成,这样就很好获取一个完整的包,那我的疑问就是使用 tls 后,数据经过加密了,因此数据包大小也会发生改变,之前的那套规则就行不通了,那在接收数据的时候,怎么才能知道接收到的是一个完整的加密数据包?

    14 条回复    2022-02-27 11:40:40 +08:00
    neoblackcap
        1
    neoblackcap  
       2022-02-26 15:17:16 +08:00
    流加密,加密前后信息长度是一样的。
    GGPlayer
        2
    GGPlayer  
       2022-02-26 15:18:58 +08:00
    只需要加密包体即可
    0o0O0o0O0o
        3
    0o0O0o0O0o  
       2022-02-26 15:22:48 +08:00   ❤️ 6
    sunny1688
        4
    sunny1688  
    OP
       2022-02-26 15:23:16 +08:00
    @neoblackcap 这个还没注意,我试下
    Biwood
        5
    Biwood  
       2022-02-26 15:25:18 +08:00
    数据完整性校验恐怕不是 TLS 来干的事情,而是 TCP 协议做的事情,一个应用层,一个传输层,TLS 协议建立在 TCP 协议之上,TCP 连接成功了,TLS 数据就没问题。有问题的话那也是证书验证不通过,密钥被篡改之类的问题,而不是丢包问题。
    rrfeng
        6
    rrfeng  
       2022-02-26 15:42:40 +08:00 via Android
    首先 TCP 是流没有包
    其次 TLS 是对数据流加密,头部不变。
    sunny1688
        7
    sunny1688  
    OP
       2022-02-26 15:44:46 +08:00
    @neoblackcap 加密前 18 字节,加密后 40 字节,不理解您说的长度不变是什么意思
    feather12315
        8
    feather12315  
       2022-02-26 15:54:18 +08:00 via Android
    多一比特跟少一比特解密后的数据不一样,这个是雪崩效应。

    换个角度想:block 类型的加密不需要关注包大小,解密后的数据包大小是固定的,协议自己验证相关的数据对不对。
    jinliming2
        9
    jinliming2  
       2022-02-26 16:12:16 +08:00   ❤️ 4
    你原始的 TCP 直接传裸数据时,自己可以定义包头+包体的结构。
    但是中间加了一层 TLS 之后,你自己定义的结构对于 TLS 来说都没有意义了,都看作一堆无意义的二进制流。
    然后 TLS 会自己对这一堆二进制数据流进行包装,包装成一个一个的 Application Data 帧,每个 Application Data 帧里可能包含了一个你的自定义包头+包体结构,也可能包含了两个,也可能包含了半个,具体包含多少是 TLS 层面决定的(单个帧最大 16K ,通常根据实际情况动态调整。单帧大了,可能会受 MTU 、MSS 限制而在 TCP 层面再拆分;单帧小了,则会浪费帧头的传输)。
    Application Data 帧的结构与你的包头+包体结构类似:1 字节的帧类型( 0x17 Application Data ),2 字节的 TLS 协议版本号,2 字节的数据长度,然后后面跟加密初始化向量和加密后的帧数据。(注:这里的数据长度是指后面初始化向量和**加密后**的数据的总长度,与加密前的数据多长无关)
    Rieouu
        10
    Rieouu  
       2022-02-26 16:12:54 +08:00
    包是应用层协议考虑的
    sunny1688
        11
    sunny1688  
    OP
       2022-02-26 16:22:27 +08:00
    @jinliming2 非常感谢,让我一下就明白了
    keepMyselfClam
        12
    keepMyselfClam  
       2022-02-26 22:17:20 +08:00
    之前是直接将数据放在 tcp 上传输的. 那么加上了 TLS 层之后不应该去关心或者直接处理 tls 加密后的数据.
    而应该使用 tls 解密以后的数据. 这样 TLS 层对上面是透明的,数据内容也不会变,就不会影响之前的逻辑.
    sunny1688
        13
    sunny1688  
    OP
       2022-02-27 10:42:14 +08:00
    @keepMyselfClam 是的,我有点搞混了
    ysc3839
        14
    ysc3839  
       2022-02-27 11:40:40 +08:00 via Android
    @Biwood TLS 是要保证数据完整性的,TCP 反而不需要保证。虽然 TCP 头有校验码,但是大多数网络设备都会忽略不管的。早年间 http 下载文件可能会损坏就是一个例子。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5652 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 01:43 · PVG 09:43 · LAX 18:43 · JFK 21:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.