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

一、再识协议:从 "约定" 到 "代码级理解"
很多同学学到协议,总停留在 "规则、约定" 这种抽象词上。但真正的网络工程师 / 开发者眼里,协议是可落地、可编码、可解析的结构化数据。我们从三个问题重新认识协议。
1.1 为什么需要 TCP/IP 协议?
答案非常扎心:因为设备离远了!
- 单机内部:内存、磁盘、CPU 通信距离极近,问题少,用 SATA、IDE、内存协议就行,感知不到。
- 网络通信:两台主机可能隔一座城、一个大洋,距离带来三大问题:
- 信号衰减、干扰
- 不知道对方是谁
- 不知道数据发给谁、怎么传、丢了怎么办
所以 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 信号怎么传
- 数据链路层:解决局域网内设备怎么找
- 网络层:解决跨网怎么路由
- 传输层:解决可靠传输、发给哪个进程
- 应用层:解决具体业务(网页、邮件、文件)
分层 = 解耦 + 模块化 + 易维护。改物理层不影响应用层,换应用不影响底层传输。这就是软件工程的经典思想。

二、网络传输基本流程:数据从出发到抵达全链路
我们把网络传输拆成两块:
- 同一局域网(以太网)内怎么传
- 跨网段(广域网)怎么传
先从最简单、最核心的局域网通信开始。
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 局域网收发逻辑
- 主机 A 封装数据,填上目标 MAC
- 发到局域网广播
- 所有主机都能收到,但只看目标 MAC
- 匹配自己 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 服务器与客户端!
原创不易,点赞 + 收藏 + 关注,后续持续更新网络底层、操作系统、后端开发干货!
