当前位置:首页>Linux>当容器跨节点通信时,Linux 内核在做什么?IPIP 隧道源码深度剖析

当容器跨节点通信时,Linux 内核在做什么?IPIP 隧道源码深度剖析

  • 2026-08-20 06:41:45
当容器跨节点通信时,Linux 内核在做什么?IPIP 隧道源码深度剖析

当你的容器跨节点通信时,内核在做什么?这篇文章从内核源码角度拆解 IPIP 隧道的完整工作流程。

为什么要学这个?

排查 Calico 网络问题时,你需要理解 IPIP 封装原理;性能调优时,需要权衡 IPIP vs VXLAN 的开销差异;面试常考隧道封装原理。更重要的是,理解了 IPIP,其他隧道技术(VXLAN、GRE)也就触类旁通了。

IPIP 协议编号是 4,定义在 Linux 内核 include/uapi/linux/in.h 中:

#define IPPROTO_IPIP    4

当内核看到协议字段为 4 的数据包时,自动触发 IPIP 解封装逻辑,这个过程完全在内核态完成,不需要用户态程序干预。IPIP 的本质是 IP-in-IP 封装,在原始 IP 包外面再套一层 IP 头,外层 IP 头的源地址是隧道入口节点,目的地址是隧道出口节点。

一、tun0 设备是怎么来的?

创建 IPIP 隧道设备使用 ip tunnel 命令,底层通过 ioctl 系统调用与内核交互:

ip tunnel add tun0 mode ipip remote 172.16.2.2 local 192.168.1.1
ip link set tun0 up
ip addr add 10.0.0.1/24 dev tun0

这条命令在内核中创建了一个 tun0 设备,隧道模式是 ipip,远端地址是 172.16.2.2,本地地址是 192.168.1.1

内核源码中,隧道设备的创建入口在 net/ipv4/ip_tunnel.cip_tunnel_ioctl 函数:

static int ip_tunnel_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
{
struct ip_tunnel_parm p;

if (copy_from_user(&p, ifr->ifr_ifru.ifru_data, sizeof(p)))
return -EFAULT;

if (cmd == SIOCADDTUNNEL) {
return ip_tunnel_create(net, &p); // 创建隧道设备
}
// ...
}

ip_tunnel_create 函数分配 ip_tunnel 结构体并注册网络设备:

static struct ip_tunnel *ip_tunnel_create(struct net *net,
struct ip_tunnel_parm *p)

{
struct ip_tunnel *t;

t = kzalloc(sizeof(*t), GFP_KERNEL);
if (!t)
return ERR_PTR(-ENOMEM);

t->dev = alloc_netdev(sizeof(struct ip_tunnel),
p->name, NET_NAME_UNKNOWN,
ip_tunnel_setup);

// 设置隧道参数
t->parms.iph.saddr = p->iph.saddr; // 本地地址
t->parms.iph.daddr = p->iph.daddr; // 远端地址
t->parms.iph.protocol = IPPROTO_IPIP; // 协议号 4

register_netdev(t->dev);
return t;
}

隧道设备创建后,内核会为它分配一个 tun0 接口,这个接口看起来和普通网卡一样,但它的发送函数 ndo_start_xmit 指向 ip_tunnel_xmit,所有从 tun0 发出的包都会经过 IPIP 封装。

二、一个 IP 包的 5 步封装旅程

当数据包进入 tun0 设备时,内核调用 ip_tunnel_xmit 函数进行封装。这个函数定义在 net/ipv4/ip_tunnel.c,核心逻辑如下:

void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,
const struct ip_tunnel_encap_ops *encap_ops)

