乐于分享
好东西不私藏

SDN:软件定义网络实战:控制器挂了,全网交换机变成"没头苍蝇"

SDN:软件定义网络实战:控制器挂了,全网交换机变成"没头苍蝇"

① 故事开场:双十一凌晨,控制器宕机,全网支付中断

老李是某电商平台的网络架构师。公司数据中心有200多台OpenFlow交换机,全部接入自研的SDN控制器。平时运行良好,流量调度、负载均衡、安全策略都通过控制器自动下发,运维效率比传统网络高了好几倍。去年双十一,流量峰值是平时的50倍。凌晨0点10分,控制器突然告警:"内存占用98%,GC频繁"。还没等老李反应过来,控制器进程OOM(Out of Memory)被杀掉了。所有交换机瞬间失去了"大脑"——流表还在,但新流量来了怎么办?原来,控制器在高压下需要处理海量Packet-In消息(每个新连接都要上报),内存被占满。交换机上的旧流表还在,已经建立的连接不受影响,但任何新连接(新的TCP五元组)都匹配不到流表,交换机按Table-Miss规则把包送给控制器,控制器已经死了,包被丢弃。结果就是:用户能打开商品页面(已有连接),但点击"立即支付"时新连接建立失败,支付系统大面积报错。整整3分钟,直到备用控制器接管才恢复。这3分钟里,公司损失了800万订单。事后复盘,老李写下三条铁律:1. SDN控制器必须集群部署(至少3节点),单点故障是灾难。2. 交换机必须支持"应急模式":控制器失联时自动切换到传统L2/L3转发,不能等死。3. Table-Miss流表的动作不能只是"Send To Controller",要配置备用路径(如泛洪或本地路由)。这就是SDN的"阿喀琉斯之踵":控制集中带来了效率,但也带来了单点风险。控制器是网络的大脑,大脑死了,身体再强壮也没用。

⚠️ SDN的核心是"控制平面集中化",但集中化必然带来单点故障风险。生产环境必须部署控制器集群(如ONOS的三节点集群、OpenDaylight的HA模式),并配置交换机失联后的逃生机制。

② 网络拓扑图:SDN三层架构,谁指挥谁,流量怎么走

• 上方紫色区域:应用层,包含负载均衡App、流量监控App、防火墙App、网络拓扑可视化、自动化运维脚本。这些App通过北向接口调用控制器的API。• 中间红色区域:控制层,SDN控制器(Ryu/ONOS/OpenDaylight)。这是网络的"大脑",负责拓扑发现、路径计算、流表下发。通过北向接口接收App指令,通过南向接口管理交换机。• 下方蓝色区域:基础设施层,OpenFlow交换机(OVS或硬件交换机)。交换机只负责转发,不运行复杂路由协议,流表由控制器下发。• 绿色设备:终端主机(Host-A到Host-D),通过交换机互联。• 橙色虚线箭头:北向接口(REST API / Java API),应用层与控制层之间的通信。• 红色双向箭头:南向接口(OpenFlow / NETCONF / OVSDB),控制层与交换机之间的通信,TCP端口6653(OpenFlow标准端口)。• 红色点划线:数据流实际路径(Host-A → Switch-1 → Switch-2 → Switch-4 → Host-D),路径由控制器计算并下发流表决定,不是传统OSPF/BGP计算。• 关键事实:交换机在流表为空时(如开机后)完全依赖控制器,控制器决定一切转发行为。

�� OpenFlow标准端口是TCP 6653(早期版本用6633,现已废弃)。控制器和交换机之间的连接默认不加密,生产环境必须启用TLS(证书认证),防止恶意控制器劫持交换机。

③ 协议原理:SDN到底怎么把"大脑"和"手脚"分开的?

【定义】什么是SDN?

SDN(Software-Defined Networking,软件定义网络)是一种网络架构范式,核心思想是"控制平面与数据平面分离"(Control Plane and Data Plane Separation)。传统网络设备(路由器/交换机)把控制平面(路由计算、策略决策)和数据平面(报文转发)集成在同一台设备上。每台设备独立运行OSPF/BGP/STP等协议,自己决定转发路径。SDN把控制平面抽离出来,集中到一台或多台控制器上。交换机只保留数据平面(转发芯片+流表),变成" dumb forwarder"(傻瓜转发器)。控制器通过南向接口(如OpenFlow)向交换机下发流表,精确控制每一跳的转发行为。SDN的三大核心特征:1. 控制与转发分离:控制器负责"思考",交换机负责"执行"。2. 集中式控制:全网视图集中在控制器,可以基于全局拓扑做最优路径计算,避免分布式协议的局部最优。3. 开放可编程:通过北向接口(REST API),上层应用可以编程控制网络行为,实现自动化运维、意图驱动网络(IBN)。SDN不是某个具体协议,而是一种架构思想。OpenFlow是SDN最著名的南向协议,但SDN也可以用NETCONF、OVSDB、P4Runtime等其他南向接口。

【通俗讲解】交通指挥中心的"红绿灯系统"

想象一个城市的路口(交换机),每个路口都有红绿灯(流表)。传统网络就像"分布式红绿灯":每个路口自己装了一个智能盒子,盒子之间互相喊话(OSPF/BGP),根据车流量自己决定红灯多久、绿灯多久。问题是:每个路口只知道自己这里的情况,不知道全城哪里堵了。结果A路口放行了100辆车,B路口也在放行,两股车流在C路口撞在一起,全城大堵车。SDN就像"交通指挥中心":• 全城所有路口的红绿灯不再自己做决定,而是连到指挥中心(SDN控制器)。• 指挥中心有全城实时路况(拓扑图+流量统计),知道哪里堵、哪里空。• 指挥中心统一调度:"A路口绿灯30秒,B路口红灯,让C路口先疏通。"所有路口严格执行指令(流表下发)。• 上层应用可以调用指挥中心的API:"救护车要从医院到事故现场,请一路绿灯。"指挥中心临时下发专用流表,救护车通过后自动删除。但指挥中心的弱点也很明显:如果指挥中心停电了(控制器宕机),所有路口的红绿灯要么保持上一秒的状态(旧流表还在),要么全部闪黄灯(Table-Miss应急模式),要么彻底熄灭(交换机失联)。没有指挥中心,路口不会自己协调,全城交通瘫痪。这就是SDN的"双刃剑":集中调度效率极高,但单点故障风险极大。

