第1章:网络协议栈基础
大家好,我是你们的老朋友。今天咱们聊聊网络协议栈。
说实话,我刚开始接触鸿蒙系统开发时,最头疼的就是网络这块。你想想看,一个设备要跟另一个设备通信,中间要经过多少层?数据怎么打包?怎么保证不丢包?这些问题,说白了都得靠协议栈来解决。
1.1 OSI七层模型:理论上的完美蓝图
OSI七层模型,是国际标准化组织搞出来的。我当年在学校学这个的时候,觉得这东西太抽象了。直到后来做项目,才发现它其实是个很好的思考框架。
七层模型长这样:
| 层级 | 名称 | 核心功能 | 常见协议/设备 |
|---|---|---|---|
| 7 | 应用层 | 用户直接交互的接口 | HTTP、FTP、SMTP |
| 6 | 表示层 | 数据格式转换、加密解密 | SSL/TLS、JPEG、ASCII |
| 5 | 会话层 | 建立、管理、终止会话 | NetBIOS、RPC |
| 4 | 传输层 | 端到端可靠传输 | TCP、UDP |
| 3 | 网络层 | 路由选择、逻辑寻址 | IP、ICMP、ARP |
| 2 | 数据链路层 | 帧封装、物理寻址 | 以太网、PPP、MAC地址 |
| 1 | 物理层 | 比特流传输 | 网线、光纤、集线器 |
每层只关心自己的事。下层为上层服务,上层不用管下层怎么实现的。这就是分层的好处——各司其职。
我的经验:在实际开发中,你很少需要关心物理层和表示层。但传输层和网络层,你躲不开。尤其是TCP和IP,几乎是所有网络应用的基础。
1.2 TCP/IP四层模型:工业界的实战派
OSI七层模型虽然好,但太复杂了。工业界更喜欢TCP/IP四层模型。说白了,它就是OSI的简化版。
四层模型是这样的:
- 应用层:对应OSI的应用层+表示层+会话层。HTTP、DNS、DHCP都在这里。
- 传输层:和OSI一样。TCP保证可靠,UDP追求速度。
- 网络层:核心是IP协议。负责把数据包从源地址送到目的地址。
- 网络接口层:对应OSI的数据链路层+物理层。驱动、网卡都在这一层。
我刚开始做嵌入式开发时,经常搞混TCP和UDP的区别。后来我总结了一句话:TCP是打电话,UDP是发广播。打电话要建立连接、确认对方在听、说完了还要挂断。发广播嘛,喊一嗓子就行,至于谁听到了、听没听全,不管。
避坑指南:我曾经在一个物联网项目里,用UDP传控制指令。结果设备经常收不到指令,或者收到重复的指令。后来改成TCP,问题就解决了。所以,关键数据用TCP,实时数据用UDP,这个原则要记住。
1.3 鸿蒙网络协议栈架构
鸿蒙的网络协议栈,不是从零造的。它基于Linux内核的网络栈,但做了很多优化。我拆开看过源码,结构挺清晰的。
鸿蒙协议栈的架构分三层:
- 内核态协议栈:TCP/IP核心实现,在Linux内核里跑。负责数据包的收发、路由、过滤。
- 用户态协议栈:鸿蒙特有的。像LwIP这种轻量级协议栈,可以在用户态跑。适合资源受限的设备。
- 协议栈适配层:连接内核态和用户态的桥梁。提供统一的接口给上层应用调用。
为什么要搞用户态协议栈?我举个例子。你有个智能灯泡,内存只有几百KB。跑完整的Linux内核协议栈?太奢侈了。这时候用LwIP,轻量、高效,刚刚好。
核心要点:鸿蒙的协议栈设计,遵循的是「按需加载」原则。大设备用完整栈,小设备用轻量栈。同一个API接口,底层实现可以不同。这就是鸿蒙的分布式能力在协议栈层面的体现。
1.4 协议栈核心组件
协议栈里有哪些核心组件?我挑几个重要的说说。
1.4.1 Socket层
Socket是应用层和传输层之间的接口。你写网络程序,本质上就是在操作Socket。鸿蒙的Socket接口兼容POSIX标准,所以Linux上的网络代码,基本可以直接移植过来。
// 鸿蒙上创建一个TCP Socket的示例
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
// 处理错误
printf("socket创建失败\n");
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = inet_addr("192.168.1.100");
connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));
1.4.2 TCP/IP协议族
这是协议栈的核心。TCP负责可靠传输,IP负责路由寻址。还有ICMP(ping命令用的)、ARP(IP转MAC地址)等辅助协议。
我记得有一次排查网络问题,发现设备能ping通网关,但就是连不上服务器。后来抓包一看,是ARP缓存出了问题。设备记住了错误的MAC地址。清一下缓存就好了。这种问题,不懂协议栈底层,根本想不到。
1.4.3 网络设备管理层
管理网卡、Wi-Fi模块、蜂窝模块等物理设备。鸿蒙支持多网络同时存在,比如Wi-Fi和4G同时在线。协议栈会根据策略选择最优路径。
1.4.4 安全组件
包括IPSec、TLS/SSL等。我建议你在做产品时,默认开启TLS加密。不要觉得麻烦。我曾经见过一个智能家居项目,所有数据明文传输。结果被黑客截获了用户的Wi-Fi密码。嗯,后果很严重。
注意事项:鸿蒙协议栈默认不开启所有安全特性。你需要根据产品需求,手动配置加密策略。尤其是物联网设备,安全是底线,不是可选项。
1.5 小结
这一章我们聊了OSI七层模型和TCP/IP四层模型,也看了鸿蒙协议栈的架构和核心组件。说白了,协议栈就是一套规则。大家按规则办事,数据才能准确送达。
下一章,我会带大家深入Socket编程。咱们手写一个简单的TCP客户端和服务器。到时候你会发现,理解了协议栈,写网络代码就像喝水一样简单。
好,今天就到这里。有问题随时交流。
公众号:蓝海资料掘金营,微信deep3321