当前位置: 首页 > news >正文

Linux网络相关概念和重要知识(1)(网络协议、网络通信)

目录

1.网络协议

(1)网络的起源

(2)为什么需要协议

(3)协议分层及其设计的解耦

(4)OSI定义的七层网络模型

①分层及其功能

②TCP/IP协议

③传输层协议(TCP和UDP)

2.网络通信

(1)IP、MAC地址

①MAC地址

②IP地址

③通信中MAC地址和IP地址的区别

(2)通信过程

①封装和解包

②IP和MAC在通信过程中的作用

③端口号

④路由和路由器

(3)通信过程中的解耦合设计

①端口号和PID

②网卡发送

(4)网络字节序

(5)以太网和令牌环网的概念


1.网络协议

(1)网络的起源

起初,计算机在一个小范围内通信,即在局域网内通信。但是随着发展计算机有着更大的通信需求,需要通过服务器进行数据共享,于是出现了广域网。总体划分,网络主要分为广域网和局域网(城域网等是后来细化发展出来的)。

人们有通信的需求,相应的,计算机也一定会产生通信的需求。计算机为人服务,而通信就是人很大的需求,因此网络的诞生是必然而不是偶然。

(2)为什么需要协议

不同计算机有着共同的底层,即0和1表示数据,但不同计算机表示0和1的方式不一致(如光电信号的强弱,电信号的有无等),系统的设计也不一样。要让不同底层、系统实现计算机通信,我们要如何抹平硬件的设计差异呢?这就需要若干软件层面的约定,即协议。协议的本质就是一套约定。两台计算机的通信需要约定,就像我们打电话接通后的第一声“喂”就是人们公认的表示接通电话的约定。

实际上,在系统里面,CPU和内存、磁盘之间也存在自己的协议,包括计算机内的硬件、嵌入式设备都有自己的协议,这样才能实现硬件通信。总的来说,协议无处不在,网络协议只是其中一个部分(国际协会做的公认的标准之一)

在网络中,我们希望主机A、C能够通信,但和系统内的进程间通信不同,网络通信的物理距离变长了,通信的特征变化了会带来新的问题,主机A怎么发到路由器呢?怎么找到主机B呢?数据丢失怎么办呢?B怎么知道我的数据应该怎么处理呢?这就需要新的协议。

HTTP、FTP、SSH等都是广为使用的应用层协议

(3)协议分层及其设计的解耦

要实现通信,需要经过多个软件协议,这些协议是分层的,可以说它们相互是解耦合的。协议分层在设计上更模块化,更好维护。在C++中,继承和多态体系下的类的设计就是分层的,父子分层,可以更好维护层状体系。

假设现在有两个用户通信,用户之间遵循的协议是语言层,而通信设备之间遵循的协议是设备通信层。在用户看来,他们是通过语言来通信的,他们也能听懂彼此的话。这反映出通信也是分层的,用户一直认为是在语言层通信,对设备来说一直都在设备通信层通信。平层的协议当然能够互相理解。简单来说,一层协议就是一个结构体,发送端发送该层的一个结构体,接收端当然知道如何处理,因为写这个结构体的人早考虑好了。

同样的,我们可以以分层的视角来看待系统了,它也是各层之间解耦合的,并且进程间通信也是各层之间互相通信实现的。在编程语言中,类与类之间也是分层的,分层后可以通过不同层之间的接口来调用,这样出问题后可以很快排查、定位问题。

(4)OSI定义的七层网络模型

①分层及其功能

虽然有七层,但定标准和实现的是不同人。OSI规定了标准,要求其它公司写系统需要遵循该网络协议,这些公司实现时发现不需要这么复杂,就省去了,但必要的接口都是按照标准来的,因此OSI还是实现了它的目标。

下面是常见的协议分层(5层)

应用层和传输层还存在表示层和会话层,后续用到再说,大部分情况这5层就足够了。

TCP/IP协议

