《Linux网络编程》吃透 Linux 网络传输全流程:完整梳理局域网通信、封装解包与跨网络传输原理

📅 2026/8/20 10:10:37
《Linux网络编程》吃透 Linux 网络传输全流程:完整梳理局域网通信、封装解包与跨网络传输原理
小叶-duck个人主页❄️个人专栏《Data-Structure-Learning》《C入门到进阶自我学习过程记录》《Linux系统从入门到实践》《Linux网络从入门到实践》《Qt 方寸极境》 《MySQL》✨未择之路不须回头已择之路纵是荆棘遍野亦作花海遨游前言Linux C/C 后端开发日常离不开网络开发与故障排查但很多开发者仅停留在调用 Socket API 的层面心中存有不少底层疑问MAC 地址已经能够标识设备为什么还需要 IP 地址调用send()发送的数据如何经由交换机、路由器送达对端程序局域网通信与跨网段转发依靠什么机制实现不少资料零散讲解概念割裂以太网、报文封装、路由转发完整链路。很多线上网络故障本质就是不理解底层传输流程。本文循序渐进梳理 MAC 地址与 IP 地址定位讲解以太网原理完整拆解局域网封装解包流程结合协议栈与 Linux 内核实现介绍跨网段路由转发逻辑文末整理面试高频考点。一、网络通信两大基石IP 地址与 MAC 地址网络通信的本质是将数据从一台主机的进程准确交付至另一台主机的进程。想要完成这件事我们需要两套核心标识分别解决两大寻址问题局域网内部如何定位设备以及整个互联网范围内如何定位主机。1.1 MAC 地址设备在局域网内的唯一标识MAC 地址全称媒体访问控制地址Media Access Control Address属于数据链路层的核心概念作用是标识同一个局域网内互相连通的网络节点。核心特性长度与格式固定占用 48 比特6 字节通常用十六进制加冒号的格式展示示例08:00:27:03:fb:19。唯一性物理网卡出厂时就固化写入硬件理论上全球唯一。虚拟机使用虚拟 MAC存在冲突可能性部分实体网卡支持软件方式修改 MAC 地址。作用范围寻址能力仅局限于局域网。核心职责完成局域网内相邻设备之间的精准寻址。查看方式Windows 系统在 cmd 中执行ipconfig /all即可看到网卡的物理地址MAC 地址​ Linux 系统执行ifconfig或ip addrether 字段后即为 MAC 地址。 ​以太网的核心通信规则以太网存在一条基础约束同一时刻共享链路上只允许一台主机向外发送数据。若多台主机同时传输数据线路中的电 / 光信号会相互干扰产生数据碰撞冲突后的帧会失效、无法正常接收。为此以太网依靠CSMA/CD机制完成冲突检测与规避规则如下发送报文前先侦听信道信道空闲时才允许发起传输数据发送期间持续监测线路状态一旦检测到碰撞立刻终止发送等待一段随机时长后重新尝试在无交换机隔离的环境中整个以太网属于同一个碰撞域。1.2 IP 地址主机在互联网层面的寻址标识IP 地址是IP 协议用于区分网络内各主机的标识属于网络层核心概念下文讨论默认以 IPv4 为主。这张图很重要是作为后面讲解跨网络传输的关键会详细分析这张图下面一部分具体在干什么。核心特性长度与格式IPv4 地址占用 4 字节32 比特日常采用点分十进制格式书写典型示例192.168.0.1被点分隔的每一段对应一个字节取值区间为 0~255。唯一性公网环境下IP 地址能够唯一标识一台主机局域网内部依靠私有 IP 地址网段实现内网设备区分。核心作用承担全网地址管理与路由决策工作为数据从源主机转发至目标主机提供路径依据同时可以屏蔽底层不同网络架构的差异。理解IP 地址工作在网络层具备跨网段通信能力。不管两端底层是以太网、令牌环或是其他链路IP 协议都可以完成互通由路由器负责不同网络之间的数据转发。(后续跨网络传输会举例详细进行讲解)IP 地址一串数字如何实现路径选择与主机定位我们可以借用学号辅助理解依靠学号能够定位校内学生是因为学号具备编码规则不同字段依次代表学院、班级等信息。同理网络中依靠 IP 地址寻址目标主机也是基于一套标准化的地址编码体系。IP 地址分为源 IP 地址与目标 IP 地址相关细节后续展开。学号能够精准找到学生依托于学校完善的信息管理体系想要吃透 IP 寻址原理同样需要了解网络运营商底层的网络规划与基础设施架构。1.3 MAC 地址与 IP 地址核心作用与本质差异这是计算机网络的重要基础知识同时也是面试高频考察点下面结合对比表格与生活化类比把二者的区别梳理清楚。特性MAC 地址IP 地址所属层级数据链路层网络层核心功能用于局域网内部相邻设备的定位寻址实现全网主机标识支撑路由转发决策长度与格式6 字节48bit采用十六进制冒号分隔表示4 字节32bit使用点分十进制格式可修改特性网卡出厂固化硬件层面理论上不可更改支持手动配置或者 DHCP 动态分配会跟随所处网络环境发生改变转发时的变化特点数据包每经过一次路由器转发源 MAC 与目标 MAC 就会被重新改写端到端完整传输流程里源 IP、目标 IP 始终保持不变通俗类比目标 IP 地址等同于快递单上的最终收货地址XX 省 XX 市 XX 小区 XX 房间代表数据包最终要抵达的终点全程传输过程不会变动。目标 MAC 地址相当于快递的下一站转运站点地址每抵达一处中转节点就会更新仅负责当前这一段链路的数据交付。IP 地址负责全局路径规划MAC 地址承担局域网逐跳转发的任务两者相互配合共同完成数据从源主机发送到目标主机的完整通信流程。二、概念补充换个视角理解局域网与以太网2.1 转变思维重新认识局域网以太网属于典型的共享资源介质同一时间内共享信道只允许一台主机占用发送数据。站在系统编程角度来看这本质上就是互斥与同步问题只是并没有采用锁的实现思路。局域网发展史上存在两套经典介质访问方案以太网与令牌环网。做一个形象类比以太网 (Ethernet) 如同多人共处一间房间大家可以自由发言可如果吵起来所有人都无法听到对方说了什么所以一旦出现说话冲突就暂停等待对应 CSMA/CD 机制令牌环网 (Token Ring) 则是所有人围成一圈只有拿到麦克风令牌的人才拥有发言资格。我们作为学习 Linux 内核、网络编程的开发者弄懂二者的差异不光是夯实网络基础更是理解介质访问控制MAC逻辑的重要切入点。令牌本质上就是一种临界资源作用等价于我们常说的锁。从内核与底层开发视角分析驱动层面实现Linux 内核中以太网驱动 net/ethernet 处理高度异步化令牌环网技术现已淘汰内核源码 net/802/tr.c 保留历史实现它依靠定时器与状态机维护令牌流转。确定性延迟诉求以太网取得商业市场的主导地位但工业实时场景例如 EtherCAT、车载通信协议依旧能够看到令牌、时间片分配的设计思想这类业务对稳定可预测的延迟有硬性要求恰好是令牌机制的优势。2.2 再次剖析 MAC 地址(巩固核心概念)网络通信的发起源头通常来自上层用户业务由应用层向下驱动整套协议栈工作。自上而下沿协议栈完成数据下发。数据链路层处于整个协议栈的底层。网卡属于计算机外部硬件设备负责把链路的数据搬运至内存也可以把内存的数据向外发送。自底向上数据逐层回传交付给上层用户。发送报文时用户数据会逐层交给下层协议处理。协议栈每一层都会附加属于本层的头部信息。 沿用之前快递的类比我们最终拿到的包裹除本身货物之外还附带快递面单各类协议报头就相当于一张张快递面单。封装操作从编程视角理解就是将对应协议的结构体拷贝到数据缓冲区的头部位置。 整套封装流程就是自上而下逐层打包的过程。统一精准化表述名词在应用层把报文(报头 有效载荷)叫做请求与应答在传输层把报文叫做数据段在网络层把报文叫做数据报在链路层把报文叫做数据帧三、局域网数据传输原理数据封装与解包全过程处于同一局域网内的两台主机互相通信是网络数据传输的基础整个流程的核心就是发送端的数据封装以及接收端的解包、分用操作。3.1 预备知识厘清 3 个关键基础概念借助寄快递的生活实例可以快速理解这一组基础概念这也是学习数据传输流程的重要基石。报文 协议报头 有效载荷有效载荷等同于想要寄出的货品代表业务真正要传输的核心数据例如一段文本内容。报头类比快递面单由各层协议追加的控制信息组成里面存放目标地址、源地址、上层协议类型、数据长度等控制字段。报文相当于完整快递包裹面单 货品是每一层协议实际交互的数据单元。不同协议层级数据单元拥有专属命名传输层数据单元称为段 (segment)代表 TCP 段、UDP 段网络层数据单元称为数据报 (datagram)代表 IP 数据报数据链路层数据单元称为帧 (frame)代表以太网帧。封装、解包与分用封装发送数据阶段数据自上向下流转从应用层一路传递至物理层。每经过一层协议就追加该层对应的协议头部最终组装成以太网帧交由物理介质完成发送。解包接收数据阶段数据自底层向上递交从物理层流向应用层。每经过一层协议就剥离当前层的协议报头依据头部信息把内容交付上层协议。分用属于解包流程里的关键步骤依靠报头内的上层协议字段把数据精准分发到对应的上层协议去处理。3.2 发送端视角完整的数据封装流程下图为数据封装的过程我们以同一局域网内主机 A 向主机 B 发送消息 “你好” 作为示例完整拆解自上而下的封装过程每一步都对应 TCP/IP 五层模型的实际操作。第一步应用层封装主机 A 上的聊天程序生成业务数据 “你好”。应用层协议(无论是 HTTP 还是自定义通信协议)会为数据拼接应用层头部组装成应用层报文向下递交至传输层。应用层报头存放业务相关控制信息包含消息类别、发送方标识、消息长度等由开发者自定义或者遵循标准协议规范。第二步传输层封装传输层TCP/UDP接收应用层报文追加 TCP 或者 UDP 头部生成传输段交给网络层。这里参考 Linux 内核 tcphdr 结构体解读 TCP 头部关键字段// Linux内核中TCP协议报头的结构体定义 struct tcphdr { __be16 source; // 16位源端口号标识发送端进程 __be16 dest; // 16位目的端口号标识接收端进程 __be32 seq; // 32位序列号保证数据按序传输 __be32 ack_seq; // 32位确认序列号实现可靠传输的确认应答 #if defined(__LITTLE_ENDIAN_BITFIELD) __u16 res1:4, // 保留位 doff:4, // 数据偏移TCP报头长度 fin:1, // 关闭连接标志 syn:1, // 建立连接标志 rst:1, // 重置连接标志 psh:1, // 推送标志 ack:1, // 确认标志 urg:1, // 紧急指针标志 ece:1, // 拥塞通知标志 cwr:1; // 拥塞窗口缩减标志 #elif defined(__BIG_ENDIAN_BITFIELD) __u16 doff:4, res1:4, cwr:1, ece:1, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1; #endif __be16 window; // 16位窗口大小实现流量控制 __sum16 check; // 16位校验和校验数据是否损坏 __be16 urg_ptr; // 16位紧急指针标识紧急数据的位置 };source、dest16 位源端口与目的端口用来定位本机内部进程是数据能够交付到对应应用程序的关键。seq、ack_seq序列号、确认序列号保障 TCP 数据有序、可靠传输。标志位syn、ack、fin等管控 TCP 连接建立、断开与状态流转。window滑动窗口大小做流量控制告知对方本机接收缓冲区上限防止接收溢出。check校验和接收端用来判断报文传输是否发生损坏。第三步网络层封装网络层 IP 协议拿到传输层段添加 IP 头部生成 IP 数据报下发给数据链路层。结合 Linux 内核 iphdr 结构体分析 IP 头部关键字段// Linux内核中IPv4协议报头的结构体定义 struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 version:4, // 4位版本号IPv4填4IPv6填6 ihl:4; // 4位首部长度IP报头的长度 #elif defined(__BIG_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #endif __u8 tos; // 8位服务类型定义数据的优先级、QoS特性 __be16 tot_len; // 16位总长度IP数据报的总长度报头载荷 __be16 id; // 16位标识唯一标识每个IP数据报用于分片重组 __be16 frag_off; // 16位分片偏移标识分片在原始报文中的位置 __u8 ttl; // 8位生存时间数据报的最大跳数每经过一个路由器减1 __u8 protocol; // 8位上层协议号标识载荷交给哪个上层协议6TCP17UDP __sum16 check; // 16位首部校验和校验IP报头是否损坏 __be32 saddr; // 32位源IP地址发送端主机IP __be32 daddr; // 32位目的IP地址接收端主机IP };version、ihlIP 协议版本号、头部长度是解析 IP 报文的基础。saddr、daddr(关键字段)源 IP、目标 IP端到端通信标识全程传输保持不变。protocol上层协议标识告诉内核该交给 TCP 还是 UDP 处理。ttl生存时间防止数据包在网络环路里无限转发。tot_len、id、frag_off用于 IP 分片与重组适配链路 MTU 最大传输单元限制。第四步数据链路层封装以太网协议接收 IP 数据报拼接以太网头部与 FCS 尾部生成完整以太网帧递交物理层。以太网帧的核心结构字段长度 (字节)目的 MAC 地址6源 MAC 地址6类型 / 长度2数据46‑1500FCS 帧校验序列4关键字段解读源 MAC、目的 MAC局域网二层寻址依据接收主机依靠目的 MAC 判断帧是否属于本机。类型字段2 字节上层协议区分0x0800代表 IP 报文0x0806代表 ARP 报文。数据域46‑1500 字节承载上层 IP 数据报。FCS 帧校验循环冗余校验检测帧传输过程是否出错。第五步物理层发送物理层拿到以太网帧把二进制数据转换成光电信号经由网线、WiFi 这类物理介质送入局域网完成发送。3.3 局域网内报文广播机制与主机接收逻辑以太网属于广播式网络主机 A 发出的以太网帧会广播传递给当前局域网当中的全部主机。每一台主机的网卡拿到帧之后优先读取以太网帧头部里的目标 MAC 地址做判断倘若目标 MAC 与本机网卡 MAC 不一致网卡直接丢弃该帧上层操作系统内核、应用程序完全不会收到这条报文。倘若目标 MAC 和本机网卡 MAC 相吻合网卡把以太网帧上交内核的数据链路层模块正式开启后续的解包与分用处理流程。3.4 接收端视角完整的数据解包与分用流程主机 B 收到目标 MAC 匹配的以太网帧之后开始自底向上执行解包、分用操作。整个流程和发送端封装互为逆过程核心逻辑就是逐层剥离头部精准分用交付上层。第一步数据链路层解包与分用数据链路层剥离以太网头部以及 FCS 帧尾读取帧头部的类型字段判断上层对应的协议类型字段值为0x0800代表载荷是 IP 数据报把有效数据上交网络层 IP 协议模块。类型字段值为0x0806代表载荷为 ARP 报文交由 ARP 协议做处理。第二步网络层解包分用网络层去掉 IP 头部先校验 IP 头部校验和确认头部没有发生传输损坏接着核对报文的目标 IP 是否为本机 IP。校验失败或者目标 IP 与本机不匹配直接丢弃该报文。校验通过且 IP 地址匹配成功读取 IP 头部 protocol 字段识别上层协议字段等于6载荷是 TCP 段递交传输层 TCP 协议。字段等于17载荷是 UDP 段递交传输层 UDP 协议。第三步传输层解包分用传输层剥离 TCP/UDP 头部完成校验确认数据完好。依据头部内部的目的端口号定位本机上监听该端口的应用进程把去掉传输层头部后的应用数据交付给对应进程。第四步应用层处理应用程序拿到传输层递交过来的业务数据 “你好”至此一次局域网两台主机之间完整通信完成。核心知识点逻辑层面同层协议之间仿佛直接通信。主机 A 的 TCP 层逻辑上认为直接和主机 B 的 TCP 层对话主机 A 的 IP 层逻辑上认为直接和主机 B 的 IP 层交互。物理层面数据需要一层层封装、解包分层架构屏蔽底层传输细节每一层只需要聚焦自身职责。3.5 图文深度解析网络协议栈工作原理3.6 Linux 内核视角数据封装底层实现原理Linux 内核管理网络数据包全部依托核心结构体 sk_buffSocket Buffer。协议封装本质上只是操作 sk_buff 内部指针并不做内存拷贝这是 Linux 网络子系统高性能的关键所在。下面通过内核伪代码展示 IP 头部封装的核心逻辑// 内核封装IP报头的核心伪代码 struct sk_buff *skb; // 内核中的数据包管理结构体 struct iphdr *iph; // 1. 指针前移预留IP报头的空间skb_push返回新的指针位置 iph (struct iphdr *)skb_push(skb, sizeof(struct iphdr)); // 2. 填充IP报头的各个字段也就是填写快递面单 iph-version 4; // IPv4协议 iph-ihl 5; // 报头长度20字节 iph-tos 0; // 普通服务类型 iph-tot_len htons(skb-len); // 总长度转换为网络字节序 iph-id htons(atomic_inc_return(ip_id_counter)); // 唯一标识 iph-frag_off 0; // 不分片 iph-ttl 64; // 默认生存时间64跳 iph-protocol IPPROTO_TCP; // 上层协议为TCP iph-saddr source_ip; // 源IP地址 iph-daddr dest_ip; // 目标IP地址 iph-check 0; // 先清零后续计算校验和 iph-check ip_fast_csum((unsigned char *)iph, iph-ihl); // 计算校验和代码要点解析skb_push内核封装的核心函数将数据包头部指针向低地址移动开辟出协议头部所需内存空间全程不拷贝数据性能开销很小。填充头部字段等价于给协议结构体成员赋值类比 “填写快递面单”把版本、源目 IP、TTL 等信息写入头部。字节序转换大于 1 字节的字段例如tot_len、id必须调用htons/htonl转成大端网络字节序保证不同 CPU 架构主机可以正常解析报文。校验和运算供接收端校验报文完整性是网络传输可靠性的基础保障。解包流程和封装互为逆操作调用skb_pull把指针向高地址移动剥离对应协议头部读取头部字段执行分用交付上层协议处理。四、跨网络通信原理路由机制与逐跳转发4.1 路由器承担的核心职责路由器属于网络层设备具备两大核心能力路由选择依靠路由表为 IP 数据报规划从源主机抵达目标主机的传输路径。分组转发接收 IP 数据报查询路由表将报文转发给下一跳对应的设备。通俗来讲路由器就相当于互联网的快递转运中心负责把数据报文从一个局域网转发至另一个局域网最终送达目标主机所处网络。4.2 跨网络数据传输的完整流程我们以源主机 AIP192.168.2.2MACMacA向跨网段目标主机 BIP172.168.2.2MACMacB发送数据为例拆解完整跨网络传输流程。第一步源主机判断目标网段确定下一跳主机 A网络层结合子网掩码做判断目标 IP172.168.2.2和本机不属于同一局域网报文交给默认网关路由器。主机 A 借助 ARP 协议拿到网关入接口 MAC地址 MacLeft完成报文封装IP 头部源 IP192.168.2.2目标 IP172.168.2.2全程不会改动以太网帧头部源 MACMacA目标 MACMacLeft路由器入接口 MAC第二步路由器接收数据解包并查询路由表路由器收到以太网帧执行解包处理数据链路层剥离以太网帧头读取类型字段把 IP 数据报上交网络层。网络层读取 IP 头部目标 IP查询本机路由表定位去往172.168.2.0网段的下一跳选定转发出接口。将 IP 头部 TTL 字段减一TTL 递减至 0 则直接丢弃报文杜绝报文无限循环转发。第三步路由器重新封装转发数据确定下一跳之后路由器重新做数据链路层封装IP 头部源 IP、目的 IP 维持原样仅修改 TTL 字段。以太网帧头部源 MAC MacRight路由器出接口 MAC目标 MAC MacB目标主机 B 的 MAC。封装完毕将全新以太网帧投递到主机 B 所在局域网。第四步目标主机接收数据解包分用主机 B 收到以太网帧校验目标 MAC 匹配成功自底向上逐层解包、分用最终把业务数据交付对应应用进程一次跨网络通信就此完成。关键细节倘若通信路径中存在多台路由器每经过一台路由器都会重复「解包 → 路由查表 → 重新封装」这套流程。源 IP、目标 IP 自始至终不变源 MAC、目标 MAC每一跳都会替换成当前链路两端设备的 MAC。4.3 网络层 IP 协议的价值与全网通信宏观模型IP 网络层为整个互联网构建起一套统一的网络虚拟层屏蔽各类底层网络硬件带来的差异。不管底层是以太网、令牌环网、光纤网络亦或是 WiFi 无线网络即便物理介质、数据链路层协议之间差别巨大只要设备实现 IP 协议彼此之间就可以完成互联互通。这正是互联网能够串联全球数十亿台设备的底层核心逻辑IP 协议制定了全网统一通信规范路由技术保障数据可以在全球范围内完成精准转发。五、高频面试核心要点汇总MAC 地址与 IP 地址的区别所属协议层级、承担的核心功能、报文传输途中的变化规律以及生活化类比理解。MAC 属于数据链路层是硬件物理地址固化在网卡IP 属于网络层逻辑寻址地址可修改。跨网络传输时IP 全程不变MAC 每跳都会更新。类比IP 相当于收件人省市地址MAC 相当于每一段路上的交接人。数据封装和解包完整流程TCP/IP 五层模型每层新增报头的关键字段解包之后向上分用交付的判断逻辑。发送自上而下应用层→传输层TCP/UDP 头部→网络层IP 头部→数据链路层以太网帧头。接收自下而上逐层剥离头部依靠各层标识字段向上交付上层协议这个过程叫分用。以太网帧关键结构源、目的 MAC 地址类型字段承担的功能MTU 的概念与实际意义。源 / 目的 MAC链路层两端设备硬件地址用于局域网内定位类型字段标识上层是什么协议IPv4/ARP用于解包分用MTU最大传输单元代表一帧能够承载的数据最大字节数超过会触发 IP 分片。IP 报头、TCP 报头核心字段端口、序列号、确认号、源 / 目的 IP、协议号、TTL 等字段各自作用。IP 报头源 / 目标 IP 寻址协议号标记上层是 TCP 还是 UDPTTL 限制报文最大跳数防止环路。TCP 报头源 / 目的端口定位本机进程序列号保证字节顺序确认号实现应答确认。局域网通信底层原理CSMA/CD 工作机制、碰撞域概念、广播帧发送与主机接收过滤逻辑。CSMA/CD以太网载波监听冲突检测发送前侦听冲突后退避重发碰撞域同一时间只能有一台设备发送数据的网络范围广播帧目的 MAC 为全 F局域网所有主机接收主机匹配目标 MAC不匹配直接丢弃帧。跨网段通信完整流程路由器两大核心能力逐跳转发完整过程路由转发时 IP、MAC 地址的变化规则。路由器工作在网络层完成路由选择 分组转发。收到帧解包读取 IP查路由表确定下一跳TTL‑1重新封装二层帧转发。规律源 IP、目的 IP 全程不变源 MAC、目的 MAC 每跳重写。分用机制核心原理以太网 type 字段、IP 内部协议号、TCP/UDP 端口号三层分用标识分别起到什么作用。以太网类型字段告诉内核上层是 IP 还是 ARPIP 头部协议号告诉内核上层是 TCP 还是 UDPTCP/UDP 端口号把数据交给本机对应的应用进程。 三层标识层层筛选最终把数据交付给正确上层。Linux 内核sk_buff核心作用skb_push、skb_pull函数在报文封装、解包环节的工作原理。sk_buff是内核管理网络报文的缓冲区结构体。skb_push向前挪动指针添加报文头部对应封装skb_pull向后挪动指针剥掉报文头部对应解包 内核不需要拷贝数据依靠指针偏移完成报头增删性能很高。结束语到这里本篇关于 MAC 地址、IP 地址以及局域网通信、跨网段路由转发的内容就全部讲解完毕。我们从以太网基础概念入手沿着数据封装、报文传输、解封装、路由逐跳转发这条主线完整梳理了主机之间通信的底层逻辑同时结合 Linux 内核视角窥探了协议栈的底层实现。很多人容易混淆 MAC 地址与 IP 地址的分工只要记住核心结论MAC 负责局域网内相邻节点寻址IP 负责跨网段端到端寻址再结合封装解包、路由转发的流程串联理解就能理清绝大多数网络基础问题。