【Linux网络编程】(二)计算机网络概念进阶:彻底搞懂协议本质、传输流程与封装分用


前言

上一篇我们聊了计算机网络的起源与协议的基本概念,知道了网络是为了连接、协议是为了沟通。但这只是入门 ------协议到底在代码里长什么样?数据怎么从一台电脑跑到另一台?封装、分用、MAC、IP、端口到底在干嘛? 这篇文章带你进入网络概念进阶,吃透「再识协议」「网络传输基本流程」全部核心,为 Socket 编程打下硬核基础。下面就让我们正式开始吧!


一、再识协议:从 "约定" 到 "代码级理解"

很多同学学到协议,总停留在 "规则、约定" 这种抽象词上。但真正的网络工程师 / 开发者眼里,协议是可落地、可编码、可解析的结构化数据。我们从三个问题重新认识协议。

1.1 为什么需要 TCP/IP 协议?

答案非常扎心:因为设备离远了!

  • 单机内部:内存、磁盘、CPU 通信距离极近,问题少,用 SATA、IDE、内存协议就行,感知不到。
  • 网络通信:两台主机可能隔一座城、一个大洋,距离带来三大问题:
    1. 信号衰减、干扰
    2. 不知道对方是谁
    3. 不知道数据发给谁、怎么传、丢了怎么办

所以 TCP/IP 不是凭空造的,是为了解决 "远距离通信" 而生的一套完整解决方案

1.2 协议在代码里到底是什么?

协议 = 通信双方都认识的结构化数据类型

操作系统内核、网络协议栈几乎都是 C/C++ 写的,协议最直观的体现就是:双方用一模一样的结构体

我们直接上代码理解:

cpp 复制代码
// 通信双方 100% 相同的协议结构体
struct NetProtocol {
    int a;     // 自定义字段1
    int b;     // 自定义字段2
    int c;     // 自定义字段3
    char payload[1024];  // 真正要传的数据
};

发送端代码:

cpp 复制代码
// 发送端构建协议数据
struct NetProtocol data;
data.a = 10;
data.b = 20;
data.c = 30;
strcpy(data.payload, "Hello Network!");

// 发送到网络(socket 发送)
send(sockfd, &data, sizeof(data), 0);

接收端代码:

cpp 复制代码
// 接收端用完全一样的结构体解析
struct NetProtocol recv_data;
recv(sockfd, &recv_data, sizeof(recv_data), 0);

// 直接读取!因为结构一致,天然能识别
printf("a=%d, b=%d, c=%d\n", recv_data.a, recv_data.b, recv_data.c);
printf("payload: %s\n", recv_data.payload);

结论: 只要双方结构体一致,就能正确解析。这就是协议最朴素、最本质的样子 ------共识 = 相同结构

1.3 协议为什么要分层?

因为问题本身就能分层!

  • 物理层:解决 0/1 信号怎么传
  • 数据链路层:解决局域网内设备怎么找
  • 网络层:解决跨网怎么路由
  • 传输层:解决可靠传输、发给哪个进程
  • 应用层:解决具体业务(网页、邮件、文件)

分层 = 解耦 + 模块化 + 易维护。改物理层不影响应用层,换应用不影响底层传输。这就是软件工程的经典思想。


二、网络传输基本流程:数据从出发到抵达全链路

我们把网络传输拆成两块:

  1. 同一局域网(以太网)内怎么传
  2. 跨网段(广域网)怎么传

先从最简单、最核心的局域网通信开始。

2.1 局域网通信:以太网是怎么工作的?

同一个局域网内的两台主机可以直接通信,原理像 "教室喊话"。

2.1.1 唯一标识:MAC 地址

每块网卡出厂就带一个全球唯一的地址:MAC 地址

  • 48 位(6 字节)
  • 格式:08:00:27:03:fb:19
  • 固化在硬件,一般不可改

Windows 查看 MAC 命令(bash):

bash 复制代码
ipconfig /all

Linux 查看 MAC:

bash 复制代码
ip link
ifconfig -a

2.1.2 以太网规则:同一时刻只能一人说话

以太网是共享信道

  • 多台主机同时发 → 信号碰撞 → 数据错乱
  • 所以必须:碰撞检测 + 自动重发

