当前位置:首页>Linux>深入理解 Linux VXLAN 驱动:从内核源码看虚拟网络的工作原理

深入理解 Linux VXLAN 驱动:从内核源码看虚拟网络的工作原理

  • 2026-08-20 16:16:30
深入理解 Linux VXLAN 驱动:从内核源码看虚拟网络的工作原理

做 VXLAN 的时候遇到过一个问题:ECMP 没有按预期分流,所有流量走一条路径。追了一天源码才发现,源端口没变,交换机以为是一个流。读完这段之后,这类问题基本就不会再踩了。

VXLAN 是什么

VXLAN(Virtual eXtensible Local Area Network)是一种网络虚拟化技术,核心思路很简单:把以太网帧包进 UDP 包,穿过 IP 网络,到了对端再拆出来。

VM A 发送一个以太网帧,经过 VXLAN 封装后变成 IP/UDP/VXLAN/以太网帧,穿过底层网络,到达 VM B 所在的主机,解封装后 VM B 拿到原始帧。整个过程对 VM 完全透明。

在内核里,VXLAN 以伪网络设备(pseudo net device)的形式存在。你执行 ip link add vxlan0 type vxlan id 100 remote 239.1.1.1,内核就创建一个 vxlan_dev 结构体,注册为一个标准网络接口。之后一切和网络设备相关的操作(收发、ARP、路由)都走常规路径。

核心数据结构

读源码先看结构体,这是理解任何内核驱动的第一步。VXLAN 驱动有四个关键结构体。

网络命名空间级:struct vxlan_net

structvxlan_net {structsocket *sock;/* UDP 封装套接字 */structhlist_headvni_list[VNI_HASH_SIZE];/* VNI 哈希表,1024 桶 */};

每个网络命名空间维护一个 vxlan_net,只负责两件事:

  • 持有全局 UDP 套接字,接收所有 VXLAN 流量
  • 维护 VNI 哈希表,把 VNI 映射到对应的 vxlan_dev

VNI 是 24 位标识符,最多支持 1600 万个隔离网络。内核用 10 位哈希(1024 个桶)做查找:

staticinlinestruct hlist_head *vni_head(struct net *net, u32 id){structvxlan_net *vn = net_generic(net, vxlan_net_id);return &vn->vni_list[hash_32(id, VNI_HASH_BITS)];}

设备级:struct vxlan_dev

structvxlan_dev {structhlist_nodehlist;structnet_device *dev;structvxlan_rdstdefault_dst;/* 默认目的地(组播地址等) */    __be32 saddr;                   /* 源 IP */    __be16 dst_port;                /* 目的 UDP 端口 */    __u16 port_min, port_max;       /* 源端口范围 */    __u8 tos, ttl;    u32 flags;                      /* VXLAN_F_LEARN 等标志 */unsignedlong age_interval;     /* FDB 老化时间 */structtimer_listage_timer;/* 老化定时器 */spinlock_t hash_lock;unsignedint addrcnt, addrmax;structhlist_headfdb_head[FDB_HASH_SIZE];/* FDB 哈希表,256 桶 */};

这是驱动的核心结构体。每个 ip link add vxlan0 type vxlan 就创建一个实例。

关键字段:

  • default_dst:没有精确 FDB 条目时,作为默认转发目标
  • fdb_head[]:256 桶哈希表,存 MAC → 远端 IP+端口的映射
  • age_timer:定时器,定期清理过期 FDB 条目(默认 300 秒)
  • flags:控制行为的开关,后面详解

转发表条目:struct vxlan_fdb

structvxlan_fdb {structhlist_nodehlist;/* 哈希表链表节点 */structrcu_headrcu;/* RCU 回调 */unsignedlong updated, used;    /* 更新时间、最后使用时间 */structvxlan_rdstremote;/* 远程端点 */    u16 state;                      /* NUD 状态 */    u8 flags;                       /* NTF_* 标志 */    u8 eth_addr[ETH_ALEN];          /* MAC 地址 */};

VXLAN 的转发表(FDB),存的是"源 MAC → 远端 IP + 端口 + VNI"的映射。

注意 remote 字段是 struct vxlan_rdst,而 vxlan_rdst 里有 remote_next 指针——一个 MAC 地址可以对应多个远端端点。组播场景下就这么实现多目的地转发。

VXLAN 协议头

structvxlanhdr {    __be32 vx_flags;    /* 固定为 0x08000000 */    __be32 vx_vni;      /* VNI 左移 8 位,低 8 位保留 */};

