【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 服务器与客户端!

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

相关推荐
风曦Kisaki5 分钟前
# Linux 磁盘查看命令详解:df 与 du
linux·运维·网络
路溪非溪9 分钟前
Linux中gpio子系统的现代接口
linux·arm开发·驱动开发
攻城狮在此12 分钟前
华为交换机Console口密码如何清除
运维·网络·华为
内心的一片海1 小时前
服务器内存异常占用
运维·服务器
文静小土豆1 小时前
Centos7负载异常过高排查思路(Load Average)
linux
Deitymoon1 小时前
linux——原子操作
linux
hhcgchpspk2 小时前
网速上传下载流量监测工具尝试
网络·python·cmd·psutil
liulilittle2 小时前
C++ 无锁编程:单停多发送场景高性能方案
服务器·开发语言·c++·高性能·无锁·原子
m0_738120722 小时前
渗透基础知识ctfshow——Web应用安全与防护(第一章)
服务器·前端·javascript·安全·web安全·网络安全
亚空间仓鼠2 小时前
OpenEuler系统常用服务(四)
linux·运维·服务器·网络