Linux网络编程(一):网络基础与协议概念

目录

一、计算机网络背景

[1. 为什么需要网络](#1. 为什么需要网络)

[2. 网络发展](#2. 网络发展)

[二、LAN 与 WAN](#二、LAN 与 WAN)

[1. 局域网](#1. 局域网)

[2. 广域网](#2. 广域网)

[3. 相对概念](#3. 相对概念)

三、协议

[1. 什么是约定](#1. 什么是约定)

[2. 什么是协议](#2. 什么是协议)

[3. 谁制定协议](#3. 谁制定协议)

四、协议分层

[1. 为什么分层](#1. 为什么分层)

[2. 分层的优势](#2. 分层的优势)

五、网络模型

[1. OSI 七层模型](#1. OSI 七层模型)

[2. TCP/IP 五层模型](#2. TCP/IP 五层模型)

[3. 为什么通常使用五层模型而非七层](#3. 为什么通常使用五层模型而非七层)

六、协议本质

[1. 什么是结构化数据](#1. 什么是结构化数据)

[2. 为什么需要结构化数据?](#2. 为什么需要结构化数据?)

[3. 协议的本质:结构体](#3. 协议的本质:结构体)

总结


一、计算机网络背景

在正式进入复杂的 Socket 编程和 TCP/IP 协议栈之前,我们先聊聊一个最本质的问题:我们为什么需要网络?


1. 为什么需要网络

早期的计算机被称为单机模式 。每一个计算机就像大海中的一个孤岛,虽然它能处理数据、运行程序,但它的资源是有限的

独立模式与网络互连模式

为了更直观地理解这一点,我们可以看一个典型的软件开发场景

  • 独立模式: 假设你是一名 20 世纪 80 年代的程序员。你写好了一段代码,想要给你的同事看。因为没有网络,你必须把代码拷贝进磁带或软盘里,然后起身走到他桌边交给他

    • **痛点:**协作极慢。如果你的电脑硬盘满了,你没法直接访问公司的存储服务器;如果你需要高算力,你只能守着自己那一台 CPU,无法调用机房里的超级计算机
  • 网络互连模式: 切换到现代。你在本地 VS Code 写代码,通过 Git 拉取全球开发者的库;你的数据存储在远端的云数据库 ;如果你在做一个 AI 模型训练,你可以一键将任务提交到远程的 GPU 集群

    • 你的电脑不再是一个封闭的盒子,而是一个通往全球资源池的入口

核心结论: 网络产生的根本动力是资源共享。无论这种资源是数据、算力、存储空间,还是人与人之间的信息,网络通过物理链路将分散的节点连接起来,打破了单机的性能瓶颈


2. 网络发展

计算机网络的演进经历了从 "主从架构" 到 "对等网络" 的逐步发展过程:

  1. 供应商终端模型: 早期是一台昂贵的巨型机连接一堆没有处理能力的终端

  2. 局域网(LAN)的兴起: 随着 PC 的普及,人们开始尝试在公司或实验室内部实现文件和打印机的共享

  3. 广域网(WAN)与互联网(Internet): 协议的统一(如 TCP/IP)让不同品牌、不同地区的局域网连成了一片,形成了我们今天赖以生存的互联网

二、LAN 与 WAN

当我们把电脑连接起来后,根据连接的距离和规模,我们通常会将网络划分为局域网和广域网


1. 局域网

局域网(LAN, Local Area Network),顾名思义,是局部地区形成的网络。

  • 典型场景:你的家里、宿舍楼、公司的办公室或者一家网吧

  • 特点

    • 范围小:通常在几米到几公里之内

    • 带宽利用率高:因为距离短,传输速率通常非常快(比如现在的千兆内网)

    • 延迟低:数据包几乎瞬发即达

  • 核心技术 :在 Linux 开发中,我们最常接触的局域网技术就是以太网(Ethernet)

为什么叫以太网

这个名字源于 19 世纪物理学的一个错误概念

  • 物理学中的以太:早期的物理学家认为,光既然是一种波,那它在真空中传播一定需要某种介质。这种看不见、摸不着、充满宇宙空间的假想物质就被称为以太。虽然后来实验证明了以太并不存在,但这个词却留在了科学史上

  • 1973 年,计算机网络先驱鲍勃·梅特卡夫在研究中心设计局域网时,他希望能找到一种介质,能够让电磁信号在办公室的每一寸空间里自由穿梭

  • 为了调侃那个曾经无处不在的假想介质,梅特卡夫将这种技术命名为以太网 。他认为网络也应该是像以太一样,是一种无处不在、被动且能够承载信号的介质


2. 广域网

**广域网(WAN, Wide Area Network)**则是跨越物理距离更远的网络

  • 典型场景:连接两个城市、两个国家,甚至跨越海洋

  • 广域网并不是一种完全不同的网络,它更像是一个 "网之网"(Network of Networks),将分布在不同地域的局域网(LAN)连接在一起

  • 典型代表 :我们每天使用的Internet(互联网) 就是目前全球最大的广域网


3. 相对概念

这一节我们要探讨一个认知上的升级:LAN 与 WAN 的界限其实是相对的

广域网本质上是更大的局域网

站在全局视角来看,互联网本质上是由海量局域网,借助路由器、光缆等网络设备相互互联、逐级组网形成的巨型分布式网络

  • 对于一个家庭来说,家里的 Wi-Fi 是局域网,电信运营商的骨干网是广域网。

  • 但对于电信运营商内部的运维人员来说,全国的骨干网在逻辑上也可以看作一套巨大的内网

所以,规模的大小只是相对的,关键在于你处于哪一个层级

网络边界与墙

在不同的网络连接处,必然存在网络边界。这就好比国家与国家之间有海关一样,数据包在跨越边界时,也需要经过各种网关、防火墙的审查

在我们的网络环境下,有一个大家心照不宣的概念------

  • 从技术角度看 :它本质上是一个部署在国家级网络出口处的超大型分布式防火墙与深度包检测系统

  • 它的意义:它定义了国内网络与国际互联网之间的边界。当你通过代码访问一个 IP 时,如果数据包需要跨越这个边界,就会触发相关的策略过滤

在 Linux 开发中,如果你发现自己的 curl 或 wget 访问某些海外资源极慢甚至超时,通常就是因为数据包在通过这个边界时遇到了阻碍。理解这一点,有助于你排查为什么有些镜像源必须换成国内的。

三、协议

在讨论 Socket、IP 地址或字节序这些硬核代码之前,我们必须先理解网络通信的核心------协议

如果没有协议,互联网不过是一堆乱放电的电缆和毫无意义的二进制杂讯


1. 什么是约定

在进入计算机术语之前,我们先看一个现实生活中的例子:交通信号灯

想象一下,如果每个城市、甚至每个路口对信号灯的理解都不一样:

  • 在 A 路口,绿灯代表通行。

  • 在 B 路口,绿灯代表停车,红灯才代表通行

  • 在 C 路口,司机觉得灯光太刺眼,决定按喇叭的节奏来决定谁先走

结果显而易见:交通系统会瞬间瘫痪,车祸频发。为了让交通顺畅,所有参与者(司机、行人、交警)必须达成一个先验的、共识性的约定:红灯停,绿灯行

这就是 "约定":通信双方在交互之前,预先设定好的一套彼此都能理解的规则。 在计算机通信中,这种约定更为关键。由于机器不具备人类的灵活性,它们对协议的执行极其严格:若发送端将首个字节定义为 "长度",而接收端却将其解读为 "类型",后续所有数据解析都将完全错位


2. 什么是协议

在计算机网络中,这种约定 被正式称为协议(Protocol)

简单来说,协议就是一套标准化的通信规则。它规定了数据如何打包、如何寻址、如何传输、如何纠错以及如何拆解

一个完整的网络协议通常包含以下三个要素:

  1. 语法:数据与控制信息的结构或格式(即:数据长什么样)

  2. 语义:需要发出何种控制信息,完成何种动作以及做出何种响应(即:数据代表什么意思)

  3. 时序:事件实现顺序的详细说明(即:什么时候发,发多快)


3. 谁制定协议

既然协议是规则,那么谁有权利给全世界的计算机制定规则呢?如果每个厂商都自搞一套,互联网就会变成一座座互不相通的孤岛

为了实现全球互联,协议必须由权威的中立机构进行标准化。目前主要的 "规则制定者" 包括:

(1) 全球性技术与标准化组织

这些组织负责制定普适性的国际标准:

  • IEEE(电气和电子工程师协会) :这是全球最大的专业技术组织之一。在通信领域,IEEE 制定了约 30% 的国际标准,其中最著名的是 IEEE 802 系列标准

  • ISO(国际标准化组织) :ISO 建立了著名的 OSI 参考模型。虽然在商业应用中 TCP/IP 协议族占据了统治地位,但 OSI 的七层结构依然是计算机网络教学与理论研究的基石

  • ITU(国际电信联盟):作为联合国的专门机构,ITU-T 分支负责制定电信领域的国际标准,确保全球范围内的电话和网络通信能够实现跨国界的兼容与互操作

(2) 民间国际团体与志愿者组织

这些组织往往由技术专家组成,侧重于互联网核心协议的进化:

  • IETF(互联网工程任务组) :这是一个由全球技术专家组成的志愿组织,负责开发和推广互联网协议,特别是 TCP/IP 协议族 。IETF 发布的标准被称为 RFC,每一项互联网新技术的诞生通常都伴随着一篇 RFC 文档

(3) 官方机构与监管单位

政府机构通过法律和行政手段,对通信协议的技术特性进行审查和准入:

  • FCC(联邦通信委员会):以美国为例,FCC 负责管理无线电、电视和有线通信。它会对通信产品的技术标准进行监督,确保这些产品在保护公众利益的同时,符合标准化的技术规范

(4) 区域标准化组织

为了满足特定地理区域的电信需求,各地区也建立了相应的组织:

  • ETSI(欧洲电信标准学会):由欧洲各国政府资助,成员包括厂商和研究机构,主要负责欧洲电信标准的研发

  • ASTAP(亚洲与泛太平洋电信标准化协会):由中、日、韩等国发起,旨在加强亚太地区信息基础设施的互联互通协作

(5) 商业公司

在某些垂直领域或新兴市场,具备核心竞争力的公司也会制定或深度定制协议:

  • 公司自研协议栈:例如泰凌微等半导体公司,会针对低功耗蓝牙、Zigbee、Matter 等协议进行深度自研和定制化改动。这不仅是公司的核心竞争力,也能推动智能家居、电子价签等特定行业标准的演进

四、协议分层

在网络通信这样一个极其复杂的工程中,如果所有的功能(物理信号传输、错误校验、路径选择、应用逻辑等)都挤在一个协议里,那么任何一处的微小改动都可能引发整个系统的崩溃

为了解决这个问题,工程师们借鉴了人类社会高效协作的经验,引入了协议分层


1. 为什么分层

为了理解分层的必要性,我们可以观察一个智能手机制造公司内部的协作模式

假设公司需要推出一款新手机,这个任务被分成了几个逻辑层:

  • 管理层:负责制定战略,"我们要研发一款 5G 折叠屏手机"。他们并不关心手机主板上的电容是怎么焊的,也不关心物流用的哪家快递

  • 研发层:根据指令进行设计和编码。他们只关心技术实现,不关心手机卖给谁

  • 物流层:负责将成品打包并寄送。他们只关心包装是否结实、地址是否准确,至于盒子里装的是手机还是平板,对他们来说没有区别

为什么要这么分? 想象一下,如果 CEO 必须亲自去仓库打包,或者快递员必须看懂 CPU 的底层架构才能开车,这家公司显然无法运作

在网络中也是如此:

  1. 顶层只管数据内容(就像 CEO 只管产品定义)

  2. 中间层只管如何准确地把数据从 A 传到 B(就像工程师只管功能实现)

  3. 底层只管把比特流转换成电信号发出去(就像物流只管运送包裹)

每一层只需要通过特定的 "接口" 与相邻的层沟通,而不需要了解其他层的内部实现细节


2. 分层的优势

协议分层并非增加了复杂度,恰恰相反,它是为了简化复杂度。其核心优势体现在:

  • 解耦:各层之间相互独立

    • 如果你决定把物流公司从顺丰换成邮政,你并不需要重新设计手机。在网络中,无论你把网线换成 WiFi,你的 QQ 聊天程序代码一行都不需要改
  • 可扩展性:任何一层都可以根据需要进行技术升级,只要它对上层和下层提供的 "服务接口" 保持不变即可

  • 标准化协作:每一层都有明确的职责范围

    • 由于各层功能明确,不同厂商可以分别专注于不同层级的产品(比如 Cisco 专攻路由器,腾讯专攻应用软件),它们依然能完美配合
  • 易于故障排查:当网络出现问题时,我们可以分层定位

    • 如果是网线断了,那是物理层的问题;如果是网页打不开但能登 QQ,那是应用层的问题。这种分治思想极大提高了排障效率

五、网络模型

在理解了分层的必要性后,我们需要一套具体的标准来指导实现。在计算机网络的发展史上,曾出现过两种著名的模型:一种是教科书式的理想模型,另一种是赢得市场的实战模型


1. OSI 七层模型

OSI模型由国际标准化组织制定。它将网络通信从物理信号到应用逻辑严密地划分为七层:

  1. 物理层:传输比特流(0/1信号)

  2. 数据链路层:负责局部链路的帧传输与差错检测

  3. 网络层:负责在不同网络之间进行路由选择和寻址

  4. 传输层:提供端到端的可靠(或不可靠)数据传输

  5. 会话层:管理主机间会话的建立、维护与断开

  6. 表示层:处理数据的格式转换、加密与压缩

  7. 应用层:直接为用户的应用程序提供网络服务

现状 :OSI 模型架构非常完美,但由于其过于复杂,且在制定标准时互联网技术已经先行一步,导致它最终只留在教科书中,作为一种理论参考框架


2. TCP/IP 五层模型

TCP/IP 模型(有时也称四层模型,若包含物理层则为五层)是事实上的工业标准。它舍弃了 OSI 中冗余的环节,更加贴合实际的软硬件实现

层次 名称 核心职责 典型协议/硬件
第五层 应用层 负责应用程序间的沟通逻辑 HTTP, FTP, DNS, SSH
第四层 传输层 负责端到端(进程到进程)的数据传输,确保数据到达目的主机 TCP, UDP
第三层 网络层 负责在复杂的网络环境中选择最优路径,通过 IP 地址定位主机 IP, ICMP, 路由器
第二层 数据链路层 负责相邻节点(如主机与交换机)之间的数据传输。使用 MAC 地址 以太网, 交换机
第一层 物理层 负责纯粹的比特流传输,涉及电压、接口规范等 光纤, 网线, 集线器

在某些文献中,物理层和数据链路层被合称为 "网络接口层",从而构成 TCP/IP 四层模型。但在学习 Linux 网络编程时,将其拆分为五层更有助于理解底层驱动与硬件的关系


3. 为什么通常使用五层模型而非七层

既然 OSI 七层模型更精细,为什么我们在实际工程中(包括 Linux 内核实现)几乎都采用 TCP/IP 五层模型?

(1) 功能的重叠与冗余

在 OSI 模型中,表示层 (数据格式)和会话层(连接管理)被独立了出来。但在实际应用中,这些功能往往已经由应用层协议自己解决了

  • 例如:加密和压缩逻辑完全可以写在 HTTP 协议里,不需要单独设一层

(2) 效率与实现难度

分层越多,层与层之间的封装和拆包(数据报头的添加与解析)就越频繁。对于追求高性能的互联网来说,减少不必要的层级切换可以显著降低处理延迟和内存开销

(3) 市场选择

TCP/IP 在互联网爆发初期就已经大规模应用并验证了其可靠性。当 ISO 试图推行 OSI 模型时,TCP/IP 已经成为了事实上的标准。工程师们更倾向于使用 "虽然不完美但已经跑起来了" 的技术

六、协议本质

在讨论了那么多的层级和模型之后,我们终于来到了网络编程最核心、最具体的物理现实:协议到底是什么?

协议的概念其实非常具体:协议就是通信双方都认可的 "结构化数据"


1. 什么是结构化数据

非结构化数据 如同无固定格式的自由文本,接收方需要完整读取全部内容,才能梳理核心信息;而结构化数据则遵循标准规整格式,以规范表单形式组织内容,便于直接解析与读取

(1) 从比特流到有意义的信息

在物理层和数据链路层看来,网络上流动的只有 0 和 1。 假设服务器收到了一串二进制:00000000 00000000 00000000 00001010

  • 如果没有结构化定义,这只是 32 个电信号

  • 如果有了结构化定义(比如定义为 int),服务器才知道这代表 数字 10

(2) 结构化的本质

所谓结构化 ,其实就是在这一串连续的二进制数据中,人为地划定了界限

想象内存中有一段 9 字节的空间,结构化数据会告诉计算机:

  • 前 4 个字节:代表操作数 A(偏移量 0,长度 4)

  • 中间 4 个字节:代表操作数 B(偏移量 4,长度 4)

  • 最后 1 个字节:代表运算符(偏移量 8,长度 1)

结构化数据是将无序二进制数据流 解析为业务逻辑对象 的关键载体。网络协议则是通信双方共同遵循的数据格式与交互规范,相当于一份统一认可的数据解析参照标准


2. 为什么需要结构化数据?

假设我们要实现一个简单的网络计算器,客户端发送两个数字和一个运算符给服务器

如果直接发送纯文本字符串,比如 "10+20",服务器收到后需要进行极其复杂的字符串解析:

  • 哪里是数字?

  • 哪里是操作符?

  • 如果用户发的是 "10 + 20"(带空格)或者 "20加10" 怎么办?

这种 "非结构化" 的通信方式效率低下且极易出错。在真正的网络编程中,我们从不直接处理这种混乱的文本,而是使用结构体


3. 协议的本质:结构体

在 Linux 环境下,协议在代码层面通常表现为一个 struct。通信双方的代码中都包含了同一个头文件,里面定义了完全一样的结构体声明

这就是协议的真相:双方持有完全相同的 "填空模板"

伪代码示例

我们可以定义一个简单的计算请求协议:

cpp 复制代码
// 双方共同遵守的协议定义
struct Request {
    int x;       // 第一个操作数
    int y;       // 第二个操作数
    char op;     // 操作符:'+', '-', '*', '/'
};

struct Response {
    int result;  // 计算结果
    int code;    // 状态码:0表示成功,1表示除零错误,2表示非法操作
};

当客户端想要发起一次请求时,它在内存中所做的事情其实非常简单:

  1. 客户端创建一个 Request 结构体对象,并把数据填进去

  2. 通过网络接口,将这块内存中的二进制数据原封不动地发出去

  3. 对等解析 :服务器收到这串二进制流后,由于它也知道 Request 结构体的定义,它只需要将这段内存看作是一个 Request 对象,就能通过 req.x 和 req.y 直接拿到数据

这个过程就像是: 我寄给你一个有固定格子的零件盒,我在第一个格子里放了螺丝,第二个格子里放了螺母。你收到后,不需要去猜盒子里有什么,直接打开第一个格子拿螺丝,打开第二个格子拿螺母就行了

总结

综上所述,从计算机网络的发展背景,到局域网与广域网,再到协议、协议分层以及 TCP/IP 模型,我们已经初步建立起了对整个网络体系的整体认知

其中,协议本质上是一种通信约定,而 TCP/IP 则是在全球范围内让不同硬件、不同操作系统、不同厂商设备能够彼此通信的一套标准化解决方案。与此同时,网络分层思想也进一步体现了计算机系统中经典的解耦设计:每一层只关心自己的职责,通过统一接口与上下层协作,从而共同完成复杂的数据通信任务

而进一步思考可以发现:

既然已经有了协议分层,那么数据究竟是如何在这些层之间逐层封装、最终从一台机器发送到另一台机器上的呢?

这正是下一阶段要解决的问题

在下一篇中,我们将正式进入网络数据传输流程,深入理解数据封装与分用、MAC 地址、IP 地址、ARP、路由转发等核心机制,真正看清一条网络消息究竟是如何在互联网中流动的

相关推荐
dualven_in_csdn1 小时前
【网络】ip转发
linux·服务器·网络
袁小皮皮不皮1 小时前
HCIP-BFD 学习笔记
运维·服务器·网络·笔记·网络协议·学习·智能路由器
xlq223221 小时前
54.序列化和反序列化
服务器·网络·网络协议·tcp/ip
恋奴娇1 小时前
ubuntu 25 gnome-screenshot 录屏启动失败 原因pipewire服务未启动
linux·运维·ubuntu
JiaWen技术圈1 小时前
后端无状态鉴权 JWT 或 OAuth2 及其区别与实现
服务器·网络·网络协议
斯班奇的好朋友阿法法2 小时前
网络攻防学习路线
网络·学习
susu10830189112 小时前
windows系统的WSL的Ubuntu安装docker
linux·ubuntu·docker
CableTech_SQH2 小时前
江苏理工学院武进绿建区协同创新园智能化建设 F5G 全光方案百盛分析报告
大数据·网络·数据库·5g·信息与通信
嵌入式小能手2 小时前
飞凌嵌入式ElfBoard-进程间的通信之信号处理sigaction
linux·算法·信号处理