Linux网络:基于OS的网络架构
Linux网络:OS视角下的网络架构
- 网络分层模型
- OSI 七层模型
- TCP/IP 五层模型
- 协议
- 操作系统与网络
- 网络相关命令
- ifconfig
- ping
- netstat
本博客将基于操作系统,讲解计算机网络的设计理念,帮助大家理解操作系统与网络之间的关系。
网络分层模型
网络设计之初,国际标准组织就设计了第一套互联网标准,用于规范互联网,并在全世界推行。这套标准叫做OSI,即(Open System Interconnection)开放式系统互连参考模型。
OSI 七层模型
OSI模型如下:
| 分层 | 功能 |
|---|---|
| 应用层 | 提供网络服务给应用程序,处理特定应用的网络协议 |
| 表示层 | 数据表示格式的转换和加密、解密,确保数据格式兼容性 |
| 会话层 | 管理会话(连接)的建立、维护和终止 |
| 传输层 | 管理端到端的数据传输,确保数据完整传输 |
| 网络层 | 负责路径选择和逻辑地址管理,实现跨网络的数据传输 |
| 数据链路层 | 负责节点到节点之间的数据传输和错误检测 |
| 物理层 | 处理物理介质上的比特流传输,将数据转化为电信号或光信号 |
OSI模型通过将网络通信分为七个独立的层,允许每一层专注于特定的功能。这种模块化设计使得开发、测试和维护变得更加容易。每一层可以独立开发、更新或替换,而不影响其他层。
在主流的教材中,把这种模型称为”法律上的标准“,因为其没有被广泛推行。七层模型有点过于冗余了,实际开发中并不实用。其实七层模型的设计理念是非常优秀的,最后使用的虽然是五层模型,但是在编程时,依然使用七层模型的思想!
TCP/IP 五层模型
TCP/IP模型如下:
| 分层 | 功能 |
|---|---|
| 应用层 | 提供应用程序与网络之间的接口,处理特定应用的网络协议 |
| 传输层 | 负责端到端的数据传输和连接管理,确保数据可靠传输 |
| 网络层 | 处理跨网络的数据包传输和路由选择,使用IP协议进行逻辑地址管理 |
| 数据链路层 | 负责节点到节点之间的数据帧传输和错误检测,确保局部网络数据传输可靠 |
| 物理层 | 处理实际的物理介质上的比特流传输,将数据转化为电信号或光信号 |
相比于OSI模型,TCP/IP模型将应用层,表示层,会话层合为了应用层。这是因为在编程中,这三层的功能都由程序员实现,所以最后干脆都合为应用层了。
对于一个基于TCP的网络通信过程,用户首先要建立TCP连接,连接建立成功后就可以收到来自其他主机的数据,此时就要对数据的格式进行处理,比如对数据进行解密,最后将解密的数据进行业务处理。
以上是一个程序员进行网络编程的基本流程,在该流程中,每个步骤都对应一个OSI的分层:
- 会话层:建立
TCP连接 - 表示层:对数据的格式进行处理,比如对数据进行解密
- 应用层:将解密的数据进行业务处理
就是因为这三层的功能都由自己编码完成,所以最后这三层就被合并成了应用层。
协议
在教材中,协议的定义为:
协议是控制两个对等实体进行逻辑通信的规则的集合
协议的目的是为了更加准确高效地在网络传递数据,协议的三要素是:语法,语义,同步。
三要素的含义如下:
语法:规定通信双方交换信息的结构和格式语义:规定通信双方交换信息的含义和目的同步:规定通信双方的时序关系
接下来简单说一个生活中的小案例,帮助理解协议:
在班级中有一群爱打篮球的同学,他们每天最后一节课都要互相问去不去打篮球,决定要不要抢篮球场。但是课堂上是不允许说话的,如果聊天的话会被老师批评。于是同学之间约定,每天最后一节课篮球队长都会敲桌子:
- 如果敲一次桌子:打篮球,下课要去抢篮球场
- 如果敲两次桌子:不打球
- 如果敲三次桌子:踢足球,篮球场已经没有了
队长为了统计有哪些人要参加篮球,于是又约定:等敲完桌子后,谁想参加篮球,就打一个喷嚏,篮球队长就可以更具喷嚏数量来得知篮球的人数。
于是后续每天最后一节课都会发出敲桌子和打喷嚏的声音,因为只有短短几声,老师注意不到,而同学们却都知道了下课要不要打篮球。
这个过程中敲桌子就是一个协议,三要素对应如下:
语法:通过敲桌子,打喷嚏来传输信息,敲桌子有不同敲击次数语义:敲桌子和打喷嚏的含义不同,而不同敲击次数的含义也不同同步:先敲桌子,再打喷嚏,因为喷嚏是敲桌子的响应
你会发现,在规定协议前想去打篮球,要说:“今天下午去篮球场打球,记得抢篮球场”,而现在只需要敲一次桌子。由于协议的存在,大幅度压缩了传递信息的成本,并且老师听不懂敲桌子的含义,所以还有一定的加密效果!
在实际的计算机网络中,两个主机之间的距离可能是几十公里,几百公里,甚至半个地球。传递信息的成本非常高,此时协议的重要性就不言而喻了。
你也许见过很多理论课程中的协议格式,比如说TCP的报头:

