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

【读书笔记-《网络是怎样连接的》- 5】Chapter2_4-网卡的工作过程

IP模块组装好的数据包,就可以交给网卡进行发送了。本篇就来介绍网卡在发送数据包时的工作过程。
在这里插入图片描述

1 以太网基础

以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,原型如下图所示。这种网络的本质其实是一根网线,通过收发器这种设备将不同网线之间的信号连接起来。
在这里插入图片描述
在这样的网络结构中,一台计算机发送的网络包会到达网络上所有其他的计算机。为了判断网络包是发送给谁的,增加了MAC头部,使用其中的MAC地址来判断网络包发送的目的地。这就是最初的以太网。

后来经过改进,先是有了中继式集线器结构,然后又有了交换式集线器的结构,如下图所示。

在这里插入图片描述

在这里插入图片描述

二者的区别在于中继式集线器结构中,网络包仍然会到达网络中所有的设备,而交换式集线器结构中,网络包只会发送给MAC地址对应的接收方。(中继式集线器简称为集线器,交换式集线器简称为交换机)。经过改进之后,以太网的3个性质仍然保持不变:通过MAC头部中的接收方MAC地址将网络包发送到目的地,通过MAC头部中的发送方MAC地址来识别发送方,通过以太类型识别包的内容。可以认为具备这三个性质的网络就是以太网。

2 网卡工作原理

2.1 网卡构成与初始化

IP模块生成的网络包还只是一串0和1的数字信息,需要通过网卡将数字信号转换为电信号或者光信号才能在网线上进行传输。网卡的主要工作过程如图所示,只代表其基本构成要素,并不代表实际的硬件构成。
在这里插入图片描述

与其他硬件一样,在操作系统启动时,网卡需要先由网卡驱动程序进行初始化后才能进入可以使用的状态。初始化过程包括硬件错误检查、初始设置等步骤,这些与其他硬件设备相同。还有一些以太网设备特有的初始化操作,如控制MAC模块中设置MAC地址。前面已经讲过,网卡的ROM中保存着网卡的MAC地址,将其读出就可以对MAC模块进行设置了。此外还有通过命令行或者配置文件设置网卡MAC地址的方法。真正生效的是网卡驱动程序初始化时在MAC模块中设置的MAC地址,可能与ROM中的MAC地址并不一致。

完成初始化操作后,网卡就可以进行网络包的收发操作了。

2.2 网络包结构

网卡驱动从IP模块接收到网络包之后,将其复制到网卡缓冲区内,然后通知MAC模块进行发送。

MAC模块将数据从缓冲区中取出后,首先会在开头加上报头和起始帧分界符,在末尾加上用于检测错误的FCS(帧校验序列),如下图所示。

在这里插入图片描述
报头是一串0和1交替出现的序列,长度为56比特,用于确定包的读取时机。为了理解报头的作用,先要说明如何通过电信号来读取数据。

用电信号表达数字信息时,需要用电信号的值对应0和1;而通过电信号读取数字信息,则是要从电信号中解析出0和1。为了判断出每个比特的分界线,需要在数据信号之外再发送一组时钟信号。在时钟的上升沿(或下降沿)时从数据信号中读取,根据值对应0或1就可以了。

这样产生了新问题。长距离传输时,网线较长,两根线路的长度会发生差异,数据信号和时钟信号会产生时间差。为了解决这个问题,可以采用将数据信号和时钟信号叠加在一起的方式。采用这种传输方式,我们需要从信号中找出时钟周期,从而提取出信号中的数据。报头的作用就在于此。在发送数据包前先发送一段用于测量时钟信号的特殊信号。

起始帧分界符则是用来表示包起始位置的标记。FCS用来检查包传输过程中可能出现的错误。它是一串32比特的序列,与CRC校验码一样,如果原始数据发生了变化,则FCS的值就会不同,从而可以判断数据发送过程中是否出现了错误。

2.3 网络包的发送

加上报头、起始帧分界符和FCS之后,网络包就可以通过网线发送出去了。有两种方式:使用集线器的半双工模式与使用交换机的全双工模式。全双工模式会在第三章详细介绍,这里来介绍一下半双工模式。

