【Linux】网络基础概念 (上)
目录一、网络基础概念1.1 网络发展1.2 初识协议1.3 协议分层1.3.1 OSI七层模型1.3.2 TCP/IP 协议栈1.3 再识协议1.4 协议和操作系统的关系1.5 什么是协议1.6 网络传输基本流程1.6.1 局域网通信封装的过程解包和分用的过程1.6.2 跨网络通信认识 ip 地址Mac vs IP个人主页矢望个人专栏C、Linux系统编程、Linux网络编程、C语言、数据结构、Coze-AI、MySQL一、网络基础概念1.1 网络发展网络的发展本质上是一场关于“连接”的扩张史。它始于1969年美国军方阿帕网ARPANET的四个节点最初只为冷战背景下分散指挥系统的科研通信80年代TCP/IP协议的确立让它像“通用语言”般统一了全球散落的局域网迈出走向公众的第一步。90年代万维网WWW和浏览器的发明则用图文界面拆掉了技术高墙让普通人也能点击冲浪此时网络仍是“信息高速公路”主要传递静态页面和邮件。进入21世纪移动通信与智能手机将网络从桌面解放渗透进生活每个角落催生出社交、电商、短视频等动态交互生态网络变为“生活基础设施”。而如今云计算、物联网和5G/6G正编织起万物智联的网络它不再仅是人与人的连接更是人与物、物与物的智能协同从传递信息转向重塑社会运行方式一个虚拟与现实深度融合的数字文明时代已悄然开启。总结一句话计算机是人的工具人要协同⼯作注定了网络的产生是必然的。1.2 初识协议协议是一种约定例如两个人约定用0表示他不这么认为用1表示他这么认为这样就定好协议了。计算机之间的传输媒介是光信号和电信号。通过 “频率” 和 “强弱” 来表示0和1这样的信息。要想传递各种不同的信息就需要约定好双方的数据格式。想要两台主机相互通信只约定好协议还不够例如定好了协议但是你用频率表示01我用强弱表示01就好比我用中国话你用葡萄牙语一样虽然大家可能遵守⼀套通信规则但是语言不同即便是订好了基本的协议也是无法正常通信的。所以完善的协议需要更多更细致的规定并让参与的人都遵守。因此在国际上就会有很多定制协议的组织或者公司站出来例如IEEE电气电子工程师学会、ISO国际标准化组织、ITU国际电信联盟等等。1.3 协议分层协议本质也是软件在设计上为了更好的进行模块化、解耦合它也是被设计成为了层状结构。任何问题都可以通过添加一层软件层来解决。上图中协议只有两层语言层和通信设备层。分层可以实现解耦合让软件的维护成本更低。当我们的主机A想通过网络向主机B通信的时候会产生很多问题如下图例如你想向某个平台发送消息那么这个消息至少要先到达你家的路由器吧所以就有了问题一如何把数据在两个相邻设备之间进行传递而数据走向目的地的路径不止一条甚至路径繁多如何保证到达目标主机。所以就有了问题二目标主机定位和选择的问题。如果路上经过某个节点的时候这个节点的设备坏了怎么办。所以就有了问题三如果出现数据丢失的情况怎么办解决了这三个问题数据就可以从主机A跨网络到达主机B了。保证数据从主机A跨网络到达主机B是手段想要到达的目的是使用这个数据。所以就有了问题四如何处理这个数据呢解决完这四个问题才能达到网络通信的目的才能解决人的问题个人计算机内部也是网络结构但是它们之间的相互通信为什么不会产生问题呢因为它们之间的距离近彼此之间可以直接相连所以没有这些问题。但是两台主机通过网络通信就会产生这些问题根本原因就是物理距离变远了。这些问题的解决可以通过制定协议解决所以协议本质上是一种解决方案。如上一层协议解决一个问题这样分层就可以解耦合。网卡层解决如何把数据在两个相邻设备之间进行传递的问题互联网层解决目标主机定位和选择的问题传输层解决数据丢失的问题应用层解决处理数据的问题。1.3.1 OSI七层模型如上就是OSI七层参考模型。OSI的七层模型标准定的非常好只不过有些层在其它技术人员实现的时候没办法做进操作系统所以就减成了四层或五层典型的如TCP/IP协议栈。1.3.2 TCP/IP 协议栈TCP/IP五层(或四层)模型常被叫做TCP/IP协议栈。TCP/IP通讯协议采用了五层的层级结构每一层都呼叫它的下一层所提供的网络来完成自己的需求。物理层负责光/电信号的传递方式。比如现在以太网通用的网线双绞线、早期以太网采用的同轴电缆现在主要用于有线电视、光纤现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器Hub工作在物理层。数据链路层负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步就是说从网线上检测到什么信号算作新帧的开始、冲突检测如果检测到冲突就自动重发、数据差错校验等工作。有以太网、令牌环网无线LAN等标准。交换机Switch工作在数据链路层。网络层负责地址管理和路由选择。例如在IP协议中通过IP地址来标识一台主机并通过路由表的方式规划出两台主机之间的数据传输的线路路由。路由器Router工作在网络层。传输层负责两台主机之间的数据传输。如传输控制协议TCP能够确保数据可靠的从源主机发送到目标主机。应用层负责应用程序间沟通如简单电子邮件传输SMTP、文件传输协议FTP、网络远程访问协议Telnet等。我们的网络编程主要就是针对应用层。数据链路层解决如何把数据在两个相邻设备之间进行传递的问题网络层解决目标主机定位和选择的问题传输层解决数据丢失的问题应用层解决处理数据的问题。1.3 再识协议TCP/IP协议的本质是一种解决方案TCP/IP协议能分层前提是因为问题本身能分层。1.4 协议和操作系统的关系操作系统是使用C语言汇编语言写的协议栈的部分是被设计到了操作系统内核中的所以协议栈本身也是C语言写的。因此网络也是操作系统的一部分。如上图网卡就是底层硬件数据链路层在驱动程序中网络层和传输层这两层是被集成在内核中的应用层在操作系统上层由用户实现。传输层最著名的协议是TCP网络层最著名的协议是IP而传输层和网络层这两层是现在内核中所以TCP、IP是核心因此把整个协议整体统称为TCP/IP并不过分。所有的主机上面安装的操作系统可以不同实际情况也是这样但是所有的主机上面的协议栈必须按照标准进行相同的实现这就是为什么不同的系统、主机之间可以相互通信。1.5 什么是协议操作系统可以不同但协议必须相同对于协议的理解我们可以单独抽出一层如上图我们抽出传输层假设在这一层定义一个struct protocol结构体双方约定都定义这样的结构体类型这样传输层传递给另一个主机的时候这个主机就可以分析出里面的数据。所以协议相同也可以理解成代码相同数据类型相同。在内核角度对协议的朴素理解协议的本质就是结构体假如你在快递软件买了一个物品你想要的是一个物品但是你收到的是物品快递单子这个快递单子将来就叫做协议报头。它上面会记录各种信息就像快递单子上一样记录着地址姓名等各种信息。这些信息可以使用结构体存储起来例如struct protocol header {...};所以协议报头本质就是结构体变量将来主机收到的也是协议报头数据也就是报文。下面是Linux内核中的以太网帧报头// include/uapi/linux/if_ether.hstructethhdr{unsignedcharh_dest[ETH_ALEN];// 目标MAC地址6字节unsignedcharh_source[ETH_ALEN];// 源MAC地址6字节__be16 h_proto;// 上层协议类型0x0800IP, 0x0806ARP};关于协议的朴素理解所谓协议就是通信双方都认识的结构化的数据类型。1.6 网络传输基本流程1.6.1 局域网通信以太网和令牌环网就是具体的局域网。两台主机在同一局域网中是可以直接进行通信的。原理类似上课同学们上课都可以听到。每台主机在局域网上要有唯一的标识来保证主机的唯一性mac地址它占48比特位由硬件固定一张网卡一个mac地址。Linux上可以通过ifconfig查询Windows上可以通过ipconfig /all查询。如上图主机A想要给主机E发消息源mac帧是MacA目的mac帧是MacE在这个过程中所在局域网的主机都可以收到这个消息但是这些主机发现目的mac帧和自己的不一样就会将这个消息丢弃掉这个丢弃的过程发生在物理层和数据链路层下两层上层根本感知不到。只有mac帧是MacE的主机可以收到消息并将消息传递给上层。当教室很安静的时候老师说的话都可以听清楚但是当教室很乱的时候自己说的话都可能听不清楚这时候就发生了碰撞。以太网也存在碰撞称为以太网碰撞域。任何主机都能进行碰撞检测原理就像你自己可以听到自己说话但如果你自己听到你的话和你说的不一样时就可以判断发生碰撞了。当主机发现发生碰撞之后就会执行碰撞避免算法也就是主机在接下来的一段时间不发消息。这个时候其它主机就可以趁空发送了。局域网通信就是基于碰撞检测和碰撞避免的不断重试的过程。技术没有好坏之分关键在于如何用上面的原理也可以被用来瘫痪局域网也就是通过某种工具绕过协议栈不停的向局域网中发送垃圾数据时刻产生碰撞让那些主机都执行碰撞避免算法。从系统视角看待上面的碰撞检测、碰撞避免就是为了保证任一时刻局域网只能由一个主机使用也就是局域网就是共享资源、临界资源我们要保证它的原子性。令牌环网也一样它是有一个唯一性的数据叫做令牌只有持有令牌的主机才可以在局域网中发消息没有持有的主机不准发消息这也保证了局域网的原子性。从系统角度来看这是事先加锁保证原子性的机制。我们上面的例子中主机A为什么要给主机E发消息呀是因为用户想要在主机A和主机E之间通信所以如下图用户在上层想要把数据发出去需要贯穿协议栈而其中每层都有协议所以当进行上述传输流程的时候就要进行封装和解包。其中上层传过来的数据叫做有效载荷而本层会在有效载荷前面加上本层的报头。如上图封装的过程就是入栈的过程。而解包的过程就是出栈的过程。所以才把TCP/IP协议叫做协议栈。封装的过程同层之间逻辑上认为它们可以直接通信因为这一层发送的报文与同层收到的相同。明确一下在不同层的报文的叫法数据链路层叫做数据帧网络层叫做数据报传输层叫做数据段应用层叫做请求与应答。协议本质是一个结构体类型所以报头也就是结构体变量每一层都会在报文前添加本层的报头。所以产生的报文需要在内核中找个缓冲区保存起来。以我们之前的图为例演示封装的过程如上图当要封装本层的报头的时候指针就指向报文的前面然后通过sizeof(结构体变量)提前开辟出空间将结构体变量拷贝进去。所以封装报头的本质其实就是在报文头部拷贝结构体变量下图为数据封装的过程解包和分用的过程从接收报文的主机角度来看整个过程是自底向上贯穿协议栈的。在解包和分用的过程中面临的第一个问题就是报头和有效载荷分离的问题。如上图每层之间都提前约定好了协议解包的时候就通过指针加上sizeof(结构体变量)就可以直接分离报头和有效载荷。当然原理很简单现实也面临其它问题。有的协议报头是固定的有的协议报头是可变的所以这时候就需要在结构体中标注清楚那里是报头那里是有效载荷。解决了上面的这个问题就解决了解包的问题。由于协议栈的每一层都有很多的协议通过之前的图片我们也可以看出来尤其是应用层协议非常多。所以在自底向上贯穿协议栈时在本层协议交付给上层时本层协议是如何知道自己应该把有效载荷交付给上层的哪一个协议呢协议内部是会标注自己应该交给上层的哪一个协议的所以问题就解决了至于协议是如何知道自己应该交给谁的这个问题答案是在封装的时候上层的XXX协议就告诉了下层协议它是谁因此下层协议就在封装的时候标记了自己在分用时应该交给上层的哪一个协议。因此这个时候就解决了分用的问题。下面是数据分用的过程。是一棵倒转的多叉树。1.6.2 跨网络通信认识 ip 地址IP协议有两个版本IPv4和IPv6。IP地址是在IP协议中用来标识网络中不同主机的地址。对于IPv4来说IP地址是一个4字节32位的整数。对于IPv6来说IP地址是一个16字节128位的整数。以下默认讲述IPv4。通常也使用 “点分十进制” 的字符串表示IP地址例如192.168.0.1用点分割的每一个数字表示一个字节范围是0 - 255。查询ip地址Linux:ifconfigWindows:ipconfig /all。IP侧重点更多的是标识公网中唯一一台主机。IP能够提供主机定位和路径选择的能力例如通过学生学号找到具体学生。Mac vs IP既然Mac地址能够标识主机的唯一性那为什么还要有IP地址呢西游记大家都看过唐僧一直有一套固定不变的地址源地址东土大唐目的地址西天。除此之外他每经过一个地方都会介绍说上一站地址是哪里这一站地址就到这里了。这也是一套地址不过这套地址一直在变化。在上面的例子中固定不变的地址就是IP地址一直在变化的地址就是Mac地址。IP地址的目的地址西天指引着唐僧规划路线合理的改变Mac地址所以IP地址提供长远目标是路径选择的依据Mac地址是当前或者下一跳的地址解决的是局域网转发的问题。跨网络通信流程图如上图主机A封装的过程和局域网相同不过跨网络通信时就会添加一个路由器角色它处于网络层所以封装好的报文会先进行解包分用到达路由器然后路由器找到目的地址位于的局域网在对报文进行封装交给目标主机网卡。再次封装时报文可能和之前解包的不同。然后到达目标主机后主机B收到的网络层之上的报文和主机A封装的相同。详细流程上层交付下来的数据到达网络层之后网络层通过检查目的IP地址和本局域网的IP就能够知道这个IP是本局域网的还是不是本局域网的。对应报文如果不是本局域网的主机网络层就可以将报文路径选择转发给路由器。网络层具有寻址、路径选择等功能。如上图上层交付的报文到达主机A的网络层后发现报文的目的IP地址不是当前局域网于是在交付给数据链路层后它封装的报头的目的Mac地址变成了路由器的一端的Mac地址macleft这样报文就到达了路由器然后经过路由器的解包、寻址就找到了报文要传递的主机的Mac地址然后路由器就交付给数据链路层由它封装报头报头的目的Mac地址就是macB了这样就在目的局域网中传递给了目标主机。上面就是详细流程此时你就会发现如上图网络层大家收发的都是同一种报文在早期的时候是局域网先出现的这个时候各个国家有自己的标准各自的标准不同虽说都能标识自己的主机但也仅限自己所在局域网内通信但是全球通信是绝对不可能的。也就是说局域网标准并不统一标准不同实现方式也不同。这就阻碍了互联网的发展。但在计算机世界中任何问题都可以通过添加一层软件层来解决所以网络层这一软件层屏蔽了底层硬件的差异让大家都能看到同一种网络IP网络所以**IP网络的意义还有统一互联网的通信标准路由器是实现IP通信的底层的最重要的硬件**Mac地址和硬件强相关所以它不适合用来互联网通信而使用IP地址进行互联网通信本质上也是一种解耦合Mac地址全球唯一这话没错但是Mac地址不适合用来全球通信它很难做到它最大的作用还是在局域网内标识一台主机的唯一性IP地址在整个路由过程中一直不变Mac地址一直在变。目的IP是一种长远目标Mac是下一阶段目标目的IP是路径选择的重要依据mac地址是局域网转发的重要依据。总结以上就是本期博客分享的全部内容啦如果觉得文章还不错的话可以三连支持一下你的支持就是我前进最大的动力技术的探索永无止境! 道阻且长行则将至后续我会给大家带来更多优质博客内容欢迎关注我的CSDN账号我们一同成长(▽)