虽然说不同层有不同协议,但TCP和IP是这个网络协议栈的核心,于是OSI定义的这个网络协议就可将其称为TCP/IP协议。

传输层协议(TCP和UDP)

传输层常见的协议有TCP和UDP。

TCP的性质是面向连接、可靠传输、面向字节流。

UDP的性质是不面向连接、不可靠传输、面向数据报。

简单来说,TCP可用于转账、下单等与数据可信度要求高的应用,而UDP用于直播等对小型丢包感知不强的应用。

TCP面向字节流,意思是把数据缓存起来后由用户自己决定如何取出数据,可以一次性读出来,也可以多读几次。而UDP的面向数据报就像寄快递,发的时候就决定了接收数据时一定要全拿走。

2.网络通信

(1)IP、MAC地址

①MAC地址

MAC地址是48bit,共6字节,用16进制 + 冒号表示(如08:00:27:03:89:19)。

Windows在cmd里面用ipconfig /all查看MAC在出厂时就确定了,在Windows里,可能切换网络后MAC会变化。

MAC地址具有唯一性,原则上说MAC地址可以是任何值,只需要在局域网内不冲突就可以了。

MAC地址是在一个局域网里面标识自己的地址。有了MAC地址,就能实现局域网通信。形象来说,老师在班上教训某个同学,在班上的其他同学都能听到内容,但他们不需要做任何处理,这个MAC就是同学的名字。同一局域网内所有主机都能收到消息,只不过MAC不匹配会丢弃消息。一个班上不能出现同名的人,对应MAC地址在局域网内的唯一性。但在不同班里可能有同名的人。

②IP地址

IP地址有IPv4和IPv6,现在IPv6还未完全普及开,所以后续的IP地址默认都是指的IPv4。IPv4是4字节、32bit的数据。.用来隔开4个0-255的数字。

192.168.34.45是字符串风格的IP地址,点分十进制提高了可读性。网络中常用char.char.char.char四字节表示IP(如struct IP里面的成员变量有char p1、p2、p3、p4),这两种表示可以互相转换。

在Linux的eth0可查看自己的IP地址

从局域网通信 -> 跨子网通信,不同实验室实现了不同局域网通信方式。IP的出现使得不同的主机可以相互通信,就算局域网不同,但它们IP之上完全一样,IP是对底层网络屏蔽差异化的解决方案。

③通信中MAC地址和IP地址的区别

在网络通信中,通信的源和目的IP地址是永远不变的,MAC地址在经过一个地方后就会变化类似于旅行,始终存在两条路线,其中长期路线永远不变(对应源IP和目的IP);同时,也有当前的位置和即将前往的目的地,这个一直在变(源MAC地址和目的MAC地址)。

(2)通信过程

①封装和解包

应用层要相互通信,就要先把数据传到物理层(网卡)。经过每层的通信时,数据前面会多封装一个协议报头,类似于快递单和快递盒子 + 数据,每经过一层协议,就会套一层包装。

应用层报头、传输层报头、网络层报头、数据链路层报头。物理层的主要功能是发送数据,它没有严格意义上的报头。报文 = 报头 + 有效载荷,每一层的报文向下传递后其整体又被作为有效载荷处理。

网络层报头包含源IP和目的IP,数据链路层包含当前设备的MAC和下一个设备的MAC

物理层将数据发送后,网卡收到数据后会触发硬件中断,让系统来处理,接收方会像栈一样,一层一层分析报头,一层层解包,去掉该层的报头得到的就是有效载荷。当前层的报头内部必须包含一个字段,记录接下来要将自己的有效载荷交给谁,就像链表的指针一样。

简单来说,每一层得到自己的报文后,都能看懂报头的内容,也知道有效载荷应该交给谁。这些都基于同层协议之间的数据能够理解的基础上,就像人和人的沟通,同层之间肯定没有障碍。

②IP和MAC在通信过程中的作用

在封装过程中,网络层会封装IP(源IP和目的IP),数据链路层会封装MAC帧(源MAC地址和目的MAC地址)。

