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

很多同学学到协议,总停留在 “规则、约定” 这种抽象词上。但真正的网络工程师 / 开发者眼里,协议是可落地、可编码、可解析的结构化数据。我们从三个问题重新认识协议。
答案非常扎心:因为设备离远了!
所以 TCP/IP 不是凭空造的,是为了解决 “远距离通信” 而生的一套完整解决方案。

协议 = 通信双方都认识的结构化数据类型
操作系统内核、网络协议栈几乎都是 C/C++ 写的,协议最直观的体现就是:双方用一模一样的结构体。
我们直接上代码理解:
// 通信双方 100% 相同的协议结构体
struct NetProtocol {
int a; // 自定义字段1
int b; // 自定义字段2
int c; // 自定义字段3
char payload[1024]; // 真正要传的数据
};发送端代码:
// 发送端构建协议数据
struct NetProtocol data;
data.a = 10;
data.b = 20;
data.c = 30;
strcpy(data.payload, "Hello Network!");
// 发送到网络(socket 发送)
send(sockfd, &data, sizeof(data), 0);接收端代码:
// 接收端用完全一样的结构体解析
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);结论:只要双方结构体一致,就能正确解析。这就是协议最朴素、最本质的样子 ——共识 = 相同结构。
因为问题本身就能分层!
分层 = 解耦 + 模块化 + 易维护。改物理层不影响应用层,换应用不影响底层传输。这就是软件工程的经典思想。

我们把网络传输拆成两块:
先从最简单、最核心的局域网通信开始。
同一个局域网内的两台主机可以直接通信,原理像 “教室喊话”。
每块网卡出厂就带一个全球唯一的地址:MAC 地址。
08:00:27:03:fb:19Windows 查看 MAC 命令(bash):
ipconfig /allLinux 查看 MAC:
ip link
ifconfig -a以太网是共享信道:
因此在没有交换机时,整个网络就是一个冲突域。

这是网络最核心的流程,所有网络通信都绕不开。
数据发送流程:

就像寄快递:物品(payload)→ 装盒子(应用)→ 贴快递单(传输)→ 贴路由单(网络)→ 贴派送单(链路)
分用就是接收端的逆过程:

一句话总结:发送端自上而下封装,接收端自下而上分用。
局域网能直接通信,跨网必须经过路由器。
IP 地址用来标识网络中的主机。
192.168.1.1查看本机 IP(Windows):
ipconfigLinux:
hostname -I
ifconfig我们来比喻一下:
总而言之就是:路由器只看 MAC 转发,全球路由只看 IP 寻址。
IP 网络层创造了一个虚拟层:不管你是以太网、WiFi、4G、光纤,统统变成 IP 网络。这才是互联网能互联互通的根本原因。
本文全部都是考试、面试、开发的必考核心知识。下一篇我们正式进入 Socket 编程相关知识与实战,自己写出 TCP/UDP 服务器与客户端! 原创不易,点赞 + 收藏 + 关注,后续持续更新网络底层、操作系统、后端开发干货!