但是你多半没有见识过真正的协议,以上图片只是TCP报头的一个图示,而实际上TCP报头的本质就是C/C++中的一个结构体!
在Linux 2.6.10源码中,TCP报头的结构体如下:
struct tcphdr {__u16 source;__u16 dest;__u32 seq;__u32 ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)__u16 res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)__u16 doff:4,res1:4,cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif __u16 window;__u16 check;__u16 urg_ptr;
};
比如source是源地址,dest是目的地址,中间的fin,syn是标志位。此处使用了C语言结构体的位段语法,不了解的自行学习。
那么为什么TCP的报头就是C/C++的结构体?这就和操作系统有关了。
操作系统与网络
我先前在博客[Linux系统:冯诺依曼结构 & OS管理机制]中讲解了操作系统的架构:

这个结构其实和计算机网络有非常大的关系,如下:

其实计算机网络中的每一层都在操作系统中有对应的层次:
| 网络层次 | 系统层次 | 关系 |
|---|---|---|
| 物理层 | 底层硬件 | 物理层基于操作系统的硬件设备网卡 |
| 数据链路层 | 驱动程序 | 数据链路层协议在网卡的驱动程序实现 |
| 网络层 | 操作系统 | IP协议在操作系统内部实现 |
| 运输层 | 操作系统 | TCP / UDP 协议在操作系统内部实现 |
| 应用层 | 用户 | 应用层协议由用户自己实现 |
其实网络也属于操作系统源代码的一部分,而主流操作系统是C语言写的,因此计算机运输层以下的网络协议,都是C语言结构体完成的。
目前主流的Windows,Linux,MacOS系统的核心也是C/C++,对应的网络协议栈也就是C/C++完成。假设现在新出现一个操作系统,是其他语言编写的,那么这个操作系统就无法解析C/C++的结构体,进而导致无法理解协议的内容,最后无法联网!
世界上所有操作系统,想要联网,就必须遵顼
TCP/IP协议栈,进而必须使用C/C++完成网络部分内核
网络相关命令
本博客是Linux的网络入门文章,接下来再简单了解以下Linux中基本的网络命令。
ifconfig
不带任何参数运行 ifconfig 会显示所有活动的网络接口的当前配置,如 IP 地址、子网掩码、广播地址、MTU(最大传输单元)等。通过该指令可以了解当前主机的网络接口相关信息。