【逐字段拆解】OpenFlow 1.3 流表条目,每个字段干嘛的?

OpenFlow是SDN最著名的南向协议,由ONF(Open Networking Foundation)标准化。目前主流版本是OpenFlow 1.3(2012年发布)和1.5(2015年发布)。OpenFlow的核心是"流表"(Flow Table)。交换机收到数据包后,从流表0开始逐条匹配,匹配成功后执行对应指令。如果所有表都不匹配,执行Table-Miss动作(通常上报控制器)。【一条流表条目的完整结构】① Match Fields(匹配字段)• 共40+个可选字段,覆盖OSI模型各层:  - L1:Ingress Port(入端口,如port 1)、Physical Port、Metadata(元数据,用于表间传递)。  - L2:Ethernet Destination/Source MAC(目的/源MAC)、Ethernet Type(0x0800=IPv4,0x0806=ARP,0x86DD=IPv6)、VLAN ID、VLAN PCP(优先级)。  - L3:IP DSCP(差分服务代码点)、IP ECN(显式拥塞通知)、IP Protocol(6=TCP,17=UDP,1=ICMP)、IPv4 Source/Destination(支持前缀掩码匹配)、IPv6 Source/Destination/Flow Label/Extension Header。  - L4:TCP/UDP Source/Destination Port(支持范围匹配)、TCP Flags(SYN/ACK/FIN/RST等)。  - L7+:ARP Opcode、ARP Source/Target IP/MAC、MPLS Label/TC/BOS、PBB I-SID、Tunnel ID等。• 掩码匹配:OpenFlow 1.3支持任意字段的掩码匹配,如IP Dst=192.168.1.0/24,匹配整个子网。② Priority(优先级)• 16位无符号整数,0-65535。数值越大优先级越高。• 交换机按优先级从高到低匹配,第一条匹配即停止(不是最长匹配,是优先级优先)。• 示例:优先级100的"DROP来自10.0.0.1的包"会覆盖优先级50的"转发所有包"。③ Counters(计数器)• 只读字段,统计该流表条目的:接收包数、接收字节数、流持续时间(秒/纳秒)、空闲时间。• 控制器通过OFPT_MULTIPART_REQUEST(原OFPT_STATS_REQUEST)读取计数器,实现流量监控和计费。④ Instructions(指令集)• 匹配成功后的处理动作,是流表的核心价值所在:  - Apply-Actions:立即执行一组动作(如output=2转发到端口2、set_field=eth_dst修改MAC、push_vlan推送VLAN标签、drop丢弃、set_queue设置QoS队列)。  - Write-Actions:把动作写入"动作集"(Action Set),与Apply-Actions的区别是Write-Actions不立即执行,而是累积到流水线末尾统一执行。  - Clear-Actions:清空动作集。  - Goto-Table:跳转到下一张流表(如从Table 0跳到Table 1),实现多表流水线。  - Write-Metadata:写入64位元数据,供后续流表匹配使用(如Table 0标记"这是VIP流量",Table 1根据元数据做QoS调度)。  - Meter:应用限速策略(如超过100Mbps就丢弃或标记)。⑤ Timeouts(超时时间)• Idle Timeout:空闲超时,单位秒。如果N秒内没有包匹配该流表,自动删除。防止流表无限增长。• Hard Timeout:硬超时,单位秒。无论是否有流量,到达绝对时间后强制删除。• 典型配置:Idle=60秒(动态流),Hard=0(永不超时,用于静态策略)。⑥ Cookie(标识符)• 64位无符号整数,由控制器分配,不参与转发,仅用于控制器管理流表。• 示例:Cookie=0x1表示"负载均衡App下发的流表",Cookie=0x2表示"防火墙App下发的流表"。控制器可以通过Cookie批量删除或修改特定App的流表。⑦ Flags(标志位)• Send Flow Removed:流表被删除(超时/控制器主动删除)时,交换机发送OFPT_FLOW_REMOVED消息通知控制器,控制器回收资源。• Check Overlap:检查新下发的流表是否与已有流表重叠(相同匹配字段+相同优先级),防止冲突。• Reset Counts:重置计数器。• No Packet/Byte Counts:不统计包数/字节数,节省交换机CPU。

�� OpenFlow 1.3支持多级流表流水线(Pipeline),最多255张表。Table 0通常做ACL/安全策略,Table 1做L2转发,Table 2做L3路由,Table 3做QoS标记。Goto-Table实现复杂的多阶段处理,这是传统ACL无法做到的灵活度。

OpenFlow消息交互】控制器和交换机之间聊什么?

