《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 系统 :执行 ifconfigip addr,ether 字段后即为 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 头部关键字段:

cpp 复制代码
// 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位紧急指针:标识紧急数据的位置
};
  • sourcedest:16 位源端口与目的端口,用来定位本机内部进程,是数据能够交付到对应应用程序的关键。
  • seqack_seq:序列号、确认序列号,保障 TCP 数据有序、可靠传输。
  • 标志位:synackfin等,管控 TCP 连接建立、断开与状态流转。
  • window:滑动窗口大小,做流量控制,告知对方本机接收缓冲区上限,防止接收溢出。
  • check:校验和,接收端用来判断报文传输是否发生损坏。

第三步:网络层封装

网络层 IP 协议拿到传输层段,添加 IP 头部,生成 IP 数据报,下发给数据链路层。

结合 Linux 内核 iphdr 结构体分析 IP 头部关键字段:

cpp 复制代码
// Linux内核中IPv4协议报头的结构体定义
struct iphdr 
{
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u8    version:4,  // 4位版本号:IPv4填4,IPv6填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位上层协议号:标识载荷交给哪个上层协议(6=TCP,17=UDP)
    __sum16 check;      // 16位首部校验和:校验IP报头是否损坏
    __be32  saddr;      // 32位源IP地址:发送端主机IP
    __be32  daddr;      // 32位目的IP地址:接收端主机IP
};
  • versionihl:IP 协议版本号、头部长度,是解析 IP 报文的基础。
  • saddrdaddr(关键字段)源 IP、目标 IP ,端到端通信标识,全程传输保持不变
  • protocol:上层协议标识,告诉内核该交给 TCP 还是 UDP 处理。
  • ttl:生存时间,防止数据包在网络环路里无限转发。
  • tot_lenidfrag_off:用于 IP 分片与重组,适配链路 MTU 最大传输单元限制。

第四步:数据链路层封装

以太网协议接收 IP 数据报,拼接以太网头部与 FCS 尾部,生成完整以太网帧,递交物理层。

  • 以太网帧的核心结构
字段 长度 (字节)
目的 MAC 地址 6
源 MAC 地址 6
类型 / 长度 2
数据 46‑1500
FCS 帧校验序列 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_buff (Socket Buffer)。协议封装 本质上只是操作 sk_buff 内部指针 ,并不做内存拷贝,这是 Linux 网络子系统高性能的关键所在。

下面通过内核伪代码展示 IP 头部封装的核心逻辑:

cpp 复制代码
// 内核封装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_lenid,必须调用htons/htonl转成大端网络字节序,保证不同 CPU 架构主机可以正常解析报文。
  • 校验和运算:供接收端校验报文完整性,是网络传输可靠性的基础保障。

解包流程和封装互为逆操作:调用**skb_pull把指针向高地址移动**,剥离对应协议头部,读取头部字段,执行分用,交付上层协议处理。

四、跨网络通信原理:路由机制与逐跳转发

4.1 路由器承担的核心职责

路由器属于网络层设备,具备两大核心能力:

  • 路由选择:依靠路由表,为 IP 数据报规划从源主机抵达目标主机的传输路径。
  • 分组转发:接收 IP 数据报,查询路由表,将报文转发给下一跳对应的设备。

通俗来讲,路由器就相当于互联网的快递转运中心,负责把数据报文从一个局域网转发至另一个局域网,最终送达目标主机所处网络。

4.2 跨网络数据传输的完整流程

我们以源主机 A(IP:192.168.2.2,MAC:MacA),向跨网段目标主机 B(IP:172.168.2.2,MAC:MacB)发送数据为例,拆解完整跨网络传输流程。

第一步:源主机判断目标网段,确定下一跳

主机 A 网络层结合子网掩码 做判断,目标 IP 172.168.2.2 和本机不属于同一局域网 ,报文交给默认网关(路由器)。