在通信过程中,主机A可能会经过路由器B(路由指的就是路径选择)才能交到C中。主机A封装时会把目的MAC设置成B的MAC,因此当数据传给B时,B解到数据链路层时发现跟自己的MAC匹配,再解包到网络层。

解包到网络层后就得到了源IP和目的IP,之后路由器会根据源IP和目的IP进行路由,再向下封装,重新封装MAC地址(设置下一个源MAC和目的MAC),继续通过MAC交给另一个子网。如此往复,直到达到目的地址。

整个通信过程中,MAC地址一直在解包和封装,而网络层的IP地址不会变,MAC地址就像脱衣服穿衣服一样,一直根据当前的设备在变化。就像旅游一样,从重庆到海南是源IP和目的IP,而旅行途中要先从贵州开到广西则是源MAC和目的MAC,它们会随着当前位置的改变而改变。

整个过程我们要记住路由器之间的解包是解到网络层停止,不会向上交付,因为目的IP不匹配。

在局域网内,其它主机也会收到消息,但当它们解包到数据链路层时,发现目标MAC不是自己,于是就会直接丢掉数据,应用层根本感知不到自己收到过数据这就是前面提及的教室里面老师和学生通信时其他同学的处理方式。

③端口号

目的IP在网络中标识主机的唯一性。但在整个通信过程中仅有IP是不够的,因为数据借助IP传输到主机只是手段,数据到达主机内部,再交给主机内的进程才是目的。因此,网络通信的本质就是进程间通信IPC。

数据在网络层向上交付给进程需要端口号(port),这是传输层的内容,端口号共2字节16bit(十进制对应0 - 65535)每一个端口号和进程关联,告诉系统这个数据要交给哪个进程来处理。总的来说,IP + 端口号(socket)合起来才标志某一台主机的某一个具体的进程。两个进程通过网络这个公共资源来进行socket通信。

对于端口号的分配来说,0-1023一般被固定了,1023-65535是OS动态分配的端口号,也是客户端程序的端口号

对于服务端和客户端来讲,如果要通信,IP和端口号都是必不可少的,一般来说手机里面下载的软件里面就保存了要访问的服务器的IP和端口号,第一次建立通信时客户端也要发送自己的IP和端口号,这样服务端才知道如何返回响应。

④路由和路由器

两个不同子网通信必须要经过路由器。根据前面的通信过程我们也能发现,路由器是工作在网络层的,路由器在两端主机看来都各自认为路由器在自己的局域网内,实际上,子网是路由器构建的,子网内主机的IP地址都是路由器给的,首次连接后主机也能知道路由器的MAC、IP地址。路由器硬件内部有以太网和令牌环的驱动程序,可以和不同子网通信。同时路由器自己也有IP地址,并且能够进行判断目的IP是不是在同一局域网(同一子网内主机的IP地址基本是一致的),并可以选择下一步转发数据给谁,这个路径的选择过程就叫路由。

(3)通信过程中的解耦合设计

①端口号和PID

为什么要有端口号而不直接用pid?pid是进程管理的范畴,如果网络使用pid,那么网络和进程管理就耦合了。如果系统修改pid,网络管理也要跟着改,这显然不合理。

引入端口号之后,只需要一个软件层(如哈希表)即可实现pid和端口号的转变。一般来说,系统会维护一个65535个元素的哈希表,下标就是端口号。系统将进程PCB的地址存到表中,当接收到端口号时,直接根据报文查哈希表就能找到PCB,进而通信。

②网卡发送

最后利用网卡发送消息,实际上不需要在系统上大动干戈,只需要将file底层指向的方法改成网卡发送的方法,这样系统直接对文件操作,是可以实现对网络进行操作。这就是系统管理和网络管理的解耦合,加入新功能毫不影响原来系统的设计。

有了系统和网络的解耦合,进程间通信可以替换成网络通信,即网络通信实现本地通信,只需用网络的一套规则,将发送方和接收方都设置成自己即可。