OpenFlow协议定义了多种消息类型,分为三个类别:Controller-to-Switch(控制器→交换机)】• OFPT_FEATURES_REQUEST / REPLY:控制器请求交换机特性(Datapath ID、端口数量、流表数量、支持动作),交换机回复详细信息。• OFPT_GET_CONFIG_REQUEST / SET_CONFIG:控制器查询或配置交换机参数(如分片处理模式、Packet-In缓存大小)。• OFPT_FLOW_MOD:最核心的消息!控制器通过Flow-Mod添加、修改、删除流表。包含完整的Match Fields、Instructions、Timeouts、Cookie。• OFPT_PACKET_OUT:控制器把数据包从Packet-In中取出,指定交换机的出端口发出。用于第一个未知包的处理(控制器计算完路径后,把包送回交换机转发)。• OFPT_PORT_MOD:控制器修改端口状态(up/down、速率、QoS队列)。• OFPT_GROUP_MOD:配置组表(Group Table),实现负载均衡(Select组)、广播(All组)、快速故障切换(Fast Failover组)。• OFPT_METER_MOD:配置限速策略。• OFPT_MULTIPART_REQUEST:查询统计信息(流表计数器、端口统计、队列统计、流表特性)。Asynchronous(异步消息,交换机→控制器)】• OFPT_PACKET_IN:交换机收到未知流(无匹配流表),按Table-Miss规则把包封装后上报控制器。包含:入端口、完整数据包内容、原因(No Match / Action Send To Controller)。• OFPT_FLOW_REMOVED:流表因超时或控制器删除而失效时,交换机通知控制器,包含:删除原因(Idle Timeout / Hard Timeout / Delete)、最终计数器值。• OFPT_PORT_STATUS:端口状态变化(up/down/配置变更)时通知控制器。• OFPT_ERROR:交换机遇到错误时通知控制器(如Flow-Mod中的匹配字段不支持、指令非法)。Symmetric(对称消息,双方均可发起)】• OFPT_HELLO:连接建立时协商OpenFlow版本。双方互相发送Hello消息,携带支持的版本列表,取交集确定实际使用的版本。版本不一致则断开连接。• OFPT_ECHO_REQUEST / ECHO_REPLY:心跳检测,默认15秒一次,检测连接活性。• OFPT_EXPERIMENTER:厂商扩展消息。【完整交互流程(以第一个数据包为例)】1. 交换机开机,主动连接控制器(TCP 6653)。2. 双方交换OFPT_HELLO,协商版本(如OpenFlow 1.3)。3. 控制器发OFPT_FEATURES_REQUEST,交换机回复OFPT_FEATURES_REPLY(报告DPID、端口、能力)。4. 控制器发OFPT_SET_CONFIG,配置交换机参数。5. 控制器发OFPT_FLOW_MOD,下发Table-Miss流表(优先级=0,匹配=ANY,动作=Send To Controller)。6. Host-A发送第一个数据包到Host-B,交换机查所有流表无匹配,触发Table-Miss。7. 交换机把包封装在OFPT_PACKET_IN中上报控制器(慢路径)。8. 控制器查全局拓扑图,计算最短路径:Switch-1 → Switch-2 → Switch-3。9. 控制器向路径上所有交换机发送OFPT_FLOW_MOD,下发精确流表(Match=[in_port=1, eth_dst=Host-B-MAC], Action=[output=2], Idle=60s)。10. 控制器把原始包通过OFPT_PACKET_OUT送回Switch-1,指定从端口2发出。11. Host-A的后续数据包匹配到新流表,Switch-1直接硬件转发(快路径),无需再上报控制器。12. 60秒内无新包,流表Idle Timeout到期,交换机删除流表并发送OFPT_FLOW_REMOVED通知控制器。关键性能数据:• 慢路径(Packet-In→控制器→Flow-Mod→Packet-Out):10-50ms,取决于控制器性能和网络延迟。• 快路径(流表硬件匹配):亚微秒级(<1μs),由ASIC/FPGA直接处理。• 因此SDN的吞吐量取决于"流表命中率":命中率越高,整体性能越好。

⚠️ Packet-In是SDN的性能瓶颈。每个新流都要上报控制器,如果网络中有大量短连接(如HTTP/1.0、微服务RPC),控制器会被Packet-In淹没。解决方案: proactive流表(控制器预下发通配流表)、Packet-In限速、控制器集群负载均衡。

【南向接口 vs 北向接口】SDN的"上下通道"

【南向接口(Southbound Interface)】控制器到网络设备的接口,负责下发指令和收集状态。• OpenFlow:最主流,直接操作流表,粒度最细(单包级控制),但依赖专用芯片支持。• NETCONF:基于XML的配置管理协议(RFC 6241),通过YANG模型描述设备配置。适合配置传统路由器/交换机(不依赖OpenFlow芯片),但粒度粗(配置级,非流表级)。• OVSDB:Open vSwitch Database Protocol,专门管理Open vSwitch(OVS)虚拟交换机。通过JSON-RPC操作OVS的数据库(Bridge、Port、Interface、Flow表)。• P4Runtime:基于P4语言的运行时接口,比OpenFlow更灵活,支持自定义协议解析和转发逻辑。未来趋势。• BGP-LS / PCEP:用于SDN控制器获取链路状态(BGP-LS)和路径计算(PCEP),主要在WAN场景。【北向接口(Northbound Interface)】应用到控制器的接口,负责业务意图的翻译。• REST API:最主流,基于HTTP/JSON。应用通过GET/POST/PUT/DELETE调用控制器的API,如"创建虚拟网络""下发防火墙规则""查询流量统计"。• Java API / Python API:控制器提供的SDK,应用直接调用库函数。如ONOS的Java Service API、Ryu的Python App框架。• CLI / GUI:控制器的命令行和图形界面,供运维人员手动操作。• Intent-Based API:意图驱动接口,应用只需声明"Host-A能访问Host-B",控制器自动计算路径并下发流表。如ONOS的Intent Framework。【东西向接口(East-West Interface)】控制器之间的接口,用于集群同步和域间协作。• 如ONOS的Raft共识协议(用于集群状态同步)、OpenDaylight的Akka集群通信。

SDN控制器选型】Ryu / ONOS / OpenDaylight / Floodlight