8 字节,4 字节标志 + 4 字节 VNI。就这么简单。

加上外层 IP(20 字节)+ UDP(8 字节)+ 内层以太网头(14 字节),总共需要 50 字节的 headroom:

#define VXLAN_HEADROOM (20 + 8 + 8 + 14)

初始化流程

模块加载:vxlan_init_module

staticint __init vxlan_init_module(void){    get_random_bytes(vxlan_salt, sizeof(vxlan_salt));  /* 哈希盐,防碰撞 */    register_pernet_device(&vxlan_net_ops);             /* 注册网络命名空间回调 */    rtnl_link_register(&vxlan_link_ops);                /* 注册 rtnetlink 设备类型 */return0;}

两步关键操作:

  1. 注册 pernet 操作:每个网络命名空间创建时,调用 vxlan_init_net
  2. 注册 rtnl_link 类型:让 ip link add type vxlan 命令生效

get_random_bytes 给哈希表加盐,避免恶意的 VNI 碰撞攻击。

网络命名空间初始化:vxlan_init_net

staticintvxlan_init_net(struct net *net){structvxlan_net *vn = net_generic(net, vxlan_net_id);int err;/* 创建 UDP 套接字 */    err = sock_create_kern(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &vn->sock);if (err)goto out;    sk = vn->sock->sk;    vxlan_addr.sin_family = AF_INET;    vxlan_addr.sin_port = htons(vxlan_port);    kernel_bind(vn->sock, (struct sockaddr *)&vxlan_addr, sizeof(vxlan_addr));/* 关键:标记为封装套接字,注册接收回调 */    udp_sk(sk)->encap_type = 1;    udp_sk(sk)->encap_rcv = vxlan_udp_encap_recv;    udp_encap_enable();/* 初始化 VNI 哈希表 */for (h = 0; h < VNI_HASH_SIZE; ++h)        INIT_HLIST_HEAD(vn->vni_list[h]);out:return err;}

这里有个关键设计:所有 VXLAN 流量通过一个 UDP 套接字接收,而不是每个设备一个 socket。

encap_rcv 直接绕过 proto_rcv 指向隧道接收回调,这是内核专门给隧道协议留的 fast path,不是 bug。

encap_rcv 指向 vxlan_udp_encap_recv——这是接收路径的入口点。UDP 层收到 8472 端口的包后,直接调这个回调,不走正常的 proto_rcv 路径。

接收路径

入口:vxlan_udp_encap_recv

外部包到达    │    ▼UDP 层解析端口 8472    │    ▼vxlan_udp_encap_recv()          ← 封装接收回调    │    ├─ 1. 剥离外层 UDP 头    ├─ 2. 校验 VXLAN 头(flags 必须为 0x08000000)    ├─ 3. 提取 VNI,查找对应的 vxlan_dev    ├─ 4. 剥离 VXLAN 头    ├─ 5. eth_type_trans() 将内层以太网帧递交给网络栈    ├─ 6. 如果开启学习模式,调用 vxlan_snoop() 学习源 MAC    ├─ 7. 重置 skb 头部指针    ├─ 8. ECN 解封装处理    └─ 9. netif_rx() 递交给上层协议

关键代码:

/* 校验 VXLAN 头 */vxh = (struct vxlanhdr *)skb->data;if (vxh->vx_flags != htonl(VXLAN_FLAGS) ||    (vxh->vx_vni & htonl(0xff)))goto error;/* 提取 VNI,查找设备 */vni = ntohl(vxh->vx_vni) >> 8;vxlan = vxlan_find_vni(sock_net(sk), vni);if (!vxlan) {    netdev_dbg(skb->dev, "unknown vni %d\n", vni);goto drop;}/* 剥离 VXLAN 头,递交给网络栈 */__skb_pull(skb, sizeof(struct vxlanhdr));skb->protocol = eth_type_trans(skb, vxlan->dev);/* MAC 地址学习 */if ((vxlan->flags & VXLAN_F_LEARN) &&    vxlan_snoop(skb->dev, oip->saddr, eth_hdr(skb)->h_source))goto drop;netif_rx(skb);

MAC 地址学习:vxlan_snoop