半双工模式中需要避免信号碰撞,因此发送前需要先判断网线中是否有其他设备发送的信号。如果有,则等待该信号传输完毕后再发送。发送过程中,MAC模块将数字信息转换为电信号,再通过称为PHY或者MAU的信号收发模块发送出去。

PHY(MAU)还需要监控接受线路中是否有信号进来。在开始发送前需要先确认没有其他信号进来,才能开始发送。在信号开始发送到发送结束的这段时间内没有信号进来,发送操作就完成了。也有很小的可能会出现多个设备同时发送网络包的情况,这时候就会发生信号碰撞。此时设备会停止发送,还会发送一段时间的阻塞信号,通知其他设备。

等待一段时间后,设备会再次重新发送。但如果所有设备都等待同样的时间,仍然会发生碰撞。因此会根据MAC地址生成一个随机数,等待随机的时间。在网络拥塞的时候,发生碰撞的可能性会提高,这样每次发生碰撞之后,就将等待时间延长一倍,以此类推。多次尝试仍然不行,就上报错误信息。

2.4 接收返回包

接下来来看网络包接收时的操作方式。在半双工模式中,一台设备发送的信号会到达集线器上的所有设备,接收操作的第一步就是将所有信号都接收过来。

接下来的操作与发送步骤相反。先通过报头同步时钟,然后将起始帧分界符后面的信号转换为数字信息。PHY(MAU)模块先将信号转换为通用格式,发送给MAC模块,MAC模块再将信号转换为数字信息,存放在缓冲区中。在存入缓冲区之前,MAC模块会检查FCS,如果FCS有问题,则直接丢弃这个包。如果没有问题,则检查MAC头部中的MAC地址是否与网卡初始化时分配给自己的MAC地址一致,如果不同,也直接丢弃。如果MAC地址一致,才会存入缓冲区中,并通过中断通知操作系统收到网络包。中断程序会调用网卡驱动,从网卡的缓冲区中取出收到的包,并通过MAC头部中的以太类型字段判断协议的类型。根据前一篇的内容,返回0800表示TCP/IP协议栈,于是下面会交给IP模块进行处理。

IP模块先是检查IP头部,格式没有问题则会检查IP头部中的接收方IP。客户端计算机不会进行包转发操作,因此如果IP头部中的接收方IP与自己的IP不一致,一定是发生了错误,IP模块会通过ICMP消息将错误告知发送方。

如果IP正确,则这个包会被接收下来。IP模块还有一项工作,即将分片的包还原成原始的包。关于分片功能,会在第三章详细介绍。分片的包会在IP头部的标志字段中进行标记,同一个包的分片具有相同的ID。此外IP头部的分片偏移量字段则表示了此分片在整个包中所处的位置。根据这些信息,在所有分片收到之后,就可以还原成原始的包了。接下来交给TCP模块进行处理。

3 UDP协议收发操作

前面详细讲解了TCP协议,这里简单介绍一下UDP协议。

TCP设计的复杂,是为了将数据高效且可靠地发送给对方,确保只重发出错或者未收到的包。但在数据很短的情况下,其实不用TCP这样复杂的机制,也可以高效地重发数据。如果只有一个包,发生了错误只要直接重发就好了,不必建立连接与断开连接的控制包。而发送数据后,将对方的回复作为接收确认也就可以了,也不再需要专门的接收确认包了。

这种情况下适用的就是UDP协议。UDP没有TCP的接收确认,窗口等机制,在发送时只需要将数据加上UDP头部,然后交给IP模块发送就可以了。

另一个使用UDP的场景是发送音视频数据的时候。音视频数据需要在确定的时机到达,如果错过了时机,再重发也没有用了。音视频播放过程中出现一些包的丢失可能只是产生一些失真或卡顿,一般也是可以接受的。

到这里第二章协议栈与网卡的部分就整理完毕了。下一章将会继续介绍网络包如何经过集线器、交换机与路由器等设备到达互联网。

相关文章:

【读书笔记-《网络是怎样连接的》- 5】Chapter2_4-网卡的工作过程

IP模块组装好的数据包,就可以交给网卡进行发送了。本篇就来介绍网卡在发送数据包时的工作过程。 1 以太网基础 以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,原型如下图所示。这种网络的本质其实是一根网线,通过…...

qt QOperatingSystemVersion详解

QOperatingSystemVersion 是 Qt 提供的一个类,用于表示和管理操作系统的版本信息。它允许开发者获取操作系统的名称、版本号和平台信息。这个类对于需要根据操作系统版本执行特定操作的应用程序尤其有用。 1. 构造函数 QOperatingSystemVersion(): 默认构造函数&…...

openpnp - 解决“底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题“

文章目录 openpnp - 解决"底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题"概述笔记问题现象1问题现象2原因分析现在底部相机和吸嘴的位置偏差记录修正底部相机位置现在再看看NT1在底部相机中的位置开机归零,看看是否能通过所有校…...

Python字幕滚动:为视频添加专业级动态效果!

Python实现由下向上滚动字幕 在数字媒体和编程领域,动态文本效果总能吸引观众的注意力。其中,滚动字幕是一种常见的视觉效果,经常用于视频、演示文稿和网页中。在Python中,我们可以通过多种方式来实现滚动字幕效果,比…...

Linux 系统中,将网络配置从 DHCP 改为静态 IP的几种方法

Linux 系统中,将网络配置从 DHCP 改为静态 IP 可以通过几种不同的方法来实现,下面是几种常见的方式: 方法一:使用 connman(Connection Manager) 如果你已经在使用 connman 管理网络,可以通过修…...

【jellyfin】解决Edge 浏览器播放 jellyfin 的 hevc/h265 视频“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”错误

文章目录 问题原因分析解决方法 问题 在 windows 系统自带的 Edge 浏览器里网页播放 jellyfin 媒体库里的 hevc/h265 编码的视频时,总是提示 该客户端与媒体不兼容,服务器未发送兼容的媒体格式,无法播放视频。 原因分析 Edge 浏览器默认不…...

企业管理系统设计思路——毕业论文设计

根据企业对人事管理的要求,本系统可以实现以下目标: l 操作简单方便、界面简洁美观。 l 在查看员工信息时,可以对当前员工的家庭情况、培训情况进行添加、修改、删除的操作。 l 方便快捷的全方位数据查询。 l 按照指定的条件对员工进行统…...

Android 默认去掉URL网络校验,设置不进行网络校验

Android 系统连接WIFI显示网络连接受限分析处理_安卓13类原生系统网络受限-CSDN博客 package\modules\NetworkStack\src\com\android\networkstack\util\NetworkStackUtils.java public static final String CAPTIVE_PORTAL_MODE "captive_portal_mode"; //0 不…...

Python | Leetcode Python题解之第515题在每个树行中找最大值

题目: 题解: class Solution:def largestValues(self, root: Optional[TreeNode]) -> List[int]:if root is None:return []ans []q [root]while q:maxVal -inftmp qq []for node in tmp:maxVal max(maxVal, node.val)if node.left:q.append(n…...

Java泛型:类型安全的艺术

Java泛型是JDK 5中引入的一项重要特性,它为Java带来了类型安全的机制,极大地提升了代码的可读性和可维护性。泛型允许程序员在编译时检测非法类型,从而避免了运行时的ClassCastException异常,使得代码更加健壮和可靠。 泛型的基本…...

Redis 淘汰策略 问题

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 淘汰策略 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 淘汰策略 & 总结》(学习总结/最新最准/持续更新)《Redis &a…...

技术成神之路:设计模式(二十二)命令模式

相关文章:技术成神之路:二十三种设计模式(导航页) 介绍 命令模式(Command Pattern)是一种行为设计模式,允许将请求(命令)封装为对象,从而使您可以使用不同的请求、队列或记录请求日…...

facebook账号类型有哪些?

Facebook的主要账号类型 在Facebook上,用户可以基于不同的目的和需求创建不同类型的账号,主要包括以下几类: 1. 个人账号 这是最常见的Facebook账号类型,每个用户都可以创建一个个人账号,分享生活动态、与朋友互动、…...

Flutter鸿蒙next 中如何实现 WebView【跳、显、适、反】等一些基础问题

✅近期推荐:求职神器 https://bbs.csdn.net/topics/619384540 🔥欢迎大家订阅系列专栏:flutter_鸿蒙next 💬淼学派语录:只有不断的否认自己和肯定自己,才能走出弯曲不平的泥泞路,因为平坦的大路…...

机器视觉:9点标定的原理与实现

一、什么是标定 标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素,如下图所示,10mm的距离内有222个像素,那像素坐标和实际的毫米坐标就有个比例关系了。 二、九点标定 9点标…...

《深度学习》 了解YOLO基本知识

目录 一、关于YOLO 1、什么是YOLO 2、经典的检测方法 1)one-stage单阶段检测 模型指标介绍: 2)two-stage多阶段检测 二、关于mAP指标 1、概念 2、IOU 3、关于召回率和准确率 4、示例 5、计算mAP 一、关于YOLO 1、什么是YOLO YOL…...