相关新闻

B2B销售旺季备单策略:基于季度节奏的客户名单储备方法论

B2B销售旺季备单策略:基于季度节奏的客户名单储备方法论

本文从时间节奏、数量规划和质量评估三个维度,系统拆解 B2B 销售旺季前的客户名单储备方法,为一线业务员提供可复用的季度拓客框架。旺季之前多久开始准备?我的节奏是提前三个月B2B 销售的采购决策周期通常在 6 到 14 个月之间,但…

2026/7/15 4:51:55阅读更多 →
C++多线程数据竞争:从检测工具到修复策略的完整指南

C++多线程数据竞争:从检测工具到修复策略的完整指南

1. 项目概述:为什么数据竞争是C多线程的“头号公敌”如果你写过C多线程程序,并且经历过那种程序偶尔崩溃、结果时对时错,但用调试器单步执行时又一切正常的诡异情况,那你大概率是遇到了数据竞争。这玩意儿可以说是并发编程里最狡猾…

2026/7/15 4:51:55阅读更多 →
结构主题模型实战:从数据预处理到结果解读的stm包完整指南

结构主题模型实战:从数据预处理到结果解读的stm包完整指南

1. 结构主题模型(STM)入门指南结构主题模型(Structural Topic Model,简称STM)是传统LDA模型的升级版,它最大的特点是能够将文档的元数据(如作者、发布时间、用户标签等)融入主题建模…

