第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内核的网络栈,但做了很多优化。我拆开看过源码,结构挺清晰的。

鸿蒙协议栈的架构分三层:

  1. 内核态协议栈:TCP/IP核心实现,在Linux内核里跑。负责数据包的收发、路由、过滤。
  2. 用户态协议栈:鸿蒙特有的。像LwIP这种轻量级协议栈,可以在用户态跑。适合资源受限的设备。
  3. 协议栈适配层:连接内核态和用户态的桥梁。提供统一的接口给上层应用调用。

为什么要搞用户态协议栈?我举个例子。你有个智能灯泡,内存只有几百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