【Linux网络编程】1. 网络基础概念
文章目录
一、计算机网络发展历程
-
独立模式: 计算机相互独立,数据不共享,效率极低,需人工传递数据。

-
网络互联: 多台计算机直接相连,实现基础数据共享,解决了单机数据孤岛问题。

-
局域网(LAN): 同一区域内的计算机通过交换机、路由器互联,支持多设备高效通信,实现了本地资源共享。

-
广域网(WAN): 通过路由器连接多个局域网,跨越地域限制,实现全球范围的数据通信。局域网和广域网是相对概念,规模不同而已。

二、初识网络协议
-
协议的本质: 双方约定的通信规则。计算机间通过光电信号的频率 / 强弱表示 0 和 1,必须约定统一的数据格式才能正常通信。

-
为什么需要标准网络协议: 不同厂商的硬件、操作系统、设备要顺畅通信,必须遵守统一标准,这就是网络协议。
-
主要标准制定组织:
- IEEE:制定局域网标准(如 802 系列)
- ISO:定义 OSI 七层模型
- IETF:制定 TCP/IP 协议族(通过 RFC 发布)
- ITU:制定电信领域国际标准
三、协议分层
- 协议本质是软件,采用分层结构设计,实现模块化与解耦,降低维护成本。
以两层协议为例:
语言层: 约定沟通的语言(如汉语 / 英语),只关心内容表达。
通信设备层: 约定传输方式(如电话 / 无线电),只关心信号传输。
分层的核心优势:
- 层与层之间独立修改互不影响(比如只换设备,不影响语言沟通;或只换语言,不影响电话传输)。
- 让复杂的网络通信拆解为多个独立、简单的模块,更易维护和扩展。
四、OSI 七层模型
- 定义: OSI(开放系统互连)七层模型是网络通信的理论框架,将通信逻辑分为七层,每层分工明确。
- 核心特点: 清晰区分服务、接口和协议,理论完整,但设计复杂,实际不直接使用。
- 工程实践: 落地中常用 TCP/IP 四层模型(或五层模型,将会话层、表示层并入应用层)。


模型各层核心职责(关键三层):
| 层级 | 核心作用 |
|---|---|
| 物理层 | 定义网线、连接器等硬件规格,把比特流转为光电信号传输 |
| 数据链路层 | 负责设备间帧传输、差错校验,实现分段转发 |
| 网络层 | 管理 IP 地址、路由选择,决定数据传输路径 |
五、 TCP/IP 五层(四层)模型
| 层级 | 核心职责 | 典型协议 / 设备 |
|---|---|---|
| 应用层 | 应用程序间的通信,如网页、邮件、文件传输 | HTTP/FTP/SMTP,网络编程主要针对这一层 |
| 传输层 | 主机间的端到端数据传输,保证可靠性 | TCP(可靠)、UDP(高效) |
| 网络层 | IP 地址管理、路由选择,规划传输路径 | IP/ICMP,路由器工作在此层 |
| 数据链路层 | 设备间数据帧传输、差错校验、冲突检测 | 以太网协议,交换机工作在此层 |
| 物理层 | 光 / 电信号的传输介质,定义网线、无线等硬件标准 | 双绞线、光纤、Wi-Fi,集线器工作在此层 |
物理层常被忽略,因此也常称为TCP/IP 四层模型。
四、再识网络协议
-
为什么需要 TCP/IP?
主机间通信距离变远,出现路由寻址、数据丢失、应用识别等新问题,需要一套分层解决方案,这就是 TCP/IP 协议。
-
协议本质是什么?
通信双方约定的结构化数据格式,就像主机 A/B 都认识同一个struct protocol,才能正确解析数据。分层后,每层都有自己的协议,只处理对应问题。
-
TCP/IP 与操作系统的关系
- 不同系统(Windows/Linux)可共存,但协议栈实现必须统一,才能互相通信。
- 网络层、传输层(IP/TCP)由操作系统内核实现;应用层由用户程序实现。

五、网络传输基本流程
局域网通信原理
- 同一局域网内的主机可直接通信,通过MAC 地址(48 位硬件地址)标识唯一节点。
- 数据发送时,所有主机都会收到报文,通过目标 MAC 地址判断是否接收,非目标主机直接丢弃。
- 早期以太网无交换机时属于 “碰撞域”,多主机同时发送会产生数据冲突,需碰撞检测避免干扰。