2026/7/15 4:51:55阅读更多 →
解锁unittest:从核心组件到企业级数据驱动实战

解锁unittest:从核心组件到企业级数据驱动实战

1. unittest框架核心组件解析unittest作为Python标准库中的测试框架,已经陪伴开发者走过了十余个年头。我第一次接触unittest是在2013年维护一个Django项目时,当时就被它严谨的结构所吸引。不同于临时编写的测试脚本,unittest提供了一套完整的…

2026/7/15 5:52:04阅读更多 →
C++宏定义完全指南:从常量定义到条件编译与高级元编程

C++宏定义完全指南:从常量定义到条件编译与高级元编程

1. 项目概述:为什么宏定义是C开发者绕不开的坎?刚接触C那会儿,我最怕的就是看到代码里那些大写字母串起来的“魔法符号”,比如#define PI 3.14159或者#define MAX(a, b) ((a) > (b) ? (a) : (b))。当时觉得,有变量…

2026/7/15 5:52:04阅读更多 →
软件设计师——UML建模实战:从下午试题三看核心图例与解题策略

软件设计师——UML建模实战:从下午试题三看核心图例与解题策略

1. UML建模在软件设计师考试中的重要性作为软件设计师考试下午试题三的核心内容,UML建模占据着举足轻重的地位。我参加过多次软考阅卷工作,发现这道15分的大题往往成为考生能否通过考试的关键分水岭。不同于数据流图和数据库设计这类相对固定的题型&…