Ryu(日本NTT开发)】• 语言:Python。• 特点:轻量、易上手、社区活跃。自带大量示例应用(简单交换机、负载均衡、防火墙)。• 适用:学术研究、小型实验、快速原型开发。• 缺点:Python性能瓶颈,不适合大规模生产环境(>1000台交换机)。ONOS(Open Network OS,Linux基金会)】• 语言:Java。• 特点:面向运营商和大型数据中心,集群架构(3+节点),高可用(HA)、高性能(声称支持1000+节点)。• 核心特性:分布式核心(Distributed Core)、Intent Framework(意图驱动)、GUI拓扑可视化、南向支持OpenFlow/NETCONF/P4Runtime。• 适用:大型数据中心、运营商骨干网。• 缺点:Java内存占用大,配置复杂。OpenDaylight(ODL,Linux基金会)】• 语言:Java(OSGi框架)。• 特点:模块化架构,功能丰富(MD-SAL模型驱动服务抽象层),支持多种南向协议。• 适用:企业网、多厂商混合环境。• 缺点:架构复杂,学习曲线陡峭,启动慢。Floodlight(Big Switch Networks)】• 语言:Java。• 特点:稳定、文档完善、REST API丰富。早期最流行的开源控制器之一。• 适用:中型企业网、教育实验。• 缺点:单节点架构(无原生集群),社区活跃度下降。【选型建议】• 学习实验:Ryu(Python简单)或Floodlight(文档好)。• 生产环境大型数据中心:ONOS(集群+高性能)。• 多厂商混合环境:OpenDaylight(模块化+兼容性好)。

��生产环境选控制器,不要只看功能列表,要看三点:集群高可用能力(是否支持3节点以上集群)、南向协议兼容性(是否支持你的交换机品牌)、社区活跃度(Bug修复速度、安全补丁频率)。

④ 动手实战:命令行每一步 + 验证输出

实验环境:Ubuntu 20.04/22.04虚拟机(或WSL2),安装Mininet和Ryu控制器。Mininet是SDN仿真工具,可以在一台机器上模拟多台OpenFlow交换机、主机和链路。Ryu是Python编写的轻量级SDN控制器,自带简单交换机应用。实验目标:1. 用Mininet创建拓扑:1台控制器 + 3台OpenFlow交换机 + 6台主机。2. Ryu控制器自动下发流表,实现全网互通。3. 手动抓包观察OpenFlow消息交互(Hello/Features/Packet-In/Flow-Mod)。4. 手动添加自定义流表,实现ACL拦截。

实验A:安装Mininet和Ryu

# 第一步:安装Mininet(Ubuntu)sudo apt-get updatesudo apt-get install -y mininet# 验证安装sudo mn --test pingall# 如果显示"*** Results: 0% dropped",说明Mininet安装成功# 第二步:安装Ryu控制器sudo apt-get install -y python3-pippip3 install ryu# 验证安装ryu-manager --version# 显示类似"Ryu 4.34"即成功

实验B:Mininet创建自定义拓扑(3台交换机+6台主机)

# 创建Python拓扑脚本 topo.pyfrom mininet.topo import Topoclass MyTopo(Topo):    def build(self):        # 添加3台OpenFlow交换机        s1 = self.addSwitch('s1', protocols='OpenFlow13')  # 使用OpenFlow 1.3        s2 = self.addSwitch('s2', protocols='OpenFlow13')        s3 = self.addSwitch('s3', protocols='OpenFlow13')        # 添加6台主机        h1 = self.addHost('h1', ip='10.0.0.1/24')        h2 = self.addHost('h2', ip='10.0.0.2/24')        h3 = self.addHost('h3', ip='10.0.0.3/24')        h4 = self.addHost('h4', ip='10.0.0.4/24')        h5 = self.addHost('h5', ip='10.0.0.5/24')        h6 = self.addHost('h6', ip='10.0.0.6/24')        # 添加链路        self.addLink(h1, s1)        self.addLink(h2, s1)        self.addLink(h3, s2)        self.addLink(h4, s2)        self.addLink(h5, s3)        self.addLink(h6, s3)        self.addLink(s1, s2)        self.addLink(s2, s3)topos = {'mytopo': (lambda: MyTopo())}# 启动Mininet并连接远程控制器(Ryu)sudo mn --custom topo.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653 --mac# 参数说明:# --custom topo.py: 加载自定义拓扑# --topo mytopo: 使用名为mytopo的拓扑# --controller=remote: 使用远程控制器(而非Mininet内置的默认控制器)# ip=127.0.0.1,port=6653: 控制器在本机6653端口# --mac: 自动设置主机MAC地址(简化实验)

实验C:启动Ryu控制器(简单交换机应用)

# 终端1:启动Ryu控制器(自带simple_switch_13应用)ryu-manager ryu.app.simple_switch_13 --verbose# simple_switch_13.py 是Ryu自带的示例应用,功能:# 1. 收到Packet-In后,学习源MAC和入端口的映射# 2. 如果目的MAC已知,下发流表(Match:目的MAC+入端口, Action:output到对应端口)# 3. 如果目的MAC未知,泛洪(Action:output=FLOOD)# 你会看到如下日志:# [INFO] connected socket:<...> address:('127.0.0.1', 12345)# [INFO] switch features event version=0x4(0x04=OpenFlow 1.3) datapath_id=0000000000000001# [INFO] switch features event version=0x04 datapath_id=0000000000000002# [INFO] switch features event version=0x04 datapath_id=0000000000000003# 说明3台交换机都已连接控制器# 终端2(Mininet CLI):测试互通mininet> pingall*** Ping: testing ping reachabilityh1 -> h2 h3 h4 h5 h6 h2 -> h1 h3 h4 h5 h6 h3 -> h1 h2 h4 h5 h6 h4 -> h1 h2 h3 h5 h6 h5 -> h1 h2 h3 h4 h6 h6 -> h1 h2 h3 h4 h5 *** Results: 0% dropped (30/30 received)# 全网互通!控制器自动下发了流表

实验D:查看OpenFlow流表(交换机内部)

