IP层只管把数据包尽力送到目标机器不保证送达、不乱序、不丢包可靠的所有保障确认、重传、排序、去重全部是TCP在操作系统内核里实现的。PHP写MySQL查询就是典型跑在TCPIP之上。沿用前面写信比喻IP邮局只管尽力送信封丢了、顺序乱邮局不管TCP信纸里的页码回执约定负责兜底保障。场景PHP执行一条MySQL查询?php$pdonewPDO(mysql:host192.168.1.100;dbnametest,user,pass);$stmt$pdo-query(SELECT name FROM user WHERE id1);var_dump($stmt-fetch());PHP本身不直接操作IP、TCP报文。PHP调用PDO → PDO调用操作系统socket接口 →操作系统内核的TCP模块 IP模块完成网络传输。整个请求拆解区分IP做什么、TCP做什么PHP把SQL字符串交给操作系统Socket请求发给MySQL服务器192.168.1.100:3306TCP层内核先和MySQL的3306端口完成三次握手建立连接把SQL数据切成分段给每一段加上TCP头部序列号、源端口、目标端口、校验和交给下层IPIP层内核IP给TCP数据加上IP头部源IP、目标IP组装成IP数据包。IP的工作仅此而已查找路由把包扔到网络上尽力转发。IP完全不知道里面装的是SQL查询分不清这是第几段数据发送出去之后IP就不再管这个包了。为什么IP不可靠4种故障IP全部视而不见数据包丢失网络拥堵路由器直接丢弃这个IP包。邮局把信封弄丢了邮局不会通知寄件人。IP没有重试机制。数据包乱序IP包可以走不同路由。比如SQL被拆成包A、包BB先到达MySQL服务器A晚到。IP不排序。数据包重复网络链路异常同一个IP包被重复投递两次。IP不会识别重复。数据损坏传输中比特出错。IP只做简单校验校验失败直接丢弃不会通知发送方重发。IP的设计哲学尽力交付best-effort它不保存任何发送记录没有回执不知道对方收没收到包。IP只关心「主机到主机」的投递。TCP如何在IP之上实现可靠同样4种故障TCP全部处理IP只是底层运输TCP在内核盯着每一段数据序列号每个TCP分段带序号。包B先到MySQLTCP会先缓存等包A抵达再按顺序拼接完整SQL再交给MySQL程序。ACK确认回执MySQL收到TCP分段立刻回一个ACK包告诉客户端TCP“我收到到第N号字节了”。超时重传客户端TCP发送分段后等待ACK。超时没收到回执 → 自动重新发送这段SQL数据。PHP代码完全感知不到丢包和重传内核悄悄处理。去重如果重复的包到达TCP依靠序列号识别丢弃重复副本不会把同一条SQL重复发给MySQL。校验和TCP检测数据损坏损坏的包直接丢弃等待重传。当MySQL执行完SQL返回结果集同样走这套反向流程MySQL端TCP分段IP负责投递客户端TCP重组完整结果再交给PDOPHP拿到数组。通信结束TCP四次挥手断开连接。关键边界非常容易踩坑后端面试高频✅ TCP的可靠只保证数据完整、有序交付到目标机器操作系统的TCP缓冲区❌TCP不保证MySQL服务一定读取这条数据举个极端例子数据包成功送到MySQL服务器内核TCP缓冲区TCP回执已经发回给PHP客户端但MySQL进程瞬间崩溃。此时TCP层面已经确认送达成功但是MySQL程序还没来得及读取、执行SQL。TCP可靠 内核之间字节流可靠交付不等于应用业务层面一定执行成功。业务层面的事务、重试需要PHPMySQL自己来做。一句话浓缩这个PHP查询例子IP负责把承载SQL的数据包送到MySQL服务器这台机器路上丢包、乱序IP一概不管TCP在操作系统内核利用序列号、ACK、超时重传保证这条SQL字节流完整有序到达MySQL的TCP缓冲区PHP写业务代码完全看不到底层丢包重传的细节。