(4)网络字节序

小端:低权值放低地址,高权值放高地址

大端:低权值放高地址,高权值放低地址

网络规定所有发送到网络上的数据必须都是大端,对于数据0x11223344,采用大端按照从低地址到高地址发送数据,就会先发送1(高权值),一般来说这里就是报头的位置,因此这种处理易于边读边分析。

OS可能采用不同字节序,但这没有关系,OS根据自己的设计转换即可

(5)以太网和令牌环网的概念

以太网,名字来源于物理学的以太,这算是物理概念的迁移。

令牌环就是谁有令牌环就只能谁说话,令牌就是上锁。

在以太网中同一时间只能存在一份有效报文,这样才能尽量避免光电信号干扰。如果有多个用户之间要通信,就会进行数据的碰撞检测,一般来说系统为了避免碰撞,会选择等一会重发。这个以太网难道不就类似系统中的临界资源吗?碰撞避免难道不就类似加锁吗?并且整个以太网也是一个生产消费模型。

因此一个局域网也是一个碰撞域,主机越少,碰撞的概率就越低;主机越多,网络就可能更差,因为碰撞避免多了,主机休眠时间长了。

相关文章:

Linux网络相关概念和重要知识(1)(网络协议、网络通信)

目录 1.网络协议 (1)网络的起源 (2)为什么需要协议 (3)协议分层及其设计的解耦 (4)OSI定义的七层网络模型 ①分层及其功能 ②TCP/IP协议 ③传输层协议(TCP和UDP&a…...

go前后端开源项目go-admin,本地启动

https://github.com/go-admin-team/go-admin 教程 1.拉取项目 git clone https://github.com/go-admin-team/go-admin.git 2.更新整理依赖 go mod tidy会整理依赖,下载缺少的包,移除不用的,并更新go.sum。 # 更新整理依赖 go mod tidy 3.编…...

爬虫系列之发送请求与响应《一》

一、请求组成 1.1 请求方式:GET和POST请求 GET:从服务器获取,请求参数直接附在URL之后,便于查看和分享,常用于获取数据和查询操作 POST:用于向服务器提交数据,其参数不会显示在URL中,而是包含在…...

【数据挖掘】Matplotlib

Matplotlib 是 Python 最常用的 数据可视化 库之一,在数据挖掘过程中,主要用于 数据探索 (EDA)、趋势分析、模式识别 和 结果展示。 📌 1. Matplotlib 基础 1.1 安装 & 导入 # 如果未安装 Matplotlib,请先安装 # pip instal…...

AtCoder Beginner Contest 001(A - 積雪深差、B - 視程の通報、C - 風力観測、D - 感雨時刻の整理)题目翻译

由于我发现网上很少有人会发很久之前AtCoder Beginner Contes的题,所以我打算从AtCoder Beginner Contest 001开始写。大约两周一更,需要的可以订阅专栏,感谢支持Thanks♪(・ω・)ノ →题目讲解 A - 積雪深差 …...

安全测试之五:SQL Server注入漏洞几个实例

示例 1:在 GET 请求中测试 SQL 注入 最简单且有时最有效的情况是针对登录页面进行测试。当登录页面请求用户输入用户名和密码时,攻击者可以尝试输入以下字符串 “ or 11”(不包含双引号): https://vulnerable.web.ap…...

如何在Github上面上传本地文件夹

前言 直接在GitHub网址上面上传文件夹是不行的,需要一层一层创建然后上传,而且文件的大小也有限制,使用Git进行上传更加方便和实用 1.下载和安装Git Git - Downloads 傻瓜式安装即可 2.获取密钥对 打开自己的Github,创建SSH密钥&…...

多Agent协作智能系统

多Agent协作智能系统商业计划书 ——基于文心大模型的虚拟世界协作解决方案 第一章 执行摘要 1.1 项目背景 技术驱动:文心大模型4.0工具版的推出标志着AI从“问答”向“行动”的跨越,多Agent协作成为复杂任务自动化的核心范式。市场需求:据Global Market Insights报告,20…...

第J1周:ResNet50算法(Tensorflow版)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: TensorFlow (二)具体…...

炸裂函数explode

在 Apache Hive 中,"炸裂函数"通常指的是将复杂数据类型(如数组或映射)拆分成多行的函数。Hive 提供了几个内置函数来实现这种操作,其中最常用的是 explode 函数。 1. explode 函数 explode 函数用于将数组或映射类型…...

计算机视觉(opencv-python)之图像预处理基本操作(待补充)

图像预处理是计算机视觉任务中的关键步骤,它通过对原始图像进行处理,以提高后续图像分析、特征提取和识别的准确性。 示例图片 目录 常见图像处理方法 灰度化处理 法一 法二 说明 切片截取部分图像数据 cv2.cvtColor() 颜色空间转换 cv2.split(…...

数据结构秘籍(四) 堆 (详细包含用途、分类、存储、操作等)

1 引言 什么是堆? 堆是一种满足以下条件的树:(树这一篇可以参考我的文章数据结构秘籍(三)树 (含二叉树的分类、存储和定义)-CSDN博客) 堆中的每一个结点值都大于等于&#xff08…...

前端正则表达式完全指南:从入门到实战

文章目录 第一章:正则表达式基础概念1.1 什么是正则表达式1.2 正则表达式工作原理1.3 基础示例演示 第二章:正则表达式核心语法2.1 元字符大全表2.2 量词系统详解2.3 字符集合与排除 第三章:前端常用正则模式3.1 表单验证类3.1.1 邮箱验证3.1…...

【SRC实战】小游戏漏洞强制挑战

小游戏业务分析: 1、挑战成功加分,失败减分,存在段位机制,段位影响榜单排名 2、随机推荐挑战对象,随着等级升高不再推荐低等级玩家 3、玩家等级需要培养,培养需要道具,道具需要看广告/完成任务/付费 4、…...

细说 Java 集合之 Map

前言:本文基于JDK8 一、HashMap 1.1、hash方法 hash方法是map中的基石,后续很多操作都依赖hash方法; 下面是 jdk 7 中 hash方法,注意hashSeed 这个扰动因子,该值随机,所以同一个 key 每次调用hash方法后…...

【vue-echarts】——05.柱状图

文章目录 一、柱状图基本设置1.实现代码2.结果展示二、柱状图效果实现11.代码实现2.结果展示三、柱状图效果实现21.代码实现2.结果展示一、柱状图基本设置 柱状图:一种图表类型,因为构成是由一根一根类似柱子的数据条组合而成的坐标平面,所以命名为柱状 图。主要是用来反应对…...

【C】链式二叉树算法题1 -- 单值二叉树

leetcode链接https://leetcode.cn/problems/univalued-binary-tree/description/ 1 题目描述 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1&#xff1…...

C++11——智能指针和function库

目录 一、智能指针 1. std::unique_ptr(独占所有权指针) 2. std::shared_ptr(共享所有权指针) 3. std::weak_ptr(弱引用指针) 关键区别总结 最佳实践 基本用法 可封装的对象类型 核心特性 示例代码…...

[操作系统] 文件的软链接和硬链接

文章目录 引言硬链接(Hard Link)什么是硬链接?硬链接的特性硬链接的用途 软链接(Symbolic Link)什么是软链接?软链接的特性软链接的用途 软硬链接对比文件的时间戳实际应用示例使用硬链接节省备份空间用软链…...

RabbitMQ面试题及原理

RabbitMQ使用场景: 异步发送(验证码、短信、邮件…)MYSQL和Redis, ES之间的数据同步分布式事务削峰填谷 1. 消息可靠性(不丢失) 消息丢失场景: RabbitMQ-如何保证消息不丟失? 开启生产者确…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

安卓基础(aar)

重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

LLMs 系列实操科普(1)

写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...

webpack面试题

面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...