什么是Kubernetes?K8s基础与工作原理

什么是 Kubernetes(K8s)? Kubernetes,通常简称为 K8s,是一个用于自动化部署、扩展和管理容器化应用程序的开源容器编排平台。它由 Google 于 2014 年开源,后来交由 CNCF(Cloud Native Computin…...

HTML5新增属性

1、HTML5 1.1 新增布局标签 header:用于定义文档或者section的页眉;footer:用于定义页面或section的底部信息;nav:用于定位页面上的导航链接部分;article:用于定位文档或者页面中的独立部分&a…...

软件开发术语(E开头)---持续更新

e—business 电子商务EAI (enterprise application integration)企业应用程序集成(整合)EBCO (empty base class optimization) 空基类优化(机制)Edge and Vertex Connectivity 割边/割点 Edge Coloring 边染色 EDI (Dlectronic Data Interchange)电子数据交换effic…...

多机器人编队避障算法(1)

文章目录 前言一、基于感知的避障1.基于感知的Epuck2避障思路(理论)2.基于感知的Epuck2避障实现(现实)3.距离传感器结合红外传感器修复避障Bug4.问题5.代码逻辑图 二、基于人工势场力的避障1.基于人工势场的Epuck2避障思路(理论)2.基于人工势场力的Epuck2避障实现(现实) 三、两…...

【网站项目】SpringBoot401超市收银系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…...

KD树详解:多维数据高效搜索的利器

摘要 在处理多维数据时,如何高效地进行搜索与查询成为一个关键问题。KD树(K-Dimensional Tree)作为一种高效的多维数据结构,广泛应用于计算机视觉、机器人导航、数据库检索等领域。本文将详细介绍KD树的基本概念、结构、构建算法…...

从裸机到70B大模型2:基础设施设置与脚本

从裸机到70B大模型2:基础设施设置与脚本 随着深度学习技术的不断发展,神经网络模型的规模逐渐扩大,从单个模型到大型70B模型,所需的计算资源和存储空间也在不断增加。为了训练这些大型模型,我们需要一套高效的基础设施…...

shodan4,挂黑网站查找,弱口令网站搜索

myip参数 shodan myip(查看自己的出口IP,哪个地址链接的公网)挂黑网站查找 我们今天看一看找一下,有些已经被黑的网站好吧,就是利用shodan查看一下哪些网站已经被黑了。 shodan search -limit 10 -fields ip_str,port http.title:hacked b…...

spring boot 整合Knife4j

项目依赖配置 在本项目中,我们使用了以下关键依赖,以支持 Spring Boot 和 API 文档生成。 1. Spring Boot 版本 为了构建一个可靠和高效的 Spring Boot 应用程序,我们使用以下父级依赖: <parent><groupId>org.springframework.boot</groupId><art…...

攻防世界的新手web题解

攻防世界引导模式 1、disabled_button 好&#xff0c;给了一个按钮&#xff0c;第一道题目就不会做 看的wp<input disabled class"btn btn-default" style"height:50px;width:200px;" type"submit" value"flag" name"auth&q…...

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上&#xff0c;华为原生鸿蒙 HarmonyOS NEXT&#xff08;5.0&#xff09;正式发布。 华为官方透露&#xff0c;截至目前&#xff0c;鸿蒙操作系统在中国市场份额占据 Top2 的领先地位&#xff0c;拥有超过 1.1 亿 的代码行和 6…...

pytest 单元框架里,前置条件

1.使用 setup 函数级的&#xff08;setup_function、teardown_function&#xff09;只对函数用例生效&#xff0c;而且不在类中使用类级的&#xff08;setup_class、teardown_class&#xff09;在类中使用&#xff0c;类执行之前运行一次&#xff0c;类执行之后运行一次 类中方…...

数字IC后端实现 | Innovus各个阶段常用命令汇总

应各位读者要求&#xff0c;小编最近按照Innovus流程顺序整理出数字IC后端项目中常用的命令汇总。限于篇幅&#xff0c;这次只更新到powerplan阶段。有了这份Innovus常用命令汇总&#xff0c;学习数字IC后端从此不再迷路&#xff01;如果大家觉得这个专题还不错&#xff0c;想继…...

MySQL全文索引检索中文

MySQL全文索引检索中文 5.7.6版本不支持中文检索&#xff0c;需要手动修改配置 ft_min_word_len 1 &#xff0c;因为默认配置 4 SHOW VARIABLES LIKE ft%; show VARIABLES like ngram_token_size;配置 修改 MySQL 配置文件 vim /etc/my.cnf在配置的 [mysqld] 下面添加**ft_…...

网站开发专业公司有哪些/营销策划运营培训机构

一、数据库连接池 在程序启动时建立足够的数据库连接放置在内存中&#xff08;List&#xff09;&#xff0c;这些连接组成连接池由程序动态的对池中的连接进行申请&#xff0c;使用&#xff0c;释放。 优势&#xff1a;资源重用&#xff1b;由于数据库连接得以重用&#xff0c;…...

wordpress模板 企业/sem竞价培训

小程序之修改轮播图的小点样式 1、单独写一个小点的元素。 <view classswiper-box><swiper indicator-dots"{{indicatorDots}}" autoplay"{{autoplay}}" interval"{{interval}}" duration"{{duration}}" bindchange"swi…...

惠州网站设计培训/网址收录查询

1、多态定义多态指的是一类事物的多种形态比如动物有多种形态&#xff1a;人&#xff0c;狗&#xff0c;猪importabcclass Animal(metaclassabc.ABCMeta):abc.abstractmethoddeftalk(self):passclassPeople(Animal):deftalk(self):print(say people)classDog(Animal):deftalk(s…...

做外贸哪些网站可以发免费信息/百度文库个人登录

set 不允许重复 无序 hashset->hashmap LinkedHashSet—LinkedHashMap TreeSet----TreeMap实现了SortedSet接口 return map.put(e, PRESENT)null; //PRESENT始终是一个new object 将元素作为key存储&#xff0c;这也是为什么Set元素无序&#xff0c;不重复&#xff0c;不为n…...

普通展示型网站/淘宝代运营公司

在Linux环境下&#xff0c;串口名从ttyS0开始依次是ttyS1、ttyS2等。在本程序中&#xff0c;使用ttyS0作为通信串口。在打开ttyS0的时候&#xff0c;选项 O_NOCTTY 表示不能把本串口当成控制终端&#xff0c;否则用户的键盘输入信息将影响程序的执行&#xff1b; O_NDELAY表示打…...

做电商网站搭建就业岗位/电商运营培训机构哪家好

转自&#xff1a;http://geeklu.com/2013/03/core-text/ 本文所涉及的代码你可以在这里下载到 https://github.com/kejinlu/CTTest&#xff0c;包含两个项目&#xff0c;一个Mac的NSTextView的测试项目&#xff0c;一个iOS的Core Text的测试项目NSTextView和Attribued String…...