TCP 为啥是可靠的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
phpIsNumberOne
V2EX    问与答

TCP 为啥是可靠的?

  •  
  •   phpIsNumberOne 2021-02-02 10:31:50 +08:00 3198 次点击
    这是一个创建于 1731 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我说的可靠是指差错、如比特翻转的,而不是不可达之类的。 1.TCP 包校验和只用 16 个比特,我们一般的摘要都要 128 以上来保证可靠,所以 TCP 包是否也会出现差错,不是那么的可靠? 2.如果一问是肯定的,那么基于 TCP 的、比如 HTTP 有额外做校验吗?

    21 条回复    2021-02-04 11:33:25 +08:00
    phpIsNumberOne
        1
    phpIsNumberOne  
    OP
       2021-02-02 10:32:22 +08:00
    我说的可靠是指差错、如比特翻转的,而不是不可达之类的。
    1.TCP 包校验和只用 16 个比特,我们一般的摘要都要 128 以上来保证可靠,所以 TCP 包是否也会出现差错,不是那么的可靠?
    2.如果一问是肯定的,那么基于 TCP 的、比如 HTTP 有额外做校验吗?
    phpIsNumberOne
        2
    phpIsNumberOne  
    OP
       2021-02-02 10:33:21 +08:00
    要是一问是肯定的,那 TCP 可靠这种说法未免也太误导人了
    zhs227
        3
    zhs227  
       2021-02-02 10:34:57 +08:00
    1. 校验只判断对错
    2. 从 TCP 往下层还有链路层纠错
    3. 错了的直接重传了
    Jooooooooo
        4
    Jooooooooo  
       2021-02-02 10:36:16 +08:00
    checksum 错了重传

    不过像目前每层都有校验的情况下, 某些校验可能是多余的
    keepeye
        5
    keepeye  
       2021-02-02 10:38:44 +08:00
    网络层校验只是简单的吧,而且也不能排除被拦截修改啥的。设计协议的时候也要加个应用层校验
    wanguorui123
        6
    wanguorui123  
       2021-02-02 10:39:07 +08:00   1
    araaaa
        7
    araaaa  
       2021-02-02 10:43:35 +08:00 via iPhone
    会重传
    zuiluo
        8
    zuiluo  
       2021-02-02 11:05:48 +08:00
    从传输数据的角度来看,一系列的差错检测(例如 RCR 校验),确认,重传,超时重发,序列号 足以应对(也只能应对)数据传输不会因为各种网络波动,随机 /冲击噪声导致数据发生丢失或错误。

    但不能保证你的数据一定是正确的,从安全方案的角度来看,你还需要进行签名,摘要,授权,加密 /...,才能保证数据传输不会被监听 /篡改 /替换
    love
        9
    love  
       2021-02-02 11:12:17 +08:00
    你要这么说当然是有可能出错的,但一个包就上 128 以上也太浪费了。
    上层协议应该也能防这种情况,比如 https 加密流错一个字节应该就不行了吧
    Microkernel
        10
    Microkernel  
       2021-02-02 11:14:55 +08:00
    会出现,都是概率问题。明文 HTTP 没有额外校验了,HTTPS 的话 TLS 有
    phpIsNumberOne
        11
    phpIsNumberOne  
    OP
       2021-02-02 11:17:22 +08:00
    @zhs227
    @Jooooooooo
    会有出错但校验不出来的情况
    walsh
        12
    walsh  
       2021-02-02 11:20:39 +08:00   1
    世界上没有信噪比无穷大的信道,也就没有完全可靠的协议,只有 99.99%可靠的协议,时间足够长不管多小的可能性发生概率都接近无穷大,也就是墨 菲 定 律,设计目标就是把这个发生概率的时间延长到超过宇宙重启的时间。
    learningman
        13
    learningman  
       2021-02-02 11:26:33 +08:00 via Android
    建议阅读自顶向下,IP 包也有 checksum,底层的电流啥的都有纠错的
    zhs227
        14
    /div> zhs227  
       2021-02-02 11:29:31 +08:00
    @phpIsNumberOne 如果这个错误对你的影响是 Critical 级别的,那应该由应用层校验。

    任何事情都有例外。md5 也有碰撞。sha1,sha256 这些,任何哈希算法,只要是校验长度小于原文长度,因为不具备完整信息,都是有可能出错的,最终反映在数学上都是一个多对一的映射。校验长度大于或等于原文长度又没有太大的实用价值。

    一般来说我们做了 md5,而且 md5 也对了,就认为是没有问题的。有些下载网站提供多种哈希供校验,也是如此。

    如果链路层,TCP 层的内容都错了, 但是两层的 CRC 又同时都是能通过的,这个概率在可靠性要求不高的场合可以忽略不计。
    lysS
        15
    lysS  
       2021-02-02 11:37:57 +08:00
    1.是,TCP 的校验和可信度较低,校验出错会重传,出错但是没有校验出来的情况在当前网络环境概率极低,属于可接受范围。这种可能出现情况极低一方面是由于校验设计合理,另一方面也是由更底层的提供,比如像扩频通信技术,可以是在信噪比远小于 1 的情况提供可用的信道

    2.HTTP 没有,HTTPS 有

    所有都是概率的问题,在应用层面算概率,在物理层面上算信噪比;都没有绝对可靠的;除了数学。
    enihcam
        16
    enihcam  
       2021-02-02 11:45:07 +08:00 via Android   1
    都不在一层,各司其职。
    xumng123
        17
    xumng123  
       2021-02-02 11:47:04 +08:00 via iPhone
    问度娘 jike
    zhangsanfeng2012
        18
    zhangsanfeng2012  
       2021-02-02 17:21:59 +08:00
    TCP 的可靠是指接收端会通知发送端,它收没收到包
    ryd994
        19
    ryd994  
       2021-02-03 06:12:41 +08:00 via Android
    1. 防随机传输错误,不防恶意伪造。随机错误能刚好把 CRC 翻回来,概率很小
    摘要要 128 位以上是为了防恶意伪造或者碰撞攻击
    2. HTTP 没有。其他协议按需要可能有。

    最重要的是 CRC 在硬件里实现非常简单。所以这是一种高性能低成本的办法。如果你需要 /愿意付出更多性能成本,你可以在上层实现更复杂的加密 /校验。比如 TLS
    ExplorerLog
        20
    ExplorerLog  
       2021-02-03 10:48:59 +08:00
    首先更低级的以太网帧就有 32bit 的 CRC 校验
    julyclyde
        21
    julyclyde &bsp;
       2021-02-04 11:33:25 +08:00
    tcp 可靠是针对丢包情况来说的
    有重传机制
    甚至能做到“死要见尸”,能明确引起高层 API 出错
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2670 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:09 PVG 23:09 LAX 08:09 JFK 11:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86