staticboolvxlan_snoop(struct net_device *dev, __be32 src_ip,const u8 *src_mac){structvxlan_fdb *f = vxlan_find_mac(vxlan, src_mac);if (f) {/* 已有条目:检查 IP 是否变化 */if (f->remote.remote_ip == src_ip)returnfalse;          /* 无变化,正常处理 */if (f->state & NUD_NOARP)returntrue;           /* 静态条目,禁止迁移 *//* MAC 地址迁移了,更新条目 */        f->remote.remote_ip = src_ip;        f->updated = jiffies;    } else {/* 新 MAC,学习并创建 FDB 条目 */        vxlan_fdb_create(vxlan, src_mac, src_ip,                         NUD_REACHABLE, NLM_F_EXCL|NLM_F_CREATE,                         vxlan->dst_port, vni, 0, NTF_SELF);    }returnfalse;}
  • 看到新 MAC:写入 FDB 表,记录 MAC → 远端 IP
  • 看到已知 MAC 换了 IP:更新映射(静态条目除外)
  • 静态条目(NUD_NOARP):禁止自动学习覆盖

学习到的 FDB 条目会触发 vxlan_fdb_notify(),通过 Netlink 通知用户态。ip neigh show 就能看见。

学习逻辑不难,但有个细节:静态条目(NUD_NOARP)禁止覆盖。

发送路径

入口:vxlan_xmit

staticnetdev_tx_tvxlan_xmit(struct sk_buff *skb, struct net_device *dev){structvxlan_dev *vxlan = netdev_priv(dev);structethhdr *eth = eth_hdr(skb);/* Proxy ARP 模式:处理 ARP 请求 */if ((vxlan->flags & VXLAN_F_PROXY) &&        ntohs(eth->h_proto) == ETH_P_ARP)return arp_reduce(dev, skb);/* 查找目的 MAC 对应的远端 */    f = vxlan_find_mac(vxlan, eth->h_dest);/* 无条目?使用默认目的地 */if (f == NULL) {        rdst = vxlan->default_dst;if (vxlan->flags & VXLAN_F_L2MISS)            vxlan_fdb_miss(vxlan, eth->h_dest);  /* 通知用户态 */    } else {        rdst = f->remote;    }/* 多目的地:克隆包分别发送 */for (rdst = rdst->remote_next; rdst; rdst = rdst->remote_next)        vxlan_xmit_one(skb_clone(skb, GFP_ATOMIC), dev, rdst, did_rsc);/* 发送主包 */    vxlan_xmit_one(skb, dev, rdst, did_rsc);}

核心封装:vxlan_xmit_one

staticnetdev_tx_tvxlan_xmit_one(struct sk_buff *skb,struct net_device *dev,struct vxlan_rdst *rdst, bool did_rsc){/* 1. 查找路由 */    rt = ip_route_output_key(dev_net(dev), fl4);/* 2. 本地路由优化:如果目的地是本机,直接 bypass 封装 */if (rt->rt_flags & RTCF_LOCAL) {        vxlan_encap_bypass(skb, vxlan, dst_vxlan);return NETDEV_TX_OK;    }/* 3. 预留头部空间 */    skb_cow_head(skb, VXLAN_HEADROOM);/* 4. 计算源端口(基于 flow hash 或 MAC hash) */    src_port = vxlan_src_port(vxlan, skb);/* 5. 写入 VXLAN 头 */    vxh = (struct vxlanhdr *)__skb_push(skb, sizeof(*vxh));    vxh->vx_flags = htonl(VXLAN_FLAGS);    vxh->vx_vni = htonl(vni << 8);/* 6. 写入 UDP 头 */    uh = udp_hdr(skb);    uh->dest = dst_port;     /* 远端端口 */    uh->source = src_port;   /* 源端口 */    uh->check = 0;           /* 关闭 UDP 校验和 *//* 7. 写入外层 IP 头 */    iph = ip_hdr(skb);    iph->daddr = dst;    iph->saddr = vxlan->saddr;    iph->ttl = ttl;/* 8. 发送 */    iptunnel_xmit(skb, dev);}

源端口选择:负载均衡的关键

static __be16 vxlan_src_port(conststruct vxlan_dev *vxlan,struct sk_buff *skb){/* 优先使用 L4 flow hash(硬件可能已计算) */    hash = skb_get_rxhash(skb);if (!hash)/* 回退:对源/目的 MAC 做 jhash */        hash = jhash(skb->data, 2 * ETH_ALEN, skb->protocol);/* 映射到配置的源端口范围 */return htons((((u64)hash * range) >> 32) + vxlan->port_min);}

这段代码花了我一晚上才看懂。原来 ECMP 失效的原因不是哈希算法不对,是源端口全一样,交换机以为是同一个流。

