网卡:初始化,frame组装,网卡处理电信号过程

ip模块中存储的是一堆数字信号,网卡内部会把数字信号转换成电信号或者光信号在网线中传输。

网卡只是一个硬件,需要驱动程序去操作他,计算机中已经把主流网卡的驱动程序(不只是网卡的,还有鼠标,键盘这些硬件都需要驱动程序去操作运行)内置到计算机中了。

网卡的初始化

网卡和其他硬件一样,通上电之后需要完成初始化操作才能正常工作。

网卡mac模块设置mac地址

这些操作包括硬件错误检查、初始设置等步骤,这些步骤对于很多其他硬件也是共通的,但也有一些操作是以太网特有的,那就是在控制以太网收发操作的MAC模块中设置MAC地址。

mac地址会在网卡生产时写入网卡rom中。操作系统完成初始化之后,网卡的驱动程序会去读取网卡的mac地址并保存到自己mac模块中, 当完成这些初始化操作后就可以接受ip模块的委托了

mac模块的mac地址并不一定是网卡rom中的mac,也可以通过命令手动设置网卡mac模块的mac地址

组装控制信息

网卡的mac模块负责两部分:

1.驱动程序初始化时会取出网卡rom的mac地址并设置到mac模块之后填充。mac地址是tcpip模块从mac模块中取出的

2.ip协议通过本地路由表找到发送方的ip地址,并将数据传递给网卡,ip模块发送的数据会保存到网卡的缓冲区中;什么时候读取缓冲区进行数据发送呢? 网卡的mac模块会读取缓冲区数据 并将数字信号转换为通用信号并借助mai模块转换为网卡传输的数据格式并发送到网线中

添加报头起始帧和fcs

网卡会取出缓冲区的数据并切割,为每部分的头部填充包头和起始帧;尾部添加验证是否短缺的尾部(检测错误的帧校验序列)

为什么需要添加报头和起始帧呢?

报头

报头是一段长度为52bit, 01交替出现的数字信号,当用电信号来表示数字信号时,是通过高低电压的方式来判断的。其实他有一个作用是为了观察时钟信号的频率的(为了之后还原 原始数字信号的),之后讲解

起始帧

当56位的报头数据结束后,开始发送起始帧,起始帧末尾的两位都是1也就是末尾有两段是高电压,和之前的电路不同,因此当识别到这个不同的电路时,就知道接下来是真实的数据了,用来表示包起始位置的标记


起始帧后面就是ip模块发送的数据了(从网卡的缓冲区中取数据)

叠加时钟信号识别原始数据

但是真实的情况是并没有图中的那条界限去分割这些电信号(比如出现连续为1或连续为0的情况时接受方不知道该怎么切割信号还原),因此会将数字信号和时钟信号(时钟信号是固定频率固定信号)进行叠加然后发送,接收方只要知道了时钟信号的发送频率然后根据图中右下角的表和最终收到的信号对比就可以还原拿到原始的数字信号。

如何确定时钟信号的频率~报头

时钟信号是以10 Mbit/s或者100 Mbit/s这种固定频率进行变化的, 因此我们不能一开始就发送包的数据,需要观察一段时间时钟信号发送的频率。所以要在包前面加上一段用来测量时钟信号的特殊信号,这就是报头的作用。

「如果在包信号结束之后,继续传输时钟信号,就可以保持时钟同步的状态,下一个包就无需重新进行同步。有些通信方式采用了这样的设计,但以太网的包结束之后时钟信号也跟着结束了,没有通过这种方式来保持时钟同步,因此需要在每个包的前面加上报头,用来进行时钟同步。」


如何保持时钟信号同步_每个包头部都加报头

如果在包信号结束之后,继续传输时钟信号,就可以保持时钟同步的状态,下一个包就无需重新进行同步。有些通信方式采用了这样的设计,但以太网的包结束之后时钟信号也跟着结束了,没有通过这种方式来保持时钟同步,因此需要在每个包的前面加上报头,用来进行时钟同步。

fcs末尾校验序列

fcs用来检查包传输过程中因噪声导致的波形紊乱、数据错误,它是一串32比特的序列,根据包中所有的内容带入一个公式中计算出来的序列。当电信号中有一个比特位发生变化(可能是受到了电磁干扰,附近电信号的干扰)那么计算出来的值就会有变化。当接收方计算出来的fcs和发送方的fcs不一致时,就代表信号受到了干扰。

phy/mau模块发送网卡信号

添加完上面的三个控制信息后,接下来就开始发送包了,发送包的方式有两种:一种是使用集线器的半双工模式,一种是使用交换机的全双工模式。