封装与解包
主机 A 发送数据到主机 B 时,会经历自上而下的封装和自下而上的解包:
| 层级 | 发送端(封装) | 接收端(解包) | 数据名称 |
|---|---|---|---|
| 应用层 | 添加应用层报头 | 解析应用层报头,交付给对应程序 | 数据 |
| 传输层 | 添加 TCP/UDP 报头 | 解析传输层报头,根据端口号交付 | 段(Segment) |
| 网络层 | 添加 IP 报头 | 解析 IP 报头,判断目标主机 | 数据报(Datagram) |
| 数据链路层 | 添加 MAC 帧头 | 解析 MAC 帧头,校验并交付上层 | 帧(Frame) |

关键概念
- 报文组成: 报文 = 报头(协议控制信息) + 有效载荷(上层数据)
- 封装: 每层为数据添加对应协议报头,形成新的报文。
- 解包 / 分用: 接收端逐层剥离报头,根据报头信息将数据交付给上层协议。
- 同层通信: 每层都认为自己在和对方主机的同层协议直接通信,实际是通过下层协议传递。

数据包封装与分用
- 封装过程(发送端)
用户数据从应用层向下传递,每层协议都会在数据前添加自己的协议报头,层层包裹:
- 应用数据 → 加 TCP/UDP 报头(传输层) → TCP 段
- TCP 段 → 加 IP 报头(网络层) → IP 数据报
- IP 数据报 → 加以太网帧头 / 尾(数据链路层) → 以太网帧

- 分用过程(接收端)
数据帧到达后,自下而上逐层解析、剥离报头,再交付给上层:
- 以太网驱动根据帧类型,交付给 IP/ARP/RARP 协议
- IP 层根据协议号,交付给 TCP/UDP/ICMP 等上层协议
- TCP/UDP 根据端口号,交付给对应的应用程序

认识 IP 地址
- IP 地址基础: IPv4 地址是 32 位整数,用点分十进制(如
192.168.0.1)表示,用于标识网络中的主机。 - 跨网段传输: 不同网段的主机通信必须经过路由器转发。
- IP 层核心作用: 屏蔽以太网、令牌环等底层网络差异,为上层(TCP/FTP)提供统一通信接口,实现跨网络端到端传输。

为什么先找路由器: 主机判断目标 IP 不在本地网段,无法直接通信,必须把数据发给网关(路由器)转发。
目的 IP 的意义: 标识通信的最终目标主机,全程不变,是路由器选路、跨网段找到目标的核心依据。
-
路由器的核心操作: 收到数据后,解包到网络层读取目的 IP,查路由表确定转发路径;再重新封装 MAC 帧,更新源 / 目的 MAC 地址后转发。
-
本质: IP 决定最终去哪,MAC 决定当前网段下一跳发给谁。

-
IP 地址 vs MAC 地址
- IP 地址: 全程不变,标识最终的源 / 目标主机,是路由选路的 “长远目标”。
- MAC 地址: 每经过一跳路由器就会重新封装更新,仅标识当前局域网的下一跳设备,是局域网转发的 “阶段目标”。
-
IP 网络层的意义: 提供统一的虚拟网络层,屏蔽以太网、令牌环等底层物理网络的差异,让上层协议无需关心底层细节,实现跨网络通信。

六、Socket 编程预备
1、IP 地址
-
IP 地址的作用: IP 地址(比如图里的
192.168.2.3)的作用,是在整个网络中唯一标识一台主机。它负责把数据报文从发送方主机,一路路由到目标主机。 -
数据传输的 “最终目的”: 数据到达主机,并不是传输的终点。因为最终使用数据的,是主机里运行的进程:
- 聊天数据要交给 QQ 进程
- 下载数据要交给迅雷进程
- 网页数据要交给浏览器进程
-
新的问题:主机里怎么区分不同进程?
- 一台主机上同时运行着大量进程,当数据到达主机后,系统需要一个机制,把数据精准转发给对应的进程。
- 所以,我们除了用 IP 标识主机,还需要一个标识来区分主机内的进程,这个标识就是端口号(Port)。
- IP + 端口号,就构成了网络中进程的唯一标识,也就是我们 Socket 编程的核心基础。

