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

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

相关推荐
风曦Kisaki2 小时前
# 云计算基础Day06:Linux权限管理
linux·云计算
badwomen__2 小时前
流水线数据冒险与转发:x86和ARM的不同打法
服务器·性能优化
勇闯逆流河2 小时前
【Linux】linux进程概念(fork,进程状态,僵尸进程,孤儿进程)
linux·运维·服务器·开发语言·c++
牛十二2 小时前
宝塔安装openclaw+企业微信操作手册
linux·运维·服务器
⑩-2 小时前
API 网关的作用?Spring Cloud Gateway 原理?
java·服务器·网络·spring cloud
开开心心_Every2 小时前
免费抽奖软件支持内定名单+防重复中奖
linux·运维·服务器·edge·pdf·c5全栈·c4python
feng68_2 小时前
Discuz! X5 高性能+高可用
linux·运维·服务器·前端·后端·高性能·高可用
Love Song残响2 小时前
Wireshark实战:从抓包到网络诊断
网络·测试工具·wireshark
IMPYLH2 小时前
Linux 的 chgrp 命令
linux·运维·服务器