发送和接收同时并行的方式叫作“全双工”,相对地,某一时刻只能进行发送或接收其中一种操作的叫作“半双工”。

如果是半双工模式,发送数据前需要判断网线中是否还存在其他设备发送的数据,如果有需要等待其他设备信号发送完毕再发送,否则会发生信号碰撞。


发送包是委托网卡中的mac模块进行发送数据,mac模块会从报头起始的地方到包末尾的所有内容都转换任意格式的通用信号,在借助phy模块或者mau模块把通用信号转换成可在网线中传输的格式。 phy模块还会检测网线中是否有信号在传输,只有没有的时候才会发送到网线上。

将数字信息转换为电信号的速率就是网络的传输速率,例如每秒将10 Mbit的数字信息转换为电信号发送出去,则速率就是10 Mbit/s。

根据以太网信号方式的不同,有些地方叫MAU(Medium Attachment Unit,介质连接单元),有些地方叫PHY(Physical Layer Device,物理层装置)。在速率为100 Mbit/s以上的以太网中都叫PHY。

以太网不会确认发送的信号对方有没有收到。根据以太网的规格,两台设备之间的网线不能超过100米,在这个距离内极少会发生错误,万一发生错误,协议栈的TCP也会负责搞定,因此在发送信号时没有必要检查错误。

阻塞信号

但是接收方还是可能会同时收到好几台设备的请求,虽然比万一还小但还是有一定几率发生碰撞,发生碰撞的时候在发送数据就没有意义了,因此会停止发送数据。

并且发送一个信号通知设备不用发信息了,这个信号就是阻塞信号,发送信息的设备会等待一段时间在进行发送,当然等待的时间肯定是不同的,不然还是会发生碰撞,等待的时间是根据MAC地址生成一个随机数计算出来的。

当网络非常阻塞时,可能等待之后还是会发生碰撞,每次发生碰撞都会延长一倍的等待时间进行重试,当重试达到十次时报告网络错误~

对比全双工模式发送信号的时候不需要考虑这么多,只管发送就行~

phy/mau模块接受网卡信号

转换为数字信号验证fcs

之前讲解集线器的时候说过使用集线器发送信号的话 集线器的所有网络设备都会接受到信号