2、端口号(Port)
端口号是什么?
:端口号(Port)是传输层的概念,是一个 16 位整数(范围 0-65535),作用是唯一标识主机内的一个进程。
它解决了 “数据到了主机,该交给哪个进程” 的问题。
端口号的核心规则
- IP + 端口号: 唯一标识网络中的一个进程。
- 唯一性: 一个端口号同一时间只能被一个进程占用;但一个进程可以绑定多个端口号。
- 范围划分:
- 0-1023:知名端口号(固定分配给 HTTP、FTP 等标准服务,比如 HTTP 用 80)。
- 1024-65535:动态 / 私有端口号,客户端程序的端口由系统从这里分配。
端口号 vs 进程 ID(PID)
两者都能标识进程,但设计目的不同:
- PID: 是操作系统层面的进程标识,和网络无关。
- 端口号: 是网络层面的进程标识,专门为网络通信设计,解耦了系统进程管理和网络通信。
源端口号 & 目的端口号
TCP/UDP 的数据段里,都包含这两个端口号:
- 源端口号: 标记 “数据是谁发的”。
- 目的端口号: 标记 “数据要发给谁”。
Socket 的本质
- 单个
IP+Port:标识网络中的一个进程。 - 通信时的四元组 {
源IP, 源Port, 目的IP, 目的Port}:唯一标识网络中的一次通信(两个进程之间的连接)。 - 网络通信的本质,就是两个进程间的通信。
- 我们把
IP+Port叫做套接字(Socket),它是网络通信的端点。
3、传输层的典型代表
-
网络通信的底层逻辑
网络协议栈(尤其是传输层、网络层)是操作系统内核的功能。用户程序不能直接操作内核里的网络功能,必须通过系统调用来访问,这就是 Socket 编程的基础。 -
传输层的两个核心协议
| 协议 | 核心特点 | 通俗理解 |
|---|---|---|
| TCP | 有连接、可靠传输、面向字节流 | 像打电话:必须先接通(建立连接),对话有序、不丢字,双方都知道对方收到了 |
| UDP | 无连接、不可靠传输、面向数据报 | 像发短信:直接发送,不保证对方一定收到,也不保证顺序 |
4、网络字节序
一、什么是大端 / 小端?
这是多字节数据在内存中的两种存储方式:
- 大端(Big-endian):高字节存低地址,低字节存高地址(数据按 “正常阅读顺序” 存)。
- 小端(Little-endian):低字节存低地址,高字节存高地址(数据按 “逆序” 存)。
以 0x1234abcd 为例(4 字节数据):
| 内存地址 | 大端存储 | 小端存储 |
|---|---|---|
| 0x0000 | 0x12 | 0xcd |
| 0x0001 | 0x23 | 0xab |
| 0x0002 | 0xab | 0x34 |
| 0x0003 | 0xcd | 0x12 |
二、网络字节序的规定
TCP/IP 协议规定,网络数据流必须采用大端字节序。
这就意味着:
- 无论主机本身是大端还是小端,发送 / 接收数据时都要遵循网络字节序(大端)。
- 小端主机发送数据前,需要把数据转成大端;接收后再转回来。
5、字节序转换函数
1)IP转换
a)htonl 函数
b)ntohl 函数
2)Port 转换
a)htons 函数
b)ntohs 函数
七、socket 编程
1、socket 接口
1)socket 函数
2)bind 函数
3)listen 函数
4)accept 函数
5)connect 函数
2、sockaddr 结构

一、struct sockaddr:通用地址结构
它是 Socket API 的通用抽象类型,为了兼容不同协议的地址格式(IPv4、IPv6、UNIX 域套接字)。
- 结构组成: 16 位地址类型 + 14 字节地址数据。
- 核心作用: 让系统调用(如
bind/connect)不需要关心具体是哪种协议的地址,只需要根据地址类型字段解析即可。
二、struct sockaddr_in:IPv4 专用地址结构
我们实际写 IPv4 网络程序时,用的是这个结构,使用时强制转换成 struct sockaddr* 传给 API。
- 结构组成:
- sin_family: 地址类型,固定为
AF_INET(表示 IPv4)。 - sin_port: 16 位端口号(网络字节序)。
- sin_addr: 32 位 IP 地址,用
struct in_addr表示。 - sin_zero: 填充字段,保证和
struct sockaddr大小一致。
- sin_family: 地址类型,固定为
三、struct in_addr:IPv4 地址存储结构
- 本质: 就是一个 32 位无符号整数(
uint32_t),专门用来存储 IPv4 的IP地址。 - 说明: 我们熟悉的点分十进制 IP(如1
92.168.1.1),需要转换成网络字节序的 32 位整数后,存入这个结构。
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)