因此在没有交换机时,整个网络就是一个冲突域

2.1.3 局域网收发逻辑

  1. 主机 A 封装数据,填上目标 MAC
  2. 发到局域网广播
  3. 所有主机都能收到,但只看目标 MAC
  4. 匹配自己 MAC 就留下,不匹配就丢弃

2.2 封装与分用:网络世界的 "快递打包"

这是网络最核心的流程,所有网络通信都绕不开

2.2.1 三个必背概念

  • 报头 Header:每层协议的结构体(控制信息)
  • 有效载荷 Payload:真正要传的数据
  • 报文 = 报头 + 有效载荷

2.2.2 不同层的数据包叫法(面试常考)

  • 应用层:数据 Data
  • 传输层:段 Segment(TCP 段、UDP 段)
  • 网络层:数据报 Datagram(IP 数据报)
  • 数据链路层:帧 Frame(以太网帧)

2.2.3 封装:自上而下层层加头

数据发送流程:

就像寄快递:物品(payload)→ 装盒子(应用)→ 贴快递单(传输)→ 贴路由单(网络)→ 贴派送单(链路)

2.2.4 分用:自下而上层层剥头

分用就是接收端的逆过程:

一句话总结: 发送端自上而下封装 ,接收端自下而上分用

三、跨网传输:IP 地址与路由的真相

局域网能直接通信,跨网必须经过路由器

3.1 认识 IP 地址

IP 地址用来标识网络中的主机

  • IPv4:32 位,4 字节,点分十进制 192.168.1.1
  • 范围:0~255

查看本机 IP(Windows):

bash 复制代码
ipconfig

Linux:

bash 复制代码
hostname -I
ifconfig

3.2 IP 与 MAC 的核心区别(面试必考)

  • 目的 IP:全程不变,是最终目标地址
  • MAC:每经过一个路由都会变,是下一跳地址

我们来比喻一下:

  • IP = 最终收货地址
  • MAC = 下一站快递站地址

总而言之就是:路由器只看 MAC 转发,全球路由只看 IP 寻址。

3.3 网络层的意义:屏蔽底层差异

IP 网络层创造了一个虚拟层 :不管你是以太网、WiFi、4G、光纤,统统变成 IP 网络。这才是互联网能互联互通的根本原因。


总结

本文全部都是考试、面试、开发的必考核心知识。下一篇我们正式进入 Socket 编程相关知识与实战,自己写出 TCP/UDP 服务器与客户端!

原创不易,点赞 + 收藏 + 关注,后续持续更新网络底层、操作系统、后端开发干货!

相关推荐
李白客2 小时前
数据库管理工具怎么选?Navicat、DataGrip、DBeaver 六维横向对比与选型建议
运维·数据库
Ivanqhz2 小时前
BPE(Byte Pair Encoding) 算法
java·服务器·网络·深度学习·神经网络
iPad协议个微协议2 小时前
微信二次开发如何用 WechatApi 打通消息、客户和业务系统
运维·微信·自动化·微信开发·wechatapi·个人微信开发
蓝速科技2 小时前
蓝速 K10 三防平板在工业恶劣工况下的选型与应用指南
大数据·运维·数据库·人工智能·科技
bksczm2 小时前
MySQL基础篇之视图与用户管理
linux·数据库·sql·mysql
Ahtacca2 小时前
Linux 基础实验:从终端操作到 C 语言编译
linux·运维·运维开发·虚拟机
邪修king2 小时前
Re:Linux 系统篇(二十九):动静态库Chapter2:动态库深度辨析 —— 核心本质、制作流程、双阶段查找模型与排错指南
android·java·linux·开发语言
智能运维指南2 小时前
持续集成平台怎么选?从Jenkins迁移、信创适配到质量门禁的全维评估
运维·devops·嘉为蓝鲸
比奥利奥还傲.4 小时前
哪吒监控面板实战:部署 Dashboard、接入 Agent、钉钉告警,再配置固定公网访问
网络·人工智能·分布式·1024程序员节
云泽8084 小时前
从零搭建 WSL2 + Ubuntu C/C++ 开发环境:原理、实践与底层架构解析
linux·c++·windows·ubuntu·wsl2