# 在Mininet CLI中查看交换机s1的流表mininet> sh ovs-ofctl -O OpenFlow13 dump-flows s1# 或者新开终端:sudo ovs-ofctl -O OpenFlow13 dump-flows s1# 输出示例: cookie=0x0, duration=120.234s, table=0, n_packets=15, n_bytes=1470,    idle_timeout=60, hard_timeout=0, priority=1,    in_port="s1-eth1",dl_src=00:00:00:00:00:01,dl_dst=00:00:00:00:00:02,    actions=output:"s1-eth2"# 解释:# cookie=0x0: 标识符# duration=120.234s: 流表已存在120秒# table=0: 在Table 0中# n_packets=15: 已匹配15个包# idle_timeout=60: 60秒无流量则删除# priority=1: 优先级=1# in_port="s1-eth1": 入端口是s1-eth1(连接h1)# dl_src=...:01: 源MAC是h1# dl_dst=...:02: 目的MAC是h2# actions=output:"s1-eth2": 从s1-eth2发出(连接h2)# 查看Table-Miss流表(优先级=0,匹配所有包) cookie=0x0, duration=300.456s, table=0, n_packets=3, n_bytes=294,    priority=0, actions=CONTROLLER:65535# 解释:# priority=0: 最低优先级# actions=CONTROLLER:65535: 上报控制器(Packet-In),65535是最大缓存长度

实验E:手动下发ACL流表(拦截h1访问h3)

# 在Mininet CLI中,手动向s1下发流表# 目标:拦截h1(10.0.0.1)发往h3(10.0.0.3)的流量mininet> sh ovs-ofctl -O OpenFlow13 add-flow s1   "priority=100,ip,nw_src=10.0.0.1,nw_dst=10.0.0.3,actions=drop"# 参数解释:# priority=100: 高优先级,覆盖默认转发流表# ip: 匹配IP包(Ethernet Type=0x0800)# nw_src=10.0.0.1: 源IP是h1# nw_dst=10.0.0.3: 目的IP是h3# actions=drop: 动作是丢弃# 测试:h1 ping h3,应该不通mininet> h1 ping -c 3 h3PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.--- 10.0.0.3 ping statistics ---3 packets transmitted, 0 received, 100% packet loss, time 2048ms# 拦截成功!# 但h1 ping h2仍然通(因为只拦截了到h3的流量)mininet> h1 ping -c 1 h2PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=2.34 ms# 查看s1的流表,确认ACL流表存在mininet> sh ovs-ofctl -O OpenFlow13 dump-flows s1 | grep 10.0.0.3 cookie=0x0, duration=45.123s, table=0, n_packets=3, n_bytes=294,    idle_timeout=0, hard_timeout=0, priority=100,ip,   nw_src=10.0.0.1,nw_dst=10.0.0.3,actions=drop# 删除ACL流表(恢复通信)mininet> sh ovs-ofctl -O OpenFlow13 del-flows s1   "ip,nw_src=10.0.0.1,nw_dst=10.0.0.3"# 再次测试,h1 ping h3恢复mininet> h1 ping -c 1 h364 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=3.12 ms

实验F:Wireshark抓包观察OpenFlow消息

# 新开终端,抓取lo接口(Mininet和Ryu都在本机通信)sudo wireshark -i lo -f "tcp port 6653"# 在Wireshark过滤器中输入:openflow_v4(OpenFlow 1.3是v4)# 你会看到:# 1. OFPT_HELLO(交换机→控制器)# Type: OFPT_HELLO (0)# Version: 0x04 (OpenFlow 1.3)# 2. OFPT_HELLO(控制器→交换机)# Type: OFPT_HELLO (0)# Version: 0x04# 3. OFPT_FEATURES_REQUEST(控制器→交换机)# Type: OFPT_FEATURES_REQUEST (5)# 4. OFPT_FEATURES_REPLY(交换机→控制器)# Type: OFPT_FEATURES_REPLY (6)# Datapath Unique ID: 0x0000000000000001# n_tables: 254# Capabilities: 0x0000004f#   .... ...1 = Flow statistics: True#   .... ..1. = Table statistics: True#   .... .1.. = Port statistics: True#   .... 1... = Group statistics: True#   ..1. .... = Reassemble IP fragments: True# 5. OFPT_PACKET_IN(交换机→控制器,第一个ping包)# Type: OFPT_PACKET_IN (10)# Buffer ID: 0x00000100(交换机缓存了包,只上报包头)# Total length: 98# In port: 1# Reason: OFPR_NO_MATCH (0)(无匹配流表)# Data: Ethernet II, Src: 00:00:00_00:00:01, Dst: 00:00:00_00:00:03#       Internet Protocol Version 4, Src: 10.0.0.1, Dst: 10.0.0.3#       Internet Control Message Protocol (Echo request)# 6. OFPT_FLOW_MOD(控制器→交换机,下发流表)# Type: OFPT_FLOW_MOD (14)# Command: OFPFC_ADD (0)# Match: In port: 1, Ethernet source: 00:00:00:00:00:01#        Ethernet destination: 00:00:00:00:00:03# Instruction: Apply-Actions#   Action: Output to port 2# Idle Timeout: 60# 7. OFPT_PACKET_OUT(控制器→交换机,把第一个包发出去)# Type: OFPT_PACKET_OUT (13)# In port: 1# Action: Output to port 2# Data: [原始ping包内容]

⑤ 故障处理:3个最常见的翻车现场

故障1:控制器单点故障,全网新连接中断

【现象】

• SDN控制器进程崩溃或服务器宕机。• 已建立的连接(已有流表)不受影响,继续通信。• 任何新连接(新TCP/UDP五元组)无法建立,ping不通,应用报错。• 交换机日志显示"Connection refused"或"Controller connection lost"。

【原因】