ifconfig 输出中,显示了两个网络接口的信息:eth0 和 lo,大多数计算机系统都有多个网络接口。
eth0是一个有线以太网接口,通常用于连接到外部网络lo接口是一个特殊的回环接口,通常被称为本地回环接口,数据包发送到这个接口时会被回送到发送者自身
对于eth0,可以看到:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
eth0: 这是网络接口的名称,通常表示第一个以太网接口。flags=4163<UP,BROADCAST,RUNNING,MULTICAST>: 这些标志表示接口的状态和功能。UP: 接口已启用,处于活动状态。BROADCAST: 接口支持广播功能。RUNNING: 接口正在运行,通常表示接口已连接到网络。MULTICAST: 接口支持多播功能。
mtu 1500: MTU(最大传输单元)是接口可以传输的最大数据包大小,单位是字节。对于以太网,默认通常是 1500 字节。
inet 172.29.202.116 netmask 255.255.240.0 broadcast 172.29.207.255
inet 172.29.202.116: 接口的 IPv4 地址。netmask 255.255.240.0: 子网掩码,用于确定网络地址和主机地址的部分。broadcast 172.29.207.255: 广播地址,数据包发送到这个地址时,将会被发送到同一网络中的所有设备。
inet6 fe80::216:3eff:fe10:ec6d prefixlen 64 scopeid 0x20<link>
inet6 fe80::216:3eff:fe10:ec6d: 这是接口的链路本地 IPv6 地址。fe80::/10是链路本地地址范围。prefixlen 64: 表示子网前缀长度为 64 位。scopeid 0x20<link>: 表示地址的作用域为链路本地(link),即只在本地链路上有效。
ether 00:16:3e:10:ec:6d txqueuelen 1000 (Ethernet)
ether 00:16:3e:10:ec:6d: 这是接口的 MAC 地址,用于在以太网层识别设备。txqueuelen 1000: 这是接口的传输队列长度,通常用于控制传输队列的大小。(Ethernet): 表示接口使用的是以太网协议。
ping
ping 是一个用于测试网络连通性和诊断网络问题的命令行工具。它通过向目标主机发送 ICMP回显请求数据包,并等待接收目标主机返回的回显应答数据包,来判断目标主机是否可达以及网络的延迟情况。
基本语法:
ping [选项] 目标主机
- 目标主机:可以是目标主机的 IP 地址、域名(如
www.example.com)、或者主机名(如localhost)。
尝试ping www.baidu.com:

最后所有报文都收到,说明该主机与baidu之间的连通性是通畅的。
常见选项:
-
-c <次数>:指定发送的请求次数。默认情况下,ping会一直发送请求,直到被用户手动中断(通常使用Ctrl+C)。例如,-c 4会发送 4 个请求。 -
-i <间隔秒数>:指定每个请求之间等待的时间间隔(以秒为单位)。默认是 1 秒。 -
-f:洪水模式(flood ping)。在这种模式下,ping会尽可能快地发送数据包并显示结果。这种模式通常用于压力测试,普通用户不建议使用。 -
-q:安静模式。只显示ping命令的汇总统计信息,而不是每个数据包的应答。
netstat
netstat用于查看网络状态,常用选项如下:
n:显示IP地址而不限制主机名l:列出在监听状态下的服务p:显示建立该连接的程序名t:只显示TCP连接相关的服务u:只显示UDP连接相关的服务a:显示所有服务,如果不带a,则只显示在当前终端启动的服务
常用的组合是:npua和npta:

使用npta,展示的所有进程都是TCP连接,但是由于我们没有root权限,只能看到少量信息,此时可以sudo提权:

此时最右侧的pragma name显示出来了,这些就是使用TCP的服务的名称,比如常见的数据库mysql。
相关文章:
Linux网络:基于OS的网络架构
Linux网络:OS视角下的网络架构 网络分层模型OSI 七层模型TCP/IP 五层模型 协议操作系统与网络网络相关命令ifconfigpingnetstat 本博客将基于操作系统,讲解计算机网络的设计理念,帮助大家理解操作系统与网络之间的关系。 网络分层模型 网络…...
UEC++学习(十六)变量添加中文注释、ui设置中文文本
(一)变量添加中文注释 在C 项目中创建变量,并在蓝图中显示变量的英文名同时附带中文注释,可以使用UPROPERTY 的 ToolTip 元数据属性来实现 UPROPERTY(EditAnywhere, meta (ToolTip "弹夹最大容量"))int32 MagCapacit…...
Redis延迟双删
1、何为延时双删 Redis延迟双删是一种在数据更新操作中确保缓存与数据库数据一致性的策略,通过两次缓存删除操作间隔一段延时来减少数据不一致的问题。 在并发环境下,多个请求同时对同一数据进行读写时,如果没有妥善处理,很容易…...
WO Mic 手机变身免费麦克风
目录 一、主要特点 1.支持多种连接方式 2.应用广泛 3.低延迟 4.简易配置 5.自动连接 6.音频格式 二、软件下载 三、软件安装 四、系统连接 五、测试 直播的时候,上课的时候,会议的时候……突然发现没有麦克风或者电脑麦克风有故障,这可怎么办呢?今天给大家介绍一…...
MQ死信对列
面试题:你们是如何保证消息不丢失的? 1、什么是死信 死信就是消息在特定场景下的一种表现形式,这些场景包括: 1. 消息被拒绝访问,即消费者返回 basicNack 的信号时 或者拒绝basicReject 2. 消费者发生异常࿰…...
springboot乡镇小区管理系统-计算机毕业设计源码73685
摘 要 过去使用手工的管理方式对乡镇小区进行管理,造成了管理繁琐、难以维护等问题,如今使用计算机对停车场停车的各项基本信息进行管理,比起手工管理来说既方便又简单,而且具有易于管理、搜索速度快、存储量大等多个优点。将其使…...
基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
系统程序文件列表 项目功能:客户,技师,车辆信息,财务,客户维修,维修分配,维修订单,保养预约,保养分配,保养订单,维修费用,保养费用 开题报告内容 基于Vue框架的4S店汽车维修保养管理系统 开题报告 一、项目背景与意义 随着汽车产业的迅猛发展,4S店作…...
小米开放式耳机值得买吗?南卡、小米、漫步者一周横评
大家好,最近对开放式耳机比较感兴趣,作为一名数码博主以及多年的耳机发烧友,今天想给大家测评一下开放式耳机,这类耳机目前在数码圈非常火热!很多喜欢运动的小伙伴都选择了这款耳机,搭配运动场景听歌&…...
解决oracel锁表问题;SQL 错误 [54] [61000]: ORA-00054: 资源正忙
问题描述; SQL 错误 [54] [61000]: ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 select session_id from v$locked_object;查看这些 session_id 对应的会话的详细信息,包括用户名、机器名、程序等,9596等是select se…...
Jfinal与hibernate-validator实现后台表单
一. pom.xml配置 jfianl maven项目基础上增加 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-validator.version}</version></dependency><dependency…...
ansible playbook使用jinja2语法渲染inventory下的主机名和IP到/etc/hosts
1. ansible inventory 下面的 hosts内容如下: [all_host] app1 ansible_host10.2.162.147 app2 ansible_host10.2.162.148 app3 ansible_host10.2.162.149 app4 ansible_host10.2.162.150 app5 ansible_host10.2.162.151[nginx] app12. hosts.j2内容如下 127.0.0…...
张飞硬件1~9电阻篇笔记
电阻有标定值和实际值,关于误差的问题: 精密的电流、电压采样可能会用到1%的精度。如果只是做限流用途的话,用5%就足够。 电阻功率:标定值、额定值、瞬态值: 标定值由封装所决定,例如5W额定值由电路中平…...
探索Golang的微观世界:用net/trace包追踪网络操作
标题:探索Golang的微观世界:用net/trace包追踪网络操作 在Go语言的丰富生态系统中,net/trace包是一个强大的工具,它允许开发者深入网络请求的微观世界,洞察每一次数据的流动和操作的执行。本文将详细探讨如何使用net/…...
Unity开发抖音小游戏广告部分接入
Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容,因为要接入广告,所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…...
World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG
World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版,80级,5人副本古达克,科技队伍(BUG队伍) 副本有两个门口 这样看,是不是觉得很怪。是的,和图1刚好相反的。 因此应该翻转180…...
极狐GitLab 密钥推送保护如何保护密钥信息被泄露?
极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...
Qt+TSC打印机调试
前言 最近被TSC打印机整的死去活来,记录一下使用方法。 一、环境 Qt5.15.2 mingw tsc TE244 二、使用步骤 1.引入库 从官网下载windows C SDK,引入库,以下是.pro文件 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4)…...
QT 添加程序图标
1. 使用免费网站将其他图片格式转化成ico格式 Ico转换器 : https://cn.free-converter.com/ico-converter 2.qmake项目添加程序图标 在.pro文件内添加语句,如下图 RC_ICONS favicon.ico2.1 程序图标文件添加到项目目录内 2.2 通过windeployqt xxx.exe构建生成的…...
数据结构与算法 - 贪心算法
一、贪心例子 贪心算法或贪婪算法的核心思想是: 1. 将寻找最优解的问题分为若干个步骤 2. 每一步骤都采用贪心原则,选取当前最优解 3. 因为没有考虑所有可能,局部最优的堆叠不一定让最终解最优 贪心算法是一种在每一步选择中都采取在当前…...
sed 一点点记忆
sed用法实例1(我用的最多,超级无敌的用法) 格式:/ # b 可以换成你想要的字符 sed -i //s/// 文本文件 sed -i ##s### 文本文件 sed -i bbsbbb 文本文件描述 通过正则表达式过滤你想要的行,替换该行的内容 1、s前面用…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