2026/7/15 5:52:04阅读更多 →
深入解析TI FPD-Link III解串器I2C配置与中断处理实战

深入解析TI FPD-Link III解串器I2C配置与中断处理实战

1. 项目概述与核心价值在汽车ADAS(高级驾驶辅助系统)、环视摄像头以及工业机器视觉领域,高速、可靠且抗干扰的视频数据传输是系统稳定运行的基石。德州仪器(TI)的FPD-Link III技术系列,特别是DS90UB662-Q1这…

2026/7/15 5:52:04阅读更多 →
5.3 电磁屏蔽:如何隔绝财经短视频和股吧的脉冲干扰

5.3 电磁屏蔽:如何隔绝财经短视频和股吧的脉冲干扰

2021年初,一个在美团做后端的朋友给我发来一张截图。是他手机设置的每周屏幕使用时间报告。排名第一的应用不是微信,不是抖音,是一个你肯定猜不到的类别——某券商自带的社区功能,他那一周在上面花了十四个小时。我问他你都看了些…

2026/7/15 5:52:04阅读更多 →
零宽度字符:信息隐藏与数据安全的隐形墨水

零宽度字符:信息隐藏与数据安全的隐形墨水

1. 项目概述:当文本“隐身术”遇上数据安全你可能从未注意过它们,但它们却无处不在,潜藏在你每天阅读的新闻、发送的聊天记录,甚至是你正在看的这段文字里。它们就是零宽度字符——一系列在屏幕上不占据任何视觉空间的特殊Unicode…