{
struct ip_tunnel *tunnel = netdev_priv(dev);
const struct iphdr *inner_iph = ip_hdr(skb);
struct iphdr *outer_iph;

// 1. 分配新的 skb,在外层预留 20 字节 IP 头空间
if (skb_cow_head(skb, LL_RESERVED_SPACE(dev) + sizeof(struct iphdr)))
goto drop;

// 2. 构造外层 IP 头
outer_iph = ip_hdr(skb);
outer_iph->version = 4;
outer_iph->ihl = 5; // 20 字节
outer_iph->tos = inner_iph->tos;
outer_iph->tot_len = htons(skb->len);
outer_iph->id = htons(tunnel_id++);
outer_iph->ttl = ip_select_ttl(inner_iph, skb); // 继承内层 TTL,保障 traceroute 正常工作
outer_iph->protocol = IPPROTO_IPIP; // 协议号 4
outer_iph->saddr = tunnel->parms.iph.saddr; // 本地地址
outer_iph->daddr = tunnel->parms.iph.daddr; // 远端地址
outer_iph->check = 0;
outer_iph->check = ip_fast_csum((unsigned char *)outer_iph, outer_iph->ihl);

// 3. 更新 skb 元数据
skb->protocol = htons(ETH_P_IP);
skb->pkt_type = PACKET_OUTGOING;
skb->dev = tunnel->dev;

// 4. 重新路由,查找下一跳
rt = ip_route_output_key(net, &fl4);
if (IS_ERR(rt))
goto drop;

// 5. 发送到物理网卡
ip_local_out(net, skb->sk, skb);
return;

drop:
kfree_skb(skb);
}

整个流程可以分为五个关键步骤:

步骤 1:预留空间。内核调用 skb_cow_head 在原始 IP 包前面预留 20 字节空间,准备塞外层 IP 头。

步骤 2:构造外层 IP 头。内核填充外层 IP 头的各个字段:版本 4、头长度 20 字节、TTL 64、协议号 4(关键字段)、源地址 192.168.1.1、目的地址 172.16.2.2。

步骤 3:设置 skb 元数据。内核设置 skb->protocolhtons(ETH_P_IP)skb->pkt_typePACKET_OUTGOING,并将 skb->dev 更新为隧道设备(tunnel->dev),以便后续在路由查找后交由物理网卡发出。

步骤 4:重新路由。外层 IP 包需要根据外层目的地址重新查找路由,内核调用 ip_route_output_key 确定从哪个物理网卡发出。

步骤 5:发送到物理网卡。内核构造以太网帧头,填充源 MAC 和目的 MAC,然后调用 ip_local_out 将 skb 放入物理网卡的发送队列。

封装完成后,原始 IP 包(源 10.1.1.2,目的 10.1.2.3)被包在外层 IP 包(源 192.168.1.1,目的 172.16.2.2)中,从 eth0 发出。

关键数字一览

项目 数值
协议号 4
外层 IP 头开销 20 字节
推荐 MTU 1480

三、内核如何识别并解封装?

当外层 IP 包到达接收端时,内核在网络栈的 IP 层处理这个包。整个解封装流程定义在 net/ipv4/ip_tunnel.c

static int ip_tunnel_rcv(struct sk_buff *skb, u8 proto)
{
struct ip_tunnel *tunnel;
const struct iphdr *iph = ip_hdr(skb);

// 1. 查找对应的隧道设备
tunnel = ip_tunnel_lookup(tunnel_net, iph->daddr, iph->saddr);
if (!tunnel)
goto drop;

// 2. 剥离外层 IP 头
skb_pull(skb, iph->ihl * 4); // 移动 20 字节
skb_reset_network_header(skb);

// 3. 恢复内层 IP 包
skb->protocol = htons(ETH_P_IP);
skb->pkt_type = PACKET_HOST;
skb->dev = tunnel->dev;

// 4. 重新注入网络栈
if (netif_rx(skb) == NET_RX_DROP)
goto drop;

return 0;

drop:
kfree_skb(skb);
return -ENOMEM;
}

IPIP 协议在内核启动时通过 inet_add_protocol 注册:

static const struct net_protocol ipip_protocol = {
.handler = ipip_rcv, // 接收处理函数
.err_handler = ipip_err, // 错误处理函数
.flags = INET_PROTOSW_PERMANENT,
};

static int __init ipip_init(void)
{
// 注册 IPIP 协议(协议号 4)
if (inet_add_protocol(&ipip_protocol, IPPROTO_IPIP))
return -EAGAIN;

return 0;
}

解封装流程分为四个关键步骤:

步骤 1:IP 头解析。内核在 ip_rcv 函数中解析外层 IP 头,检查协议字段。如果协议字段是 4(IPPROTO_IPIP),内核知道这是一个 IPIP 封装包,调用 ip_local_deliver 将包分发给 ipip_rcv 处理函数。