SDN架构的先天弱点:控制集中化。1. 控制器宕机后,交换机上的旧流表还在(除非超时),所以已建立的连接继续转发。但新流量来了,交换机查流表无匹配,触发Table-Miss,按配置应该上报控制器(Send To Controller),但控制器已经死了,连接被拒绝,包被丢弃。2. 没有部署控制器集群:很多实验环境或中小型企业只部署单节点控制器,没有HA(高可用)机制。3. 交换机没有配置逃生模式:部分交换机支持"控制器失联后切换到传统转发模式"(如OVS的fail_mode=standalone),但默认可能是secure模式(只接受控制器下发的流表,控制器失联后拒绝所有新流量)。4. Table-Miss动作配置错误:Table-Miss流表只配置了"Send To Controller",没有备用动作(如FLOOD泛洪或NORMAL本地转发)。

【解决命令】

# 排查1:确认控制器状态$ systemctl status ryu-controller# 或查看控制器进程$ ps aux | grep ryu# 如果进程不存在,说明控制器已崩溃# 排查2:检查交换机与控制器的连接状态mininet> sh ovs-vsctl show    Bridge "s1"        Controller "tcp:127.0.0.1:6653"            is_connected: false          // ← 连接断开!        fail_mode: secure                // ← secure模式,控制器失联后拒绝新流量# 解决1:部署控制器集群(以ONOS为例)# ONOS支持3节点集群,通过Raft共识协议同步状态# 节点1:$ export ONOS_APPS=drivers,openflow,proxyarp,fwd$ onos-service start# 节点2、3同理,配置相同的集群IP# 解决2:配置交换机逃生模式(OVS)# 将fail_mode从secure改为standalonemininet> sh ovs-vsctl set-fail-mode s1 standalone# standalone模式:控制器失联后,交换机像普通交换机一样运行(自学习MAC泛洪)# 或在Mininet启动时指定sudo mn --topo single,3 --controller remote,ip=127.0.0.1,port=6653   --switch ovsk,failMode=standalone# 解决3:修改Table-Miss流表,增加备用动作# 在控制器正常时,下发Table-Miss流表:# 优先级=0,匹配=ANY,动作=[Send To Controller, NORMAL]# 这样即使控制器失联,交换机还能回退到NORMAL(传统转发)mininet> sh ovs-ofctl -O OpenFlow13 add-flow s1   "priority=0,actions=controller,normal"# 解决4:配置控制器保活和自动重启# 用systemd管理控制器进程,崩溃后自动重启$ sudo systemctl enable ryu-controller$ sudo systemctl restart ryu-controller# 解决5:OpenFlow over TLS(加密+认证)# 虽然TLS不能防止控制器宕机,但可以防止恶意控制器冒充# 生成证书$ openssl req -x509 -newkey rsa:2048 -keyonut key.pem -out cert.pem -days 365# 控制器启动时指定证书$ ryu-manager --ctl-privkey key.pem --ctl-cert cert.pem app.py# 交换机配置CA证书,只接受合法控制器

⚠️ 生产环境部署SDN,控制器集群是底线要求。ONOS的3节点集群可以容忍1个节点故障,5节点集群可以容忍2个节点故障。同时必须配置交换机的fail_mode=standalone或secure+NORMAL备用动作,确保控制器失联后网络不瘫痪。

故障2:流表下发失败,控制器日志显示"Error: Flow Mod Failed"

【现象】

• 控制器尝试下发流表,但交换机回复OFPT_ERROR。• 控制器日志显示"OFPET_FLOW_MOD_FAILED"或"OFPET_BAD_MATCH"。• 部分流量走预期路径,部分流量被丢弃或泛洪。• Wireshark抓包看到Flow-Mod后交换机立即返回Error。

【原因】

流表下发失败有4个常见根因:1. 匹配字段不支持:控制器下发了交换机不支持的匹配字段。例如OpenFlow 1.0交换机不支持IPv6匹配,但控制器下发了ipv6_src匹配字段。2. 指令动作不支持:控制器下发了交换机不支持的动作。例如某些硬件交换机不支持"Push MPLS Label"或"Set Field: TCP DSCP"。3. 流表重叠冲突:新流表与已有流表在相同优先级下匹配字段重叠。例如已有流表"priority=100, ip_dst=10.0.0.0/24, actions=output:1",新下发"priority=100, ip_dst=10.0.0.1, actions=drop",两者重叠且优先级相同,交换机会拒绝或根据实现覆盖。4. 流表空间耗尽:交换机硬件流表(TCAM)容量有限(如1K/4K/8K条),当流表数量超过硬件容量时,新的Flow-Mod被软件处理(性能暴跌)或直接拒绝。5. 表号越界:控制器指定了Table 10,但交换机只支持0-3号表。

【解决命令】

# 排查1:查看交换机能力(Features Reply中的Capabilities)# Wireshark抓包看OFPT_FEATURES_REPLY# 或控制器日志中查看# Capabilities字段:#   OFPC_FLOW_STATS=1(支持流统计)#   OFPC_TABLE_STATS=1(支持表统计)#   OFPC_PORT_STATS=1(支持端口统计)#   OFPC_IP_REASM=1(支持IP分片重组)#   OFPC_QUEUE_STATS=1(支持队列统计)#   OFPC_ARP_MATCH_IP=1(支持ARP IP匹配)# 排查2:查看交换机支持的匹配字段和动作mininet> sh ovs-ofctl -O OpenFlow13 dump-flows s1 --help# 或查看OVS版本支持的OpenFlow特性mininet> sh ovs-ofctl --versionovs-ofctl (Open vSwitch) 2.13.3OpenFlow versions 0x1:0x5(支持1.0到1.5)# 排查3:检查流表重叠mininet> sh ovs-ofctl -O OpenFlow13 dump-flows s1# 查看是否有相同优先级的重叠流表# 例如: priority=100,ip,nw_dst=10.0.0.0/24,actions=output:1 priority=100,ip,nw_dst=10.0.0.1,actions=drop# 这两条重叠!需要调整优先级或精确匹配# 解决1:降低优先级避免冲突# 把精确匹配的流表优先级调高,通配匹配的优先级调低mininet> sh ovs-ofctl -O OpenFlow13 add-flow s1   "priority=200,ip,nw_dst=10.0.0.1,actions=drop"   // 精确匹配,高优先级mininet> sh ovs-ofctl -O OpenFlow13 add-flow s1   "priority=100,ip,nw_dst=10.0.0.0/24,actions=output:1"  // 通配匹配,低优先级# 解决2:检查交换机支持的表数量mininet> sh ovs-ofctl -O OpenFlow13 dump-tables s1# 输出:#  table 0: info: wildcards=0x3fffff, max_entries=1000000, active=5#  table 1: info: wildcards=0x3fffff, max_entries=1000000, active=0# 确认表号存在且未越界# 解决3:查看硬件TCAM容量(硬件交换机)# 华为/思科命令:# display openflow switch 1 flow-table# 查看active entries和max entries# 解决4:在控制器代码中捕获并处理OFPT_ERROR# Ryu示例:from ryu.controller.handler import set_ev_clsfrom ryu.ofproto import ofproto_v1_3from ryu.controller import ofp_eventclass MyApp(app_manager.RyuApp):    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]    @set_ev_cls(ofp_event.EventOFPErrorMsg)    def error_msg_handler(self, ev):        msg = ev.msg        self.logger.error('OFPErrorMsg received: type=%d code=%d',                         msg.type, msg.code)        # type=OFPET_FLOW_MOD_FAILED(2) 表示流表下发失败        # code=OFPFMFC_TABLE_FULL(5) 表示流表已满        # code=OFPFMFC_BAD_TIMEOUT(7) 表示超时时间非法