2026/7/15 5:47:04阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/14 4:56:14阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/14 2:55:05阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/14 6:17:41阅读更多 →
AI框架决定企业AI能走多远

AI框架决定企业AI能走多远

企业AI建设的第一性原理 企业搞AI,最关键的决定是什么?不是选哪家大模型,不是先做哪个场景,不是招多少AI人才——而是选哪个AI开发框架。 为什么?因为框架决定了企业AI能力的"天花板"。选对了框架&#xff0…

2026/7/15 0:01:30阅读更多 →
Java企业为什么需要AI框架

Java企业为什么需要AI框架

Java企业在AI时代的尴尬处境 Java是全球企业级应用开发的主流语言——全球超过一半的企业系统跑在Java上。但在AI浪潮面前,很多Java企业感到尴尬:大模型的接口是各种语言的,AI开发社区以其他语言为主流,似乎Java在AI时代"掉队…

2026/7/15 0:01:30阅读更多 →
CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

CC3230x嵌入式开发实战:SD主机、定时器与低功耗模式深度解析

1. 项目概述:为什么需要关注CC3230x的SD主机、定时器与低功耗?在物联网和嵌入式设备开发领域,我们常常面临一个核心矛盾:设备需要具备强大的连接能力、可靠的数据存储和实时控制功能,同时又必须严格控制功耗以延长电池…

2026/7/15 0:01:30阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/14 15:07:30阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/14 4:45:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/14 2:42:17阅读更多 →