我记得在某处读到过,如果 udp 真正到达应用层,则数据可以假设为完整无缺。不考虑中间人发送假数据包的可能性,我在应用层收到的数据是否总是发送出去的数据?
UDP 使用 16 位可选校验和。未通过校验和测试的数据包将被丢弃。
假设一个完美的校验和,那么 65536 个损坏的数据包中有 1 个将不会被注意到。较低层也可能有校验和(或者甚至更强的方法,如 802.11 的前向纠错)。假设较低层每 n 个数据包(平均)向 IP 传递一个损坏的数据包,并且所有校验和完全不相关,那么您的应用程序每 65536*n 个数据包就会看到损坏。
示例:假设底层也使用 16 位校验和,因此每 2^16 * 2^16 = 2^32 个损坏的数据包中就有一个将通过损坏的数据包。如果 1/100 数据包损坏,则应用平均每 2^32*100 个数据包就会看到 1 次损坏。
如果我们称这个 1/(65536*n) 数为 p,那么您可以将完全看不到损坏的几率计算为 (1-p)^i,其中 i 是发送的数据包数量。在该示例中,要获得高达 0.5% 的损坏几率,您需要发送近 22 亿个数据包。
(注意:在现实世界中,损坏的可能性取决于数据包数量和大小。此外,这些校验和都不是加密安全的,攻击者破坏数据包是微不足道的。以上仅适用于随机损坏。)