步骤 2:协议分发。内核根据协议号 4 找到注册的处理函数 ipip_rcv,这个函数会调用 ip_tunnel_rcv 完成解封装。

步骤 3:解封装ip_tunnel_rcv 函数调用 skb_pull 剥离外层 IP 头(移动 20 字节),调用 skb_reset_network_header 重置网络层指针,设置 skb->protocol 为原始 IP 包的协议类型。

步骤 4:重新注入。解封装后的原始 IP 包被重新注入网络栈,内核调用 netif_rx 将包放入接收队列,重新走一遍 IP 层处理流程。这次路由查找会匹配本地路由表项,将包发送到目的容器。

解封装完成后,原始 IP 包(源 10.1.1.2,目的 10.1.2.3)恢复,进入容器网络命名空间,最终到达目的容器。

四、路由表怎么配?

IPIP 隧道需要正确配置路由表才能工作。假设我们有两个节点,Node1(192.168.1.1)和 Node2(172.16.2.2),各自运行容器网络:

Node1 路由表

10.1.2.0/24 via 172.16.2.2 dev tun0

这条路由表示:访问 10.1.2.0/24 网段的包,下一跳是 172.16.2.2,从 tun0 设备发出。当内核匹配到这条路由时,会将包发送到 tun0,触发 IPIP 封装。

Node2 路由表

10.1.1.0/24 via 192.168.1.1 dev tun0

对称配置,Node2 访问 Node1 的容器网段时,也会经过 IPIP 封装。

踩坑经验

我在生产环境遇到过 IPIP 隧道单向通信的问题,排查发现是只配置了一个节点的路由表。如果你发现 ping 能通但 curl 不通,检查两个节点的 tun0 设备是否都正确配置了。

IPIP 隧道是双向的,两个节点都需要创建 tun0 设备并配置路由。如果只有一个节点配置,隧道只能单向通信。

五、性能开销实测

IPIP 封装会引入额外的开销,主要体现在三个方面:

CPU 开销:封装和解封装需要额外的 CPU 周期。在内核态处理,开销相对可控,但高吞吐量场景下会占用 CPU 资源。实测在 Intel Xeon E5-2680 上,IPIP 封装的 CPU 开销约为 5-10%。

带宽开销:外层 IP 头占用 20 字节。假设原始包是 1500 字节,封装后变成 1520 字节,带宽开销约为 1.3%。对于小包场景(如 64 字节),开销更明显,约为 31%。

延迟开销:封装和解封装增加处理延迟。实测单跳延迟增加约 0.1-0.3ms,对于大多数应用影响不大,但对延迟敏感场景需要考虑。

MTU 调整:IPIP 封装增加 20 字节,如果不调整 MTU,可能会触发分片。建议将 tun0 的 MTU 设置为 1480(1500 - 20),或者在物理网卡上启用 PMTU 发现。

调试技巧

# 查看 IPIP 隧道状态
ip tunnel show

# 查看隧道统计信息
cat /proc/net/dev | grep tun

# 抓包验证封装(协议号 4)
tcpdump -i eth0 'ip proto 4' -nn

# 启用 GRO/GSO 减少 CPU 开销
ethtool -K eth0 gro on
ethtool -K eth0 gso on

# 调整 MTU 避免分片
ip link set tun0 mtu 1480

六、IPIP vs VXLAN 选型对比

IPIP 和 VXLAN 都是隧道封装技术,但适用场景不同:

封装开销:从物理层整体报文来看,IPIP 增加 20 字节 IP 头,VXLAN 增加 50 字节(8 字节 UDP 头 + 8 字节 VXLAN 头 + 14 字节以太网头 + 20 字节 IP 头),较 IPIP 多出 30 字节。IPIP 更节省带宽。

MTU 要求:IPIP 需要至少 1480 字节 MTU,VXLAN 需要 1450 字节。在 MTU 受限的环境,IPIP 更有优势。

多租户隔离:VXLAN 支持 VNI(24 位),可以隔离 1600 万个租户。IPIP 没有租户隔离能力,只能用于单租户场景。

