一、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

  1. 内核TCP把这条SQL切成分段,每一段单独计算TCP校验和,放到TCP头部;
  2. IP包通过网络传输。如果电磁干扰导致某个字节翻转;
  3. MySQL服务器操作系统收到这个分段,重新计算校验和,比对发现不一致,直接丢弃这个包;
  4. 客户端长时间收不到ACK,触发超时重传,重新发送这一段。整个过程PHP代码无感知。

如果你在PHP代码里写md5($sql),那是另外一回事:这是业务层面,对整条SQL生成指纹,不是网络传输用的。

一句话浓缩

TCP校验和是操作系统内核给每一小段网络数据快速算的简易校验码,用来检测网线传输的随机比特损坏;PHP md5()是应用层的密码学摘要,针对完整数据生成指纹,用于业务层面校验文件/内容完整性,算法、运行位置、粒度、安全目标完全不一样。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