��流表下发失败时,控制器日志和OFPT_ERROR消息是排查关键。Ryu的error_msg_handler可以捕获所有错误,建议在生产环境的控制器代码中实现此handler,记录并告警。

故障3:TLS证书过期,交换机拒绝连接控制器

【现象】

• 生产环境运行数月后,交换机突然断开与控制器的连接。• 控制器日志显示"SSL handshake failed"或"Certificate expired"。• 交换机反复尝试重连,但始终失败。• 网络逐渐瘫痪(旧流表超时后无新流表下发)。

【原因】

OpenFlow over TLS(SSL)是生产环境的安全要求,但TLS证书有有效期(通常1年)。证书过期后,SSL握手失败,交换机无法验证控制器身份,拒绝建立TCP连接。常见证书问题:1. 证书过期:自签名证书通常设365天有效期,到期后自动失效。2. 证书链不完整:控制器证书由中间CA签发,但交换机只信任根CA,缺少中间CA证书导致验证失败。3. 证书主题名不匹配:控制器证书的主题名(CN)是"controller.example.com",但交换机连接的是IP地址"192.168.1.1",TLS验证时主机名不匹配。4. 时钟不同步:交换机或控制器的系统时间错误(如NTP未同步),导致证书有效期判断错误。5. 证书吊销:证书被CA吊销(CRL或OCSP检查失败)。

【解决命令】

# 排查1:检查控制器证书有效期$ openssl x509 -in controller.crt -noout -datesnotBefore=May 20 00:00:00 2023 GMTnotAfter=May 19 23:59:59 2024 GMT# 如果当前日期超过notAfter,证书已过期!# 排查2:检查证书主题名和SAN(Subject Alternative Name)$ openssl x509 -in controller.crt -noout -text | grep -A1 "Subject Alternative Name"X509v3 Subject Alternative Name:    DNS:controller.example.com, IP Address:192.168.1.1# 确认包含交换机连接的目标地址(IP或域名)# 排查3:检查交换机系统时间mininet> sh dateWed May 22 14:30:00 UTC 2024# 如果时间错误,同步NTP$ sudo ntpdate pool.ntp.org# 解决1:重新生成自签名证书(临时方案)$ openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365   -subj "/CN=controller.example.com"   -addext "subjectAltName=DNS:controller.example.com,IP:192.168.1.1"# 注意:-days 365设为新有效期,-addext加入SAN# 解决2:用Let's Encrypt或企业CA签发证书(生产环境推荐)# Let's Encrypt免费,90天有效期,支持自动续期(certbot)$ sudo certbot certonly --standalone -d controller.example.com# 解决3:配置交换机信任控制器CA# OVS示例:mininet> sh ovs-vsctl set-ssl   /etc/openvswitch/switch-key.pem   /etc/openvswitch/switch-cert.pem   /etc/openvswitch/ca-cert.pem# ca-cert.pem必须包含控制器证书的签发CA(根CA+中间CA)# 解决4:配置证书自动续期和监控# 用cron定时检查证书有效期,提前30天告警$ cat /etc/cron.daily/check-cert#!/bin/bashDAYS=$(openssl x509 -in /etc/ryu/cert.pem -noout -enddate |        cut -d= -f2 | xargs -I{} date -d "{}" +%s)NOW=$(date +%s)LEFT=$(( (DAYS - NOW) / 86400 ))if [ $LEFT -lt 30 ]; then  echo "WARNING: TLS certificate expires in $LEFT days" |     mail -s "SDN Cert Alert" admin@example.comfi# 解决5:短期应急:禁用TLS(仅用于紧急恢复,不推荐长期)# 控制器启动时不指定证书$ ryu-manager app.py# 交换机配置为tcp而非sslmininet> sh ovs-vsctl set-controller s1 tcp:192.168.1.1:6653# 注意:禁用TLS后,控制器和交换机之间的通信明文传输,存在中间人攻击风险

⚠️ TLS证书问题往往在生产环境运行数月后才暴露,因为证书有效期通常是1年。建议在部署SDN时就把证书管理纳入运维体系:自动续期(certbot)、到期告警(30天/7天/1天三级告警)、证书仓库集中管理(Vault)。

⑥ 答疑区:3道选择题

【题目1】OpenFlow交换机收到数据包后,如果所有流表都不匹配,会执行什么动作?

A. 自动丢弃数据包B. 自动泛洪到所有端口C. 执行Table-Miss流表定义的动作(通常是上报控制器或丢弃)D. 查询本地ARP表转发