通过哈希分散流量到不同源端口,交换机就能按流分发,底层 ECMP 才有效。哈希输入是内层帧的源/目的 MAC 和协议类型。skb_get_rxhash 是硬件已经算好的流哈希,优先使用。硬件返回 0 时才回退到手动计算。

本地路由优化:vxlan_encap_bypass

staticvoidvxlan_encap_bypass(struct sk_buff *skb,struct vxlan_dev *src_vxlan,struct vxlan_dev *dst_vxlan){/* 直接内部转发,跳过 IP/UDP/VXLAN 封装 */    skb->dev = dst_vxlan->dev;    __skb_pull(skb, skb_network_offset(skb));    netif_rx(skb);    /* 直接递交给接收侧 */}

目的 IP 就是本机时,跳过完整的封装/发送流程,直接修改 skb->dev 后递交给接收侧。

在同一个主机上创建多个 VXLAN 设备做测试时,这个优化省去了不必要的编码-解码开销。

转发表(FDB)管理

数据结构

FDB 使用 256 桶的哈希表:

structhlist_headfdb_head[FDB_HASH_SIZE];/* FDB_HASH_SIZE = 256 */

哈希函数基于 MAC 地址:

static u32 eth_hash(constunsignedchar *addr){    u64 value = get_unaligned((u64 *)addr);#ifdef __BIG_ENDIAN    value = be64_to_cpu(value);#else    value = le64_to_cpu(value);#endifreturn hash_64(value, FDB_HASH_BITS);    /* 8 位 = 256 桶 */}

三种 FDB 条目来源

来源
方式
状态
自动学习
vxlan_snoop()NUD_REACHABLE
用户态静态配置
ip neigh addNUD_PERMANENT
 / NUD_REACHABLE
组播默认
default_dst

老化机制:vxlan_cleanup

staticvoidvxlan_cleanup(unsignedlong arg){structvxlan_dev *vxlan = (struct vxlan_dev *)arg;/* 遍历所有哈希桶 */for (h = 0; h < FDB_HASH_SIZE; ++h) {        hlist_for_each_safe(p, n, &vxlan->fdb_head[h], hlist) {            f = hlist_entry(p, struct vxlan_fdb, hlist);/* 静态条目永不老化 */if (f->state & NUD_PERMANENT)continue;/* 超过老化时间则删除 */            timeout = f->used + vxlan->age_interval * HZ;if (time_before_eq(timeout, jiffies)) {                vxlan_fdb_destroy(vxlan, f);            }        }    }/* 重新调度定时器 */    mod_timer(&vxlan->age_timer, next_timer);}

参数:

  • FDB_AGE_DEFAULT = 300(5 分钟)
  • FDB_AGE_INTERVAL = 10 * HZ(每 10 秒扫描一次)

定时器每 10 秒唤醒一次,扫描所有 FDB 条目,将超过 5 分钟未使用的条目标记为 STALE 并删除。静态条目不受影响。

Proxy ARP 功能:arp_reduce

当启用 VXLAN_F_PROXY 标志时,VXLAN 设备会代理 ARP 请求:

staticintarp_reduce(struct net_device *dev, struct sk_buff *skb){structarphdr *arp = arp_hdr(skb);    __be32 tip, sip;structsk_buff *reply;structvxlan_fdb *f;if (arp->ar_op != htons(ARPOP_REQUEST))return0;memcpy(&tip, arp->ar_tipn, sizeof(tip));memcpy(&sip, arp->ar_sipn, sizeof(sip));    f = vxlan_find_mac(vxlan, arp->ar_sha);if (!f)return0;    reply = arp_create(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip,                       f->ha.addr, arp->ar_sha, arp->ar_sha);    netif_rx_ni(reply);return1;}

VXLAN 设备代替目标 VM 响应 ARP 请求,VM 之间像在同一二层通信。

代价是 ARP 缓存可能过时。VM 迁移后,远端 VM 的 ARP 表不会自动更新,除非目标 VM 发 gratuitous ARP。生产环境一般关掉这个功能——SDN 控制器自己的 ARP 机制更可靠。

Route Short-Circuit:route_shortcircuit

当启用 VXLAN_F_RSC 时,如果目的 IP 在本机路由表中可达,跳过 VXLAN 封装直接转发:

staticboolroute_shortcircuit(struct net_device *dev, struct sk_buff *skb){structiphdr *iph = ip_hdr(skb);structneighbour *n;    n = neigh_lookup(arp_tbl, iph->daddr, dev);if (n) {/* 直接修改以太网头,交给本地网卡发送 */memcpy(eth_hdr(skb)->h_dest, n->ha, dev->addr_len);returntrue;    }returnfalse;}

本地可达的流量直接走物理网卡,省掉隧道封装。

multicast 组播支持

当 VXLAN 使用组播地址作为目的地时,驱动会自动加入 IGMP 组:

staticintvxlan_join_group(struct net_device *dev){structip_mreqnmreq = {        .imr_multiaddr.s_addr = vxlan->default_dst.remote_ip,        .imr_ifindex = vxlan->default_dst.remote_ifindex,    };int err;    rtnl_unlock();    lock_sock(sk);    err = ip_mc_join_group(sk, &mreq);    /* 内核级 IP_ADD_MEMBERSHIP */    release_sock(sk);    rtnl_lock();return err;}

先释放 RTNL 再获取 sock 锁——ip_mc_join_group 内部要拿 RTNL,顺序反了就是死锁。

同一个组播组可能被多个 VXLAN 设备使用,驱动通过 vxlan_group_used() 去重——只在第一个设备加入、最后一个设备离开时真正加入/离开组播组。

标志位详解

标志
作用
自动学习
VXLAN_F_LEARN
启用 vxlan_snoop() 自动学习 MAC
Proxy ARP
VXLAN_F_PROXY
启用 arp_reduce() 代理 ARP
路由短路
VXLAN_F_RSC
启用 route_shortcircuit() 绕过封装
L2 未命中通知
VXLAN_F_L2MISS
FDB 无条目时通知用户态
L3 未命中通知
VXLAN_F_L3MISS
ARP 无匹配时通知用户态

生产环境最常用 LEARN 和 PROXYRSC 减少隧道封装。L2MISS 和 L3MISS 是给 SDN 控制器用的,没有控制器的场景基本用不到。

整体架构图

┌─────────────────────────────────────────────────────────────┐│                        应用层 / 容器网络                     ││              ip link add vxlan0 type vxlan id 100 ...       │└──────────────────────────┬──────────────────────────────────┘                           │┌──────────────────────────▼──────────────────────────────────┐│                    struct vxlan_dev(网络设备)               ││    ┌─────────────┐    ┌─────────────┐    ┌─────────────────┐ ││    │ fdb_head[256]│    │  age_timer   │    │   default_dst   │ ││    │  MAC→IP 映射 │    │   5min 老化  │    │   组播/默认路由 │ ││    └─────────────┘    └─────────────┘    └─────────────────┘ ││    flags: LEARN|PROXY|RSC|L2MISS|L3MISS                      │└──────────────────────────┬──────────────────────────────────┘                           │              ┌────────────┼────────────┐              ▼            ▼            ▼        vxlan_xmit()  vxlan_snoop()  arp_reduce()        (发送封装)      (接收学习)    (Proxy ARP)              │            │              ▼            ▼        ┌─────────────────────────────┐        │   IP + UDP + VXLAN + Eth    │        │   外层: src_ip → dst_ip     │        │   UDP: src_port → 8472      │        │   VXLAN: VNI=100            │        │   内层: 原始以太网帧          │        └─────────────────────────────┘              │              ▼        物理网卡 → 网络

参考:Linux 3.10 drivers/net/vxlan.c,作者 Stephen Hemminger

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 15:42:23 HTTP/2.0 GET : https://f.mffb.com.cn/a/511068.html
  2. 运行时间 : 0.110244s [ 吞吐率:9.07req/s ] 内存消耗:4,783.59kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=28ed7cfd466d500a2c36e6ad434013fe
  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.001187s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001849s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001407s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.010806s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001774s ]
  6. SELECT * FROM `set` [ RunTime:0.004310s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001620s ]
  8. SELECT * FROM `article` WHERE `id` = 511068 LIMIT 1 [ RunTime:0.005399s ]
  9. UPDATE `article` SET `lasttime` = 1787298143 WHERE `id` = 511068 [ RunTime:0.001660s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000252s ]
  11. SELECT * FROM `article` WHERE `id` < 511068 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000454s ]
  12. SELECT * FROM `article` WHERE `id` > 511068 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000350s ]
  13. SELECT * FROM `article` WHERE `id` < 511068 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003553s ]
  14. SELECT * FROM `article` WHERE `id` < 511068 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001299s ]
  15. SELECT * FROM `article` WHERE `id` < 511068 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001638s ]
0.111648s