接着phy/mau模块分析报头得知时钟信号的频率,利用时钟信号还原出原始的数字信号,当识别到起始帧时把数据转换成通用信号发送给mac模块(和发送相反 mac转换成通用信号发送给phy

mac模块把通用信号再转换成数字信号放入缓冲区中,到达末尾时将从包开头到结尾的所有比特套用到公式中计算出FCS,然后和包末尾的FCS进行对比,正常情况下两者应该是一致的,如果中途受到噪声干扰而导致波形发生紊乱,则两者的值会产生差异,这时这个包就会被当作错误包而被丢弃。

验证接收方是否为目的地

当fcs一致时,检查包中的接收方mac信息是否和当前设备的mac地址一致,来判断这个包是不是发送给自己的。如果是发送给自己的则会把数据放入网卡的缓冲区中,这时候mac模块就会通知计算机收到了一个包。

有一个特殊的例子,其实我们也可以让网卡不检查包的接收方地址不管是不是自己的包都统统接收下来,这种模式叫作“混杂模式” (Promiscuous Mode)。

发送中断信号处理缓冲区数据

mac模块将数据放入到缓冲区就会通知计算机去处理数据了,通知计算机是通过中断的机制处理的;


回到开始我们利用网卡发送数据的时候,计算机不可能一直等待网卡返回数据再去处理其他事情这样太效率太低了,因此计算机通知网卡发送数据后就去干别的事情去了当网卡的数据回来之后,同样也需要暂停别的事情去处理网卡返回的缓冲区数据,那么计算机怎么知道网卡的数据回来了呢?答案是通过中断

中断机制

中断是有编号的,网卡安装的时候已经在硬件中设置了中断号, 在中断处理程序中将硬件的中断号和相应的驱动程序绑定

中断处理程序绑定中断号并控制网卡读取数据到对应协议栈

网卡插入计算机时,会给分配一个中断号并在中断处理程序中将中断号和对应的网卡驱动绑定。这样当网卡发起中断请时,

通过扩展总线的中断信号线发送信号,信号线通过中断控制器连接在cpu中。收到中断信号时cpu会挂起当前任务,切换到操作系统中的中断处理程序运行

中断处理程序会调用网卡驱动,将网卡缓冲区内的数据取出来,判断mac头部的以太类型填充到对应协议栈的缓冲区中(比如0800是tcpip,则把网卡缓冲区的数据放到tcpip协议栈,如果不存在对应的协议栈则放弃)

现在都是即插即用的中断号设置方式,不需要关心中断号,之前需要手动设置中断号因此出现了很多莫名其妙的问题

网卡不会关心包里的内容,只要按照以太类型将包交给对应的协议栈就可以了。接下来,协议栈会判断这个包应该交给哪个应用程序,并进行相应的处理。

协议栈处理错误

假如以太类型为0800,此时到达了tcp/ip协议栈。ip模块会取出ip头部的ip地址判断是否和本机中网卡的ip地址一致。

ip模块的mac头部用于在以太网中传输,ip头部用于在协议栈验证

如果一致就说明找到正确的目的地了,如果不一致,还需要看接收方操作系统:

客户端(windows,mac)和服务器操作系统不一样,服务器的操作系统如果ip地址不一致可以充当路由器的功能进行转发;而客户端的操作系统如果ip地址不一致是发生了错误,IP模块会通过ICMP消息将错误告知发送方。例如收到不是自己ip的包就会用3,这个表中列出了转发接受过程中遇到的错误

分片重组

网线和集线器中只能传输小包,所以会将一个大包拆分成多个小包,小包也叫分片,每个小包中都有一个分片的id,同一个包的分片具有相同的id。且每个小包的ip头部还有一个分片偏移量(fragment offets)代表当前分片在整个包中的偏移量

ip模块会将这些分片的小包存储到缓冲区中,当所有相同id的小包凑齐后根据偏移量进行拼接还原成大包。

协议栈将数据放入缓冲区,等待应用程序取出

ip模块还原出原始数据后,交给了tcp模块,tcp模块根据ip头部接收方发送方ip地址和tcp头部发送方接收方端口号找到对应的套接字,根据套接字的不同状态进行处理。如果包内容是应用程序放入缓冲区中等待应用程序取出,如果是控制信息类的包比如请求链接断开连接这种生成对应的包返回,然后通知应用程序这些状态即可。

tcp模块和ip模块看成一个整体,tcp模块越权检查ip头部信息,省去了和ip模块交互的逻辑提高效率。

此外,找到套接字需要发送方ip,接收方ip和发送接受方的端口, 之后讲解套接字机制讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/334508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【opencv】python实现人脸检测和识别训练

人脸识别 OpenCV 中的人脸识别通常基于哈尔特征分类器(Haar Cascade Classifier)进行。以下是 OpenCV 人脸识别的基本原理: Haar Cascade Classifier: 特征分类器:Haar 特征是一种基于矩形区域的特征,可以…

2024--Django平台开发-订单项目管理用户认证+动态菜单+权限控制(十三)

day13 订单管理项目开发 1.表结构设计 1.1 abstract类 from django.db import modelsclass ActiveBaseModel(models.Model):active models.SmallIntegerField(verbose_name"状态", default1, choices((1, "激活"), (0, "删除"),))class Meta:…

MyBatis 使用报错: Can‘t generate mapping method with primitive return type

文章目录 前言问题原因解决方案个人简介 前言 今天在新项目中使用 MyBatis 报如下错误:Cant generate mapping method with primitive return type 问题原因 发现是 Mapper 注解引入错误,错误引入 org.mapstruct.Mapper, 实际应该引入 org.apache.ibat…

CodeGeex全能的智能编程助手

大家好我是在看,记录普通人学习探索AI之路。 一、介绍 CodeGeeX,一款由清华大学知识工程实验室研发的基于大型模型的全能智能编程辅助工具,能够实现包括代码生成与补全、自动注释添加、代码翻译以及智能问答等多种功能。经过对包含前后端工…

【代码随想录08】232. 用栈实现队列 225. 用队列实现栈

目录 232. 用栈实现队列题目描述参考代码 225. 用队列实现栈题目描述参考代码 232. 用栈实现队列 题目描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类&#xff1a…

leetcode2312卖木头块

其实不难&#xff0c;主要是你得一眼看出来这个问题缩小规模然后就可以用DP来做了 using ll long long; class Solution { public:long long sellingWood(int m, int n, vector<vector<int>>& prices) {ll f[m10][n10];ll p[m10][n10];memset(p,0,sizeof p)…

JS封装本地缓存的设置,读取,移除,清空方法及使用示例

我封装了一个JS通用的缓存管理对象&#xff0c;可以提供缓存的设置&#xff0c;读取&#xff0c;移除&#xff0c;清空操作&#xff0c;使用也很方便&#xff0c;封装方法的代码在最下方。 Q: 为什么不直接用原生的缓存方法&#xff0c;要封装&#xff1f; A1:原生的缓存管理…

【随机化约束控制 解的概率_2024.01.19】

约束控制 //constraint_mode() constraint c {length inside {[1:32]};} p.c.constraint.mode(0);//0关闭&#xff0c;1打开&#xff0c;默认打开//rand_mode p.length.rand_mode(0);//随机进行关闭 p.length42;//randomiza()with{} assert(c.randmize()with{data<10;});//…

Python中HTTP代理的配置和使用

在Python中&#xff0c;HTTP代理是一种常用的技术&#xff0c;用于控制和修改HTTP请求和响应。通过使用HTTP代理&#xff0c;我们可以更好地控制网络请求的行为&#xff0c;提高安全性、隐私性和效率。下面我们将详细介绍如何在Python中配置和使用HTTP代理。 一、配置HTTP代理…

Linux编写简易shell

思路&#xff1a;​ ​ ​ 所以要写一个shell&#xff0c;需要循环以下过程:​ 获取命令行解析命令行建立一个子进程&#xff08;fork&#xff09;替换子进程&#xff08;execvp&#xff09;父进程等待子进程退出&#xff08;wait&#xff09; 实现代码&#xff1a;​ #inc…

Linux———sort命令总结详解(狠狠爱住)

目录 sort命令&#xff1a; 命令参数及描述&#xff1a; 示例&#xff1a; 使用-b参数&#xff0c;忽略行首空白字符&#xff0c;按照第一列进行排序&#xff1a; -d 选项是 sort 命令中一个非常有用的选项&#xff0c;它可以按照字典顺序进行排序&#xff0c;同时忽略非字…

UI开发布局-HarmonyOS应用UI开发布局

UI页面的构建不用再像Android开发过程中在.xml文件中书写&#xff0c;可直接在页面上使用声明式UI的方式按照布局进行排列&#xff0c;构建应用的页面。 如下代码使用Row、Column构建一个页面布局&#xff0c;在页面布局中添加组件Text、Button&#xff0c;共同构成页面&#…

sd-wan跨境专线ip是固定的吗?

SD-WAN&#xff08;软件定义广域网&#xff09;是一种网络技术&#xff0c;它可以通过集中的管理和控制来提供更好的网络性能和可靠性。跨境专线是指连接不同国家之间的网络连接。 固定IP是指在网络中分配给特定设备的永久性 IP 地址&#xff0c;与动态 IP&#xff08;每次连接…

python tkinter 最简洁的计算器按钮排列

代码如下&#xff0c;只要再加上按键绑定事件函数&#xff0c;计算器既可使用了。 import tkinter as tk from tkinter.ttk import Separator,Buttonif __name__ __main__:Buttons [[%,CE,C,←],[1/x,x,√x,],[7, 8, 9, x],[4, 5, 6, -],[1, 2, 3, ],[, 0, ., ]]root tk.T…

RK3568平台 LT9211转接芯片调试笔记

一.简介 龙讯LT9211是一个高性能转换器&#xff0c;支持MIPI LVDS TTL两两之间转换。 使用此款芯片大部分为MIPI与LVDS进行互相转换。 下图为LT9211的典型应用图&#xff1a; 二.LT9211原理图 三.车载显示器和摄像头系统 四.调试LT9211输出 MIPI数据 &#xff08;1&#xf…

红队打靶练习:NULLBYTE: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 1、dirsearch 2、gobuster WEB web信息收集 图片信息收集 hydra爆破 sql注入 闭合 爆库 爆表 爆列 爆字段 hashcat SSH登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan…

Unity-场景

创建场景 创建新的场景后&#xff1a; 文件 -> 生成设置 -> Build中的场景 -> 将项目中需要使用的场景拖进去 SceneTest public class SceneTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){// 两个类&#xff1a; 场景类、场…

配置zabbix平台对数据库以及主从状态的监控

引言&#xff1a;明人不说暗话&#xff0c;今天分享下配置zabbix平台对数据库以及主从状态的监控 准备好zabbix监控平台&#xff08;zabbix-server端&#xff09;例10.12.153.235 db1客户端&#xff08;zabbix-agent&#xff09;例10.12.153.73 1.安装Zabbix存储库 # rpm -Uv…

策略路由与NQA联动示例

某公司网络使用SwitchA做汇聚层交换机&#xff0c;接入层交换机LSW做用户网关&#xff0c;LSW和SwitchA之间路由可达。汇聚层交换机SwitchA通过两条链路连接到两个核心交换机上&#xff0c;一条是高速链路&#xff0c;网关为10.1.20.1/24&#xff1b;另外一条是低速链路&#x…

算法 动态分析 及Java例题讲解

动态规划 动态规划&#xff08;英语&#xff1a;Dynamic programming&#xff0c;简称 DP&#xff09;&#xff0c;是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的&#xff0c;通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适…