跨网段通信:IPIP 需要两端 IP 可达,适合同网段或三层可达的网络。VXLAN 可以跨网段,适合跨数据中心的场景。

硬件卸载:现代网卡支持 VXLAN 硬件卸载,可以显著降低 CPU 开销。IPIP 的硬件支持较少。

性能对比表

指标 IPIP VXLAN 直接路由
CPU 开销 5-10% 15-20% 0%
带宽开销 1.3% 3.3% 0%
延迟增加 0.1-0.3ms 0.5-1ms 0ms

选型建议:如果是同网段、单租户、追求低开销,选 IPIP。如果是跨网段、多租户、需要硬件加速,选 VXLAN。

七、内核实现要点

IPIP 协议的标准定义可以参考 RFC 2003 (IP Encapsulation within IP)。

IPIP 的内核实现有几个关键设计:

隧道设备抽象:内核将 IPIP、VXLAN、GRE 等隧道技术统一抽象为 ip_tunnel 结构体,共享核心逻辑。不同隧道类型通过 handlers 数组注册各自的封装解封装函数:

struct ip_tunnel {
struct ip_tunnel_parm parms; // 隧道参数
struct net_device *dev; // 网络设备
struct hlist_node hlist; // 哈希表节点
int collect_md; // 元数据收集标志
};

per-cpu 统计:隧道设备的统计信息(收发包数、字节数、错误数)使用 per-cpu 变量,避免多核竞争,提高性能:

struct ip_tunnel_pcpu_stats {
u64 rx_packets;
u64 rx_bytes;
u64 tx_packets;
u64 tx_bytes;
struct u64_stats_sync syncp;
};

GRO/GSO 支持:IPIP 支持 GRO(Generic Receive Offload)和 GSO(Generic Segmentation Offload),可以在发送端合并多个小包,减少中断和上下文切换。内核通过 dev->features 标志位控制:

dev->features |= NETIF_F_GSO;
dev->features |= NETIF_F_GRO;

错误处理:内核实现了标准的错误处理,包括 ICMP 目的不可达、超时、参数问题等。错误处理函数 ipip_err 会解析 ICMP 错误包,更新隧道状态:

static void ipip_err(struct sk_buff *skb, u32 info)
{
const struct iphdr *iph = (const struct iphdr *)skb->data;

// 解析 ICMP 错误,更新隧道状态
switch (icmp_hdr(skb)->type) {
case ICMP_DEST_UNREACH:
// 目的不可达,关闭隧道
break;
case ICMP_TIME_EXCEEDED:
// 超时,记录日志
break;
}
}

八、总结

IPIP 隧道是 Linux 内核中一种轻量级的封装技术,通过在原始 IP 包外层封装 IP 头实现跨节点通信。它的核心优势是开销小(20 字节)、实现简单、内核态处理高效。缺点是不支持多租户隔离、需要两端 IP 可达。

Calico IPIP 模式使用这种封装技术,将容器 IP 包封装在主机 IP 包中,实现跨节点通信。理解 IPIP 的内核实现,有助于排查容器网络问题和优化网络性能。

如果有问题欢迎留言,下回再聊其他内核网络机制。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 13:37:53 HTTP/2.0 GET : https://f.mffb.com.cn/a/510286.html
  2. 运行时间 : 0.106401s [ 吞吐率:9.40req/s ] 内存消耗:4,723.73kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=a000359b2799b9efa7b3261b075479cc
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000522s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000757s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000293s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000278s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000472s ]
  6. SELECT * FROM `set` [ RunTime:0.000205s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000581s ]
  8. SELECT * FROM `article` WHERE `id` = 510286 LIMIT 1 [ RunTime:0.000471s ]
  9. UPDATE `article` SET `lasttime` = 1787290673 WHERE `id` = 510286 [ RunTime:0.023612s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000304s ]
  11. SELECT * FROM `article` WHERE `id` < 510286 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000509s ]
  12. SELECT * FROM `article` WHERE `id` > 510286 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001883s ]
  13. SELECT * FROM `article` WHERE `id` < 510286 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000744s ]
  14. SELECT * FROM `article` WHERE `id` < 510286 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004104s ]
  15. SELECT * FROM `article` WHERE `id` < 510286 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001210s ]
0.107883s