从零写 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 层实现
- IP 头结构
-
发送 IP 包
⚠️ 为简化,IP 层不处理分片、路由表,MAC 地址用广播 !
🔁 三、TCP 层实现
- TCP 连接状态机
-
TCP 控制块(TCB)
-
发送 TCP 段
-
处理接收到的 TCP 包
🔑 TCP 状态机简化:只支持主动连接(Client),无监听(Server) !
📞 四、BSD Socket API
- 系统调用
🌍 五、用户态 HTTP 客户端
- GET 请求封装
-
主程序
🧪 六、测试:下载百度首页
- QEMU 启动
💡 hostfwd 将 QEMU 80 端口映射到主机 8080,但百度需直连外网 确保 QEMU 有互联网访问权限 !
- 运行效果
✅ 成功通过 TCP GET 百度首页 !
⚠️ 七、简化与局限
- 无 ARP
:MAC 地址用广播(仅限同一子网)
-
无重传
:丢包即失败
-
无拥塞控制
:简单固定窗口
-
无 DNS
:需硬编码 IP
-
单连接
:不支持并发
💡 这些是教学实现的合理简化,工业级实现需补全 !
💬 写在最后
TCP/IP 协议栈是网络世界的 通用语言 。 它让不同设备能可靠通信, 构建了今天的互联网。
今天你实现的第一个 GET 请求, 正是无数网络应用的起点。
🌟 协议栈的意义,不在于代码,而在于连接世界 。
📬 动手挑战 : 添加 DNS 客户端,将 http_get(“www.baidu.com”, …) 改为自动解析 IP。 欢迎在评论区分享你的网络抓包分析!
👇 下一篇你想看: UDP 与 DHCP 客户端 ,还是 C 标准库(libc)实现 ?
#操作系统 #内核开发 #TCP /IP #网络协议栈 #socket #HTTP #从零开始
评论