【答案】C

OpenFlow交换机从Table 0开始逐表匹配,如果所有表都不匹配,执行Table-Miss流表(优先级=0,匹配=ANY)定义的动作。默认动作通常是Send To Controller(上报Packet-In),但也可以配置为Drop或FLOOD。这是SDN"慢路径"的核心机制。

【题目2】SDN控制器集群中,为什么需要东西向接口(East-West Interface)?

A. 控制器和交换机之间的通信B. 上层应用和控制器的通信C. 控制器节点之间的状态同步和集群协调D. 控制器和外部Internet的通信

【答案】C

东西向接口用于控制器节点之间的通信。在多节点集群中,各控制器需要同步网络拓扑状态、流表信息、会话状态,确保任何节点故障时其他节点能无缝接管。ONOS用Raft协议做东西向同步,OpenDaylight用Akka集群通信。南北向接口分别对应控制器-交换机(南向)和应用-控制器(北向)。

【题目3】OpenFlow流表中的Cookie字段有什么作用?

A. 用于交换机转发决策(匹配条件之一)B. 用于控制器标识和管理流表,不参与转发C. 用于加密数据包D. 用于计算CRC校验

【答案】B

Cookie是64位标识符,由控制器分配,只用于控制器端的流表管理(如批量删除、筛选、统计),不参与交换机的转发匹配。例如控制器可以给负载均衡App的流表分配Cookie=0x1,防火墙App分配Cookie=0x2,后续通过Cookie快速操作特定App的流表,而不会影响其他流表。

��资源工具及链接

工具/资源

用途

获取方式

Mininet

SDN网络仿真(模拟交换机/主机/链路)

mininet.org

Ryu控制器

Python轻量级SDN控制器

ryu-sdn.org

ONOS

大型生产级SDN控制器(Java)

opennetworking.org/onos

OpenDaylight

模块化企业级SDN控制器

opendaylight.org

Wireshark + OpenFlow插件

抓包分析OpenFlow消息

wireshark.org

OpenFlow 1.3.5标准

协议规范原文

opennetworking.org/software-defined-standards/

��工程师手记

SDN不是"万能药",它是网络架构的一种选择,有巨大优势,也有明显代价。SDN的核心价值在于"可编程性"和"全局视图"。传统网络中,每台设备独立决策,策略分散在数百台设备的配置中,变更一次需要逐台登录修改。SDN把策略集中到控制器,应用通过API一键下发全网,这是运维效率的质变。SDN的代价是"控制集中化带来的单点风险"。控制器宕机、网络分区(控制器与交换机之间的链路中断)、控制器性能瓶颈(Packet-In洪泛),都是传统网络不存在的故障维度。部署SDN时,必须把这些风险纳入设计。SDN vs 传统网络的适用边界:• 小型网络(<50台设备):传统网络足够,SDN的复杂度不划算。• 中型数据中心(50-500台设备):SDN开始显现价值,特别是云网场景(OpenStack Neutron + OVS)。• 大型数据中心/运营商(>500台设备):必须用SDN,但必须是生产级控制器(ONOS/OpenDaylight集群),不能是单节点Ryu。• 广域网/骨干网:SD-WAN是SDN的变体,用集中控制器管理分支机构的CPE设备,但骨干网仍依赖传统BGP/IS-IS(控制器做策略编排,不替代路由协议)。选型建议:• 学习实验:Ryu + Mininet,1小时搭好环境,Python写App极简单。• 校园网/企业网:Floodlight或OpenDaylight,REST API丰富,文档完善。• 大型数据中心:ONOS集群(3+节点),支持OpenFlow/NETCONF/P4Runtime多南向协议。• 云厂商/运营商:自研控制器(如阿里云洛神、腾讯云TCS),基于ONOS/OpenDaylight二次开发。配置checklist:1. 控制器集群部署(至少3节点,Raft/Akka共识同步)2. 交换机fail_mode配置(standalone或secure+NORMAL备用)3. Table-Miss流表配置(Send To Controller + 备用动作)4. OpenFlow over TLS(证书有效期监控、自动续期)5. Packet-In限速(防止控制器被洪泛)6. 流表超时策略(Idle Timeout防止流表无限增长)7. 控制器性能监控(CPU/内存/Packet-In处理延迟)8. 南北向API认证(REST API Token/OAuth,防止未授权访问)9. 网络分区逃生(控制器与交换机链路中断时的应急策略)10. 定期备份控制器数据库(拓扑、流表、策略配置)最后提醒:SDN的"软件定义"不是"软件取代硬件"。OpenFlow交换机仍然需要高性能转发芯片(ASIC/FPGA),控制器只是"大脑",转发仍然依赖"肌肉"。不要指望用纯软件转发(如Linux内核bridge)支撑大规模SDN,性能会惨不忍睹。SDN是"智能调度",不是"替代硬件"。

��下期预告

42期《ERPS:电信级环网保护》—— RPL Owner/Neighbor角色、APS帧结构与交互流程、小于50ms切换原理、回切模式 vs 非回切模式、多环互联与子环。ERPS是运营商接入环网的标配保护协议。

��往期索引

• 第1-28期:硬件基础阶段(CPU/内存/硬盘/主板/组装)• 第29期:以太网帧结构深度拆解• 第30期:MAC地址与交换机工作原理• 第31期:广播风暴与环路排查• 第32期:ARP协议与ARP欺骗攻防• 第33期:VLAN虚拟局域网• 第34期:STP/RSTP/MSTP生成树• 第35期:VLAN间路由与三层交换• 第36期:链路聚合LACP• 第37期:端口安全与802.1X认证• 第38期:VXLAN跨越三层的大二层• 第39期:MPLS标签交换与VPN• 第40期:EVPN与SR-MPLS现代数据中心• ← 本期:第41期 SDN:软件定义网络实战

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