独立内核原生网络前置
此项目实现自研 Ethernet、ARP、IPv4、UDP DNS、主动连接 TCP Stream 和 e1000 轮询 DMA 驱动。生产网络路径通过独立内核的真实 PCI、物理页和 uncached MMIO ABI;不调用宿主 socket,不使用宿主 HTTP 代理或缓存页。
当前支持范围为 QEMU -netdev user,id=NativeNet -device e1000,netdev=NativeNet 的 8086:100e 82540EM。e1000e、VirtIO 网卡和实体网卡尚未适配。地址显式配置为 10.0.2.15/24,网关 10.0.2.2,DNS 10.0.2.3;这是 QEMU 默认 user NAT 配置,不是 DHCP 验收。
应用入口为 XFESystem.NativeRuntime.Application.Network.NativeNetwork.ConfigureEntropy(Func<uint>) 与 OpenTcp(host, port, timeoutMilliseconds)。前者只安装平台真实强随机回调;缺失时拒绝联网。后者首次初始化 PCI/DMA,并返回真实 TCP 字节流,应始终由已有网络 worker 调用。这个字节流本身不提供 TLS 或证书验证,HTTPS 必须在其上接严格 TLS 库、可信 UTC 和根证书。
OpenTcp 从调用开始使用同一绝对单调时钟 deadline,包括网络 owner 等待、首次 PCI 发现、reset/link、ARP、DNS、SYN 和由收包触发的 ACK。IEthernetDevice.Send(frame, deadlineMilliseconds) 必须遵守调用者的绝对 deadline;e1000 的 DD 等待不会另开固定 500 ms 计时。返回后的 Stream 每次 Read/Write 各自使用配置的操作超时,所有内部轮询和 ACK 继承该次 deadline;HTTP/TLS 层仍须把每次操作超时限制到其全请求剩余时间。关闭使用 min(250ms, ReadTimeout, WriteTimeout) 的单个预算,包含 FIN 发送、DD 和 ACK;失败连接清理复用已消耗的原连接 deadline,不再额外等待。
协议边界:标准 1500 字节 MTU;IPv4 头、TCP/UDP 校验和;无碎片重组;DNS 仅 A/CNAME、匹配事务及问题,压缩解析有限步数,截断答案明确失败。单 owner 同时只保留一个主动 TCP 连接,64 KiB 接收窗口;累计 ACK,丢包有限重传,有限连接/读写超时;不协商 SACK、窗口缩放、ECN 或 TCP Fast Open。乱序数据丢弃并 ACK,等待对端真实重传;不是伪造或丢序字节流。暂未实现 DHCP、IPv6、ICMP、DNS TCP fallback、通用 POSIX socket 或任意网卡支持。
已建立连接先按真实 RCV.NXT/RCV.WND 校验 segment sequence,再接受 ACK 或发送窗口;窗口外同 tuple 的 ACK 不能完成 Write 或把窗口置零。发送窗口使用 SND.WL1/SND.WL2 顺序门槛,较早的可接受 segment 也不能倒退较新的窗口更新。
e1000 使用分别拥有物理地址的 RX/TX descriptor 页及缓冲区,处理 DD/EOP/错误位、环绕和 64 位 DMA 地址。IRQ 禁止仅覆盖短 PCI 配置事务及独立内核分配/映射;数据包等待通过现有线程睡眠让出执行。网卡停用并关闭 PCI bus mastering 后才回收 DMA 页。该设备唯一的 MMIO 映射保留在其生命期所在的独立内核虚拟 arena;目前没有热拔插/重复映射回收能力。
Tests/XFESystem.Network.Tests 的协议 peer 和 MMIO/DMA fixture 仅用于宿主测试。它们可以核对包格式、校验和、CNAME、重传、重复/乱序、RST、超时以及 descriptor 所有权;不能代替真实 QEMU 联网、TLS 握手、Bing DOM/像素或实体硬件验收。
协议参考:RFC 9293 TCP、RFC 1035 DNS、QEMU network emulation。设备寄存器行为参考 Intel 8254x 文档及 QEMU e1000 实现,本项目未复制该设备模型的实现代码。