从零写 OS 内核-第三十五篇:TCP/IP 协议栈 —— 用 socket GET 百度首页!

“网卡驱动只是硬件接口,真正的网络能力在于协议栈。 今天,我们实现精简 TCP/IP 栈,并用用户态程序下载百度首页!”

在上一篇中,我们完成了 e1000 网卡驱动 + PCIe 支持 , 能发送原始以太网帧,但 无法处理高层协议 。

真正的网络应用需要 TCP/IP 协议栈 :

IP 层

:路由、分片
TCP 层

:可靠传输、流控、重传

今天,我们就来: ✅ 实现精简 IP/TCP 协议栈 ✅ 提供 BSD socket API ✅ 编写用户态 HTTP 客户端 ✅ GET 百度首页并保存到文件

让你的 OS 拥有 真正的互联网能力 !


🌐 一、协议栈架构设计

分层模型(自底向上):

关键设计原则:

精简

:仅支持 IPv4 + TCP(无 UDP/ICMP/ARP 缓存)
用户态友好

:提供标准
socket
/
connect
/
send
/
recv
单线程

:无并发连接(简化状态机)

💡 Linux 的 net/ipv4/ 是完整实现,我们做最小可用子集 !


📦 二、IP 层实现

  1. IP 头结构

  2. 发送 IP 包

⚠️ 为简化,IP 层不处理分片、路由表,MAC 地址用广播 !


🔁 三、TCP 层实现

  1. TCP 连接状态机

  2. TCP 控制块(TCB)

  3. 发送 TCP 段

  4. 处理接收到的 TCP 包

🔑 TCP 状态机简化:只支持主动连接(Client),无监听(Server) !


📞 四、BSD Socket API

  1. 系统调用

🌍 五、用户态 HTTP 客户端

  1. GET 请求封装

  2. 主程序


🧪 六、测试:下载百度首页

  1. QEMU 启动

💡 hostfwd 将 QEMU 80 端口映射到主机 8080,但百度需直连外网 确保 QEMU 有互联网访问权限 !

  1. 运行效果

✅ 成功通过 TCP GET 百度首页 !


⚠️ 七、简化与局限

  1. 无 ARP

    :MAC 地址用广播(仅限同一子网)

  2. 无重传

    :丢包即失败

  3. 无拥塞控制

    :简单固定窗口

  4. 无 DNS

    :需硬编码 IP

  5. 单连接

    :不支持并发

💡 这些是教学实现的合理简化,工业级实现需补全 !


💬 写在最后

TCP/IP 协议栈是网络世界的 通用语言 。 它让不同设备能可靠通信, 构建了今天的互联网。

今天你实现的第一个 GET 请求, 正是无数网络应用的起点。

🌟 协议栈的意义,不在于代码,而在于连接世界 。


📬 动手挑战 : 添加 DNS 客户端,将 http_get(“www.baidu.com”, …) 改为自动解析 IP。 欢迎在评论区分享你的网络抓包分析!

👇 下一篇你想看: UDP 与 DHCP 客户端 ,还是 C 标准库(libc)实现 ?


#操作系统 #内核开发 #TCP /IP #网络协议栈 #socket #HTTP #从零开始

最后修改: 2026年7月1日

作者

评论

发表评论

您的邮箱地址不会被公开。