主机 A 借助 ARP 协议拿到网关入接口 MAC地址 MacLeft,完成报文封装:

  • IP 头部:源 IP=192.168.2.2,目标 IP=172.168.2.2(全程不会改动
  • 以太网帧头部:源 MAC=MacA,目标 MAC=MacLeft(路由器入接口 MAC

第二步:路由器接收数据,解包并查询路由表

路由器收到以太网帧,执行解包处理

  1. 数据链路层剥离以太网帧头,读取类型字段,把 IP 数据报上交网络层。
  2. 网络层读取 IP 头部目标 IP,查询本机路由表 ,定位去往172.168.2.0网段的下一跳,选定转发出接口
  3. 将 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 还是 UDP;TTL 限制报文最大跳数,防止环路。
  • TCP 报头:源 / 目的端口定位本机进程;序列号保证字节顺序;确认号实现应答确认。
  • 局域网通信底层原理:CSMA/CD 工作机制、碰撞域概念、广播帧发送与主机接收过滤逻辑。
  • CSMA/CD:以太网载波监听冲突检测,发送前侦听,冲突后退避重发;
  • 碰撞域:同一时间只能有一台设备发送数据的网络范围;
  • 广播:帧目的 MAC 为全 F,局域网所有主机接收;主机匹配目标 MAC,不匹配直接丢弃帧。
  • 跨网段通信完整流程:路由器两大核心能力,逐跳转发完整过程,路由转发时 IP、MAC 地址的变化规则。

路由器工作在网络层,完成路由选择 + 分组转发。收到帧解包读取 IP,查路由表确定下一跳,TTL‑1,重新封装二层帧转发。

规律:源 IP、目的 IP 全程不变;源 MAC、目的 MAC 每跳重写

  • 分用机制核心原理:以太网 type 字段、IP 内部协议号、TCP/UDP 端口号,三层分用标识分别起到什么作用。
  • 以太网类型字段:告诉内核,上层是 IP 还是 ARP;
  • IP 头部协议号:告诉内核,上层是 TCP 还是 UDP;
  • TCP/UDP 端口号:把数据交给本机对应的应用进程。 三层标识层层筛选,最终把数据交付给正确上层。
  • Linux 内核sk_buff核心作用:skb_pushskb_pull函数,在报文封装、解包环节的工作原理。

sk_buff是内核管理网络报文的缓冲区结构体。

  • skb_push:向前挪动指针,添加报文头部,对应封装
  • skb_pull:向后挪动指针,剥掉报文头部,对应解包; 内核不需要拷贝数据,依靠指针偏移完成报头增删,性能很高。

结束语

到这里,本篇关于 MAC 地址、IP 地址,以及局域网通信、跨网段路由转发的内容就全部讲解完毕。我们从以太网基础概念入手,沿着数据封装、报文传输、解封装、路由逐跳转发这条主线,完整梳理了主机之间通信的底层逻辑,同时结合 Linux 内核视角窥探了协议栈的底层实现。

很多人容易混淆 MAC 地址与 IP 地址的分工,只要记住核心结论:MAC 负责局域网内相邻节点寻址,IP 负责跨网段端到端寻址,再结合封装解包、路由转发的流程串联理解,就能理清绝大多数网络基础问题。

相关推荐
深念Y2 小时前
订阅管理及节点过滤实践(技术笔记)
linux·网络·arm·优化·日志·工具·soc
IT小盘2 小时前
17-AI应用防止越权访问知识库
服务器·网络·windows
酷可达拉斯2 小时前
自动化运维-Ansible Role详解
linux·运维·服务器·自动化·ansible
为思念酝酿的痛2 小时前
Socket编程--TCP
服务器·网络·tcp/ip
牢姐与蒯3 小时前
Linux首战之进度条
linux·运维·服务器
北城笑笑3 小时前
Server 18 ,Nginx + Vite 前端部署排错实战:从 `/api/gpt/chat` 404 到 9012 后端服务的完整定位过程
linux·运维·前端·nginx·ubuntu·vue
NJCloud3 小时前
ELK企业级日志分析平台(四)——基于 ELFK + Kafka 的日志采集与传输平台部署实践
linux·运维·分布式·elk·kafka
hehelm4 小时前
仿muduo库实现高并发服务器—TCPServer
linux·服务器·网络·c++
鲁邦通物联网4 小时前
充电站底层脱机DLB引擎解构:基于Linux调度的边缘计算网关并发控制实战
linux·运维·人工智能·边缘计算·边缘计算网关·5g数采·工业级边缘计算网关