TCP的“校验和“是做什么的?它和PHP的md5()有什么区别?
·
一、TCP校验和是什么,干什么?
TCP校验和,是放在TCP头部里的一段简短校验码。
拼图比喻:你寄出每一块拼图碎片(TCP分段),在碎片背面快速写一个简易的校验验证码。
收件人拿到这块碎片,按同样的算法重新算一遍验证码,对比是否一致。
如果不一致:说明这块碎片在运输途中,上面的图案(字节)发生损坏(比特翻转,0变1、1变0),直接丢弃这个分段,等待发送方超时重传。
核心作用
检测传输过程中,TCP分段的数据(TCP头 + TCP载荷)有没有发生比特错误。
网线、网卡、电磁干扰,有可能导致个别字节在传输途中出错。校验和用来发现这类损坏。
- 校验和校验范围:TCP头部 + TCP携带的业务数据(比如PHP发出的SQL字符串)
- 计算在发送端内核TCP模块完成;接收端内核TCP模块做校验
- 校验失败 → 直接丢弃该分段,不会给应用层(MySQL/PHP)通知;依靠后续超时重传机制补发。
注意:TCP校验和只是差错检测,不能修复错误,坏包只能丢掉重传。
二、PHP md5() 是什么
md5是密码学哈希摘要算法。
给一段原始数据,算出一个固定128bit(32位十六进制字符串)的指纹。
md5("SELECT name FROM user WHERE id=1");
用途:对完整业务数据,生成唯一指纹,用来做完整性校验、比对文件。
三、核心区别(5个维度,面试重点)
1. 运行位置不同
- TCP校验和:操作系统内核的TCP协议栈自动计算。PHP代码完全感知不到,不需要程序员写任何代码。每一个TCP分段都会单独算校验和。
- md5():PHP应用层函数,在用户代码里手动调用。是你业务代码主动执行。
2. 计算粒度不同
- TCP校验和:按每一个TCP分段单独计算。一大段SQL被TCP切成多个拼图碎片,每一块碎片单独算自己的校验和。只负责这一小段。
- md5:针对完整的原始字符串整体计算。必须拿到全部完整数据,一次性算出整个文本的指纹。你不能单独对一小块碎片算md5,然后简单拼接得到整体md5。
3. 算法设计目标不一样
- TCP校验和:轻量、快速。是简单的16位累加求反。硬件网卡就能直接计算,几乎不耗性能。
缺点:检错能力有限,存在碰撞概率(两段不同数据算出同样校验和),不用于防人为篡改,只抓线路随机比特错误。 - md5:密码学哈希,设计目标是尽量保证不同数据摘要不同。理论上可以用来校验文件有没有被人为修改。
缺点:计算开销更大;md5已经被破解,不能用于安全签名,仅适合简单文件完整性比对。
4. 作用场景不一样
- TCP校验和:网络链路传输层,对付线路随机损坏。只管数据包在路上传输时意外损坏。不防人为恶意修改。如果中间人刻意修改数据包,同步修改TCP校验和,TCP校验和无法发现。
- md5:业务层。比如PHP上传文件后,服务端计算md5,和客户端传来的md5比对,确认整个文件有没有改动。
5. 出错之后的处理逻辑不同
- TCP校验和出错:内核直接丢弃包,依靠TCP的ACK、超时重传自动补发,PHP完全不知道这件事。
- md5校验失败:是你的PHP业务代码判断,由你自己写代码决定怎么处理(抛出异常、重试、报错返回给用户),操作系统不会自动处理。
四、结合PHP连MySQL例子串起来
PHP发送SQL语句:SELECT name FROM user WHERE id=1
- 内核TCP把这条SQL切成分段,每一段单独计算TCP校验和,放到TCP头部;
- IP包通过网络传输。如果电磁干扰导致某个字节翻转;
- MySQL服务器操作系统收到这个分段,重新计算校验和,比对发现不一致,直接丢弃这个包;
- 客户端长时间收不到ACK,触发超时重传,重新发送这一段。整个过程PHP代码无感知。
如果你在PHP代码里写md5($sql),那是另外一回事:这是业务层面,对整条SQL生成指纹,不是网络传输用的。
一句话浓缩
TCP校验和是操作系统内核给每一小段网络数据快速算的简易校验码,用来检测网线传输的随机比特损坏;PHP md5()是应用层的密码学摘要,针对完整数据生成指纹,用于业务层面校验文件/内容完整性,算法、运行位置、粒度、